🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
VBA

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

Q&A

解決済

2回答

1063閲覧

Windows版 Excel VBA でHTMLの変化に対応

masakado

総合スコア6

VBA

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

0グッド

0クリップ

投稿2019/09/16 12:33

編集2019/09/17 01:21

前提・実現したいこと

クローリング後、HTMLが数秒後に変化するので、
Loop、Ifなどで、ページをリロード後、
変化後のHTMLをsubmitでクローリングしたい!

該当のソースコード

HTML

1<tr align="center"> 2<td bgcolor="#FFFFFF"><font size="-1">通常購入</font></td> 3<td bgcolor="#FFFFFF"><font size="-1">28048131</font></td> 4<td bgcolor="#FFFFFF"><font size="-1">2019-09-16 20:20:48</font></td> 5<td bgcolor="#FFFFFF"><font size="-1">全て</font></td> 6<td bgcolor="#FFFFFF"><font size="-1">B2csv</font></td> 7<td bgcolor="#FFFFFF" align="right"><font size="-1">-</font></td> 8<td bgcolor="#FFFFFF"><font size="-1"> 9 102019/09/16&#65374;2019/09/16 11 12</font></td> 13 14<td bgcolor="#FFFFFF"><font size="-1">処理中</font></td><!-- ←ここが↓数秒後 --> 15 16</tr> 17 18<tr align="center"> 19<td bgcolor="#FFFFFF"><font size="-1">通常購入</font></td> 20<td bgcolor="#FFFFFF"><font size="-1">28047783</font></td> 21<td bgcolor="#FFFFFF"><font size="-1">2019-09-16 18:47:09</font></td> 22<td bgcolor="#FFFFFF"><font size="-1">発送待ち</font></td> 23<td bgcolor="#FFFFFF"><font size="-1">発送完了報告用</font></td> 24<td bgcolor="#FFFFFF" align="right"><font size="-1">34件</font></td> 25<td bgcolor="#FFFFFF"><font size="-1"> 26 272019/09/10&#65374;2019/09/16 28 29</font></td> 30 31<!-------------------------- この用に変化する為!! ---------------------------> 32<form id="command" action="/×××/mall/csvdl/CD03_02_001" method="post"> 33<td bgcolor="#FFFFFF"> 34<input type="submit" value="ダウンロード">  35<input type="hidden" name="_csrf" value="c4125cb21c34e1af5b20c67b2e240b69"> 36<input type="hidden" name="logId" value="28047783"> 37</td> 38</form> 39 40<!-------------------------△ この用に変化する為!! △---------------------------> 41 42</tr> 43 44<form id="command" action="/×××/mall/csvdl/CD03_02_001" method="post"> 45<td bgcolor="#FFFFFF"> 46<input type="submit" value="ダウンロード">  47<input type="hidden" name="_csrf" value="c4125cb21c34e1af5b20c67b2e240b69"> 48<input type="hidden" name="logId" value="28047783"> 49</td> 50</form> 51 52 53 54</tr> 55 56<tr align="center"> 57<td bgcolor="#FFFFFF"><font size="-1">通常購入</font></td> 58<td bgcolor="#FFFFFF"><font size="-1">28047783</font></td> 59<td bgcolor="#FFFFFF"><font size="-1">2019-09-16 18:47:09</font></td> 60<td bgcolor="#FFFFFF"><font size="-1">発送待ち</font></td> 61<td bgcolor="#FFFFFF"><font size="-1">発送完了報告用</font></td> 62<td bgcolor="#FFFFFF" align="right"><font size="-1">34件</font></td> 63<td bgcolor="#FFFFFF"><font size="-1"> 64 652019/09/10&#65374;2019/09/16 66 67</font></td> 68

vba

1 Dim cboObj3 As HTMLSelectElement 2 Set cboObj3 = ie.document.getElementsByName("templateId")(0) 3 'セレクトボックスを発送報告完了用に変更します 4 cboObj3.Value = "-2" 5 6 For Each objTag In ie.document.getElementsByTagName("input") 7 If InStr(objTag.outerHTML, "&nbsp;&nbsp;データを作成する&nbsp;&nbsp;") > 0 Then 8 9 '発送報告完了用buttonボタンクリック 10 objTag.Click 11 Exit For 12 End If 13 Next 14 Sleep 10000 '10秒間とめる処理 15 16 Dim objLink As Object 17 18 'アンカータグの表示内容が「ダウンロード利用履歴へ」 19 For Each objLink In ie.document.getElementsByTagName("a") 20 If objLink.innerText = "ダウンロード利用履歴へ" Then 21 objLink.Click 22 Exit For 23 End If 24 Next 25------------------------------------------------------------------------------ 26 27 ここに新しいコードを追加したいが、HTMLタグtd"処理中"の取得がよく分からない為、 28 現在は↑でSleep 10000 '10秒間とめる処理をしていますが、 29 HTMLが変化するスピードは、データ量とサーバー状態によって変わる 30 31------------------------------------------------------------------------------ 32 33 34 'IEのページ読み込みが完了することを待つ処理 35 Do While ie.Busy = True Or ie.readyState < READYSTATE_COMPLETE 36 DoEvents 37 Loop 38 '------------------------------------------------------------------------------ 39 ie.document.forms(2).submit 40 41

補足情報(Excel VBA ieでのクローリング)

上記のコードで、HTML上ではプログラムで

<td bgcolor="#FFFFFF"><font size="-1">処理中</font></td>が <input type="submit" value="ダウンロード"> の様に数秒後変化いたします。 (データ量とサーバーの状態により時間は変化します。)

現在VBAでは、Sleepで10秒待つようにしていますが、

'アンカータグの表示内容が「ダウンロード利用履歴へ」後、
(objLink.Click後が、HTMLコードのページになります。)

ページ上の「処理中」であれば、2秒待って、
Refreshでページの更新を行い、
<input type="submit" value="ダウンロード">に変更になるまで
Loopを回して、変更後、一番最後の

ie.document.forms(2).submit へ

進みたいと考えております。

ifとLoopを使えば問題ないと認識しておりますが、
tdタグから処理中を指定する方法などが、
よく分かりません。

VBA初心者なもので、出来るだけ分かり易いコードを
ご教授いただければ幸いです。

よろしくお願いいたします。m(_ _)m

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

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

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

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

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

meg_

2019/09/16 12:40

ソースコードは「コードの挿入」で記入してください。
masakado

2019/09/16 12:50

すみません!記載方法をよく理解しておりません。
hatena19

2019/09/16 14:36

コード部分を選択してから、入力エリア上部のツールバーの <code> ボタンをクリックしてください。
guest

回答2

0

自己解決

下記コードを挿入することで解決いたしました。m(_ _)m

vba

1 2 Do Until ie.document.getElementsByTagName("font")(36).innerHTML = "通常購入" 3 If (ie.document.getElementsByTagName("font")(36).innerHTML = "処理中") Then 4 ie.Refresh 5 Sleep 1000 6 End If 7 Loop

投稿2019/09/17 05:33

masakado

総合スコア6

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

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

0

数秒待つと、下記のフォームが出現するということでしょうか。

html

1<form id="command" action="/×××/mall/csvdl/CD03_02_001" method="post"> 2<td bgcolor="#FFFFFF"> 3<input type="submit" value="ダウンロード">  4<input type="hidden" name="_csrf" value="c4125cb21c34e1af5b20c67b2e240b69"> 5<input type="hidden" name="logId" value="28047783"> 6</td> 7</form>

だとしたら、id="command" の要素の取得を試みて、エラーなく取得できるまで繰り返し処理をすればどうでしょうか。

vba

1 Dim formCommand As HTMLSelectElement 2 Dim GetElement As Boolean 3 Dim i As Long 4 On Error Resume Next 5 For i = 1 To 50 '50回トライ(10秒間) 6 DoEvents: Sleep 200 7 Set formCommand = ie.document.getElementById("command") 8 If Err = 0 Then 9 GetElement = True 10 Exit For 11 End If 12 Err.Clear 13 DoEvents 14 Next 15 On Error GoTo 0 16 If Not GetElement Then 17 Msgbox "フォームの取得に失敗しました。" 18 Exit Sub 19 End If

Do...Loopで出現するまで繰り返すと、もし出現しない場合は無限ループになるので、
Forでトライ回数を設定してます。トライ回数は状況に応じて適宜変更してください。

投稿2019/09/16 15:03

hatena19

総合スコア34073

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

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

masakado

2019/09/17 01:31

ご回答ありがとうございます。m(_ _)m しかしながら、移動したページには、すでに複数のid="command"を持つHTMLが存在しており、 変化する前のHTMLでは、 <td bgcolor="#FFFFFF"><font size="-1">処理中</font></td> この値を取得してリロードする必要がございます。 変化後は、 ie.document.forms(2).submitで指定しております。 ご教授いただければ幸いです。 また、ソースコードも分かりやすいよう追記してございます。m(_ _)m
hatena19

2019/09/17 01:38

質問からは、変化する前と変化した後の違いが読みづらかったので、適当に推測して回答しましたが、 考え方は、変化後に出現する要素、あるいは変化するものを調べて、判断するということです。 「処理中」というテキストが変化するなら、それをループで取得して変化していたら、次の処理に進むというように書き換えてください。
masakado

2019/09/17 01:45

ありがとうございます。 変化前の「処理中」の要素を取得したいのですが、その方法が色々調べてみましたが分かりません。 ご教授いただければ幸いです。m(_ _)m
masakado

2019/09/17 01:52

ありがとうございます。試してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問