質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

1回答

258閲覧

VBAでのIE操作のプルダウンやTDタグについて

NP3228

総合スコア22

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2019/03/08 14:35

VBAでIEを操作してます。
ASPのサイト(?)のあるページに、人の名前が書いてあるプルダウンメニューがあり、選択するとページ内の表が、対象者の表に変わるといったページです。

シートに対象者を書き出し、対象者の表を取り出すコードを書いていたのですが、プルダウンメニューや表のところでおかしな挙動がみられました。

②でエラー70「書き込みできません。」が出て、何もせず、もう一度実行させると普通に動き出しました。
そしてそのあとにあるプルダウンメニューの中を全て書き出す際に、初めから書かずに、途中から書き出しました。しかも毎回違う人から書き出しました。ブレイクポイントを設けて、書き出した後に止めて、カーソルを戻し、もう一度書き出すところから実行させると、今度は狙い通りに初めから書き出し始めてくれます。

さらにそもそも②の箇所にいく前に、①の後の2文を書いて置かないと、kのカウントが125でFOR文を抜け出てしまうというバグがありました。(kが130のときもありました)

動きが非常に不安定で、どうにかならないでしょうか?

VBA

1Sub IE() 2 3 Dim lst() As String'対象者 4 Dim num() As Integer'対象者のプルダウンのIndex 5 Dim RE As Integer'対象者の数 6 'i=行用、j=列用、k=HTML用、l=lst用 7 Dim i As Integer 8 Dim j As Integer 9 Dim k As Integer 10 Dim l As Integer 11 Dim nlst(500) As Integer 12 13 '対象者の読み込み 14 Worksheets("list").Select 15 i = 0 16 17 RE = Cells(Rows.Count, 2).End(xlUp).Row - 1 18 ReDim lst(RE) 19 ReDim num(RE) 20 21 Do While Cells(i + 2, 1) <> "" 22 lst(i) = Cells(i + 2, 1) 23 i = i + 1 24 Loop 25 26 27 'IEの起動 28 Set objIE = CreateObject("InternetExplorer.Application") 29 objIE.Visible = True 30 objIE.navigate "http://www.*********************" 31 32 Call IEwait(objIE) 33 34 'ログインして、指定のページまで進む 35 Set Doc = objIE.document 36 Doc.getElementsByName("ID")(0).Value = "*******" 37 Doc.getElementsByName("Pass")(0).Value = "******" 38 Doc.getElementsByName("Login")(0).Click 39 Call IEwait(objIE) 40 Doc.getElementById("Site").Click 41 Call IEwait(objIE) 42 Doc.getElementById("Situation").Click 43 '指定のページに到着 44 45 'プルダウンから全てのOPTIONを書き出す 46 '一度↓を挟まないとh=125でForを抜けてしまうーーーーーーーーーーーーーーー① 47 For k = 0 To Doc.all.Length - 1 48 Next k 49 50 51 i = 1 52 For k = 0 To Doc.all.Length - 1 53 If Doc.all(k).tagName = "OPTION" Then 'ここでエラー70が出るーーーーーーーーー② 54 Cells(i, 4) = Doc.all(k).innerText 55 i = i + 1 56 End If 57 Next k 58 59 '書き出したものから対象者のindexを調べる 60 i = 1 61 For l = 0 To RE 62 For i = 1 To Cells(Rows.Count, 4).End(xlUp).Row - 1 63 If Cells(i, 4) = lst(l) Then 64 num(l) = i 65 Exit For 66 End If 67 Next i 68 Next l 69 70  71 Application.DisplayAlerts = False 72 Worksheets("result").Delete 73 Application.DisplayAlerts = True 74 Worksheets.Add after:=Worksheets("list") 75 ActiveSheet.Name = "result" 76 77 '対象者の表をresultのシートに書き出していく 78 i = 1 79 For l = 0 To RE 80 Doc.getElementById("Manager").selectedIndex = num(l) 81 Cells(i, 1) = lst(l) 82 i = i + 1 83 '一度↓を挟まないとh=125でForを抜けてしまうーーーーーーーーーーーーー① 84 For k = 0 To Doc.all.Length - 1 85 Next k 86 87 '表の取得、書き出し 88 For k = 0 To Doc.all.Length - 1 89 If Doc.all(k).tagName = "TD" Then 90 Cells(i, 1) = Doc.all(k).innerText 91 k = k - 1 92 For j = 2 To 7 93 Cells(i, j) = Doc.all(k + j).innerText 94 Next j 95 i = i + 1 96 k = k + j + 1 97 End If 98 Next k 99 Next l 100 101 102End Function

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

seastar3

2019/03/09 09:22

ExcelのVBAでしょうから、Excelのタグを入れましょう。
guest

回答1

0

ベストアンサー

Webページの読み込み完了を確認する手順が必要なのでしょう。

「画面遷移待ち受けの必要性」の記事のように、
objIE.Busyがtrueの間は、タグの取得を始めないようにすれば、先頭から取得できるでしょう。

投稿2019/03/09 09:22

seastar3

総合スコア2285

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問