※いつもの、脳内垂れ流し動画です。
【IE操作 VBA】データ取得の基本?.InnerTEXT.OuterHTML For Each で回す【三流君】 - YouTube
www.youtube.com
※質問・ソースとあわせてみてください。
テストで、
http://ie.vba-ken3.jp/test/20160706/test20160706.html
に↑テスト用ページを作成しました、
下記の質問をいただきました。
web上のテーブルデーターからExcelで計算可能なもののみを抜き出し
たいのですが、できません。関数あるいはステートメント等で抜き出せる方法
がありませんでしょうか?抜き出したい値は「135」と「7.1」です。内
容を下記に示します
webソース内容
<tr>
<td width="65" align="center" bgcolor="#ffffff"><img src="../img/1.gif" width="20" height="20" /><img src="../img/3.gif" width="20" height="20" /><img src="../img/5.gif" width="20" height="20" /> </td>
<td align="right" bgcolor="#ffffff"><strong><font size="3" face="Arial, Helvetica, sans-serif"> 7.1 </font></strong></td>
</tr>
webのテーブル表示内容(一行目のみ表記)
135 7.1
マクロコード内容
Debug.Print "i= "&i
Debug.Print objIE.document.all.tags("img")(i).outerHTML
イミディエイト表示内容(一部のみ表記)
i = 2
<img width="20" height="20" src="../img/1.gif">
i = 3
<img width="20" height="20" src="../img/3.gif">
i = 4
<img width="20" height="20" src="../img/5.gif">
以上なのですが,上記ですとタグ及び属性等を除く数値「1」「3」「5」を
抜き出したいのですが無理でしょうか?
画像で数値を表示している Webページからデータを取りたい感じでした。
テストで、
http://ie.vba-ken3.jp/test/20160706/test20160706.html
に↑テスト用ページを作成しました、
復習もかねて、処理してみたいと思います。
HTML文章はタグで囲まれた文章なので、
タグから攻めていく
HTML文章 ドキュメントから指定したタグのデータを抜く
オブジェクト = document.getElementsByTagName("タグの名前")
上記のような方法があります
(NameやIDから探る方法は後日・・・)
.getElementsByTagNameで抜き出したデータを使用する
まぁ表示されている文章なのでテキストを.innerTEXTで抜いたり
HTMLを判断したいときは、.OuterHTMLでHTMLから判断したり
1.タグを指定して取り出してみた。
.getElementsByTagNameの取り出しと、.Lengthで数がわかり、
.innerTEXT .OuterHTMLの説明
Sub ie_test20160706_getElementsByTagName() 'IEテストする。 'IEの起動 Dim objIE As InternetExplorer '変数を定義します。 Set objIE = CreateObject("InternetExplorer.Application") 'オブジェ クトを作成します。 objIE.Visible = True '可視、Trueで見えるようにします。 objIE.Top = 0 objIE.Left = 0 '処理したいページを表示します。 objIE.Navigate "http://ie.vba- ken3.jp/test/20160706/test20160706.html" 'ページの表示完了を待ちます。 While objIE.ReadyState <> 4 Or objIE.Busy = True '.ReadyState <> 4 の間まわる。 DoEvents '重いので嫌いな人居るけど。 Wend 'エレメントを集め、データを代入 テスト 'ドキュメント代入 Dim objDOC As HTMLDocument Set objDOC = objIE.document '指定したタグ、エレメントを集める Dim objELEs As IHTMLElementCollection 'DispHTMLElementCollection? Set objELEs = objDOC.getElementsByTagName("P") '指定したタグを抜き 出す '集めたタグ、エレメントに対して処理を行う Dim n As Integer 'カウンター '集めた要素の数が知りたいので、.Length Debug.Print ".Length = " & objELEs.Length For n = 0 To objELEs.Length - 1 'テストでInnerTEXTとOutherHTMLをデバックへ Debug.Print n & "番目" Debug.Print ".innerText で テキスト取得・表示" Debug.Print objELEs.Item(n).innerText 'Item n番目でアクセス Debug.Print ".outerHTML でHTML付き文字列取得" Debug.Print objELEs(n).outerHTML 'Itemは省略可能だったりする Next Stop 'そんなことしないでも、頭から、 Debug.Print "長いけど" Debug.Print objIE.document.getElementsByTagName("P")(0).tagName Debug.Print objIE.document.getElementsByTagName("P")(0).outerHTML Debug.Print "↑こんな書き方もできますよ。テスト時はこっちがおおいか な?" End Sub
2.For Each オブジェクト Inで回す方法を解説
カウンターと添え字で回してたけど、
For Each オブジェクト Inで回す方法があります。
Dim e As Object 'エレメントを一つ保存したいので
を作って、
For Each e In objIE.document.getElementsByTagName("P")
'指定したタグを抜き出す
みたいに回す。
Sub ie_test20160706_for_each_in() 'IEテストする。 'IEの起動 Dim objIE As InternetExplorer '変数を定義します。 Set objIE = CreateObject("InternetExplorer.Application") 'オブジェ クトを作成します。 objIE.Visible = True '可視、Trueで見えるようにします。 objIE.Top = 0 objIE.Left = 0 '処理したいページを表示します。 objIE.Navigate "http://ie.vba- ken3.jp/test/20160706/test20160706.html" 'ページの表示完了を待ちます。 While objIE.ReadyState <> 4 Or objIE.Busy = True '.ReadyState <> 4 の間まわる。 DoEvents '重いので嫌いな人居るけど。 Wend 'エレメントを集め、データを代入 テスト Dim e As Object 'エレメントを一つ保存したいので Dim n As Integer 'For Each オブジェクト In オブジェクト複数 で 回す方法もあるよ n = 0 'カウント初期化 For Each e In objIE.document.getElementsByTagName("IMG") '指定した タグを抜き出す 'テストでInnerTEXTとOutherHTMLをデバックへ Debug.Print n & "番目" Debug.Print ".innerText で テキスト取得・表示" Debug.Print e.innerText '.プロパティやメソッドを使う Debug.Print ".outerHTML でHTML付き文字列取得" Debug.Print e.outerHTML 'eの型指定をすると便利かも・・・ n = n + 1 'カウントアップ Next Stop End Sub
3.型指定すると、楽かなぁ?
? typename(objIE.document.getElementsByTagName("IMG")(0))
とかで、型を表示すると便利で、
指定した型を使うと、プロパティを探りやすかったり。
Sub ie_test20160706_img_src() 'IEテストする。 'IEの起動 Dim objIE As InternetExplorer '変数を定義します。 Set objIE = CreateObject("InternetExplorer.Application") 'オブジェ クトを作成します。 objIE.Visible = True '可視、Trueで見えるようにします。 objIE.Top = 0 objIE.Left = 0 '処理したいページを表示します。 objIE.Navigate "http://ie.vba- ken3.jp/test/20160706/test20160706.html" 'ページの表示完了を待ちます。 While objIE.ReadyState <> 4 Or objIE.Busy = True '.ReadyState <> 4 の間まわる。 DoEvents '重いので嫌いな人居るけど。 Wend 'エレメントを集め、データを代入 テスト Dim e As HTMLImg 'IMGタグを一つ保存したいので Dim n As Integer 'For Each オブジェクト In オブジェクト複数 で 回す方法もあるよ n = 0 'カウント初期化 For Each e In objIE.document.getElementsByTagName("IMG") 'IMGタグを 抜き出す 'テストでInnerTEXTとOutherHTMLをデバックへ Debug.Print n & "番目" Debug.Print ".outerHTML でHTML付き文字列取得" Debug.Print e.outerHTML 'ここから文字列でぬいてもいいけど Debug.Print ".src で ソース画像の位置" Debug.Print e.src '.プロパティが使えるならそのプロパティの値を 取得 n = n + 1 'カウントアップ Next Stop End Sub
でIMGタグのSRCを探したり。
ここでウォッチ式で現物を見ると、プロパティが探しやすいかも?
4. やっと質問QAに答えてみた。
http://ie.vba-ken3.jp/test/20160706/test20160706.html
のテストファイルに対して、
テーブルの行がTRなので、
TRのタグを抜き出して、そのITEMがTDなので、
そこからさらに TD内のIMGでループして、
画像の数値をファイル名から判断して、抜き出してみました。
Sub ie_test20160706_QA_TR() 'TRタグの中をあさるテスト 'IEの起動 Dim objIE As InternetExplorer '変数を定義します。 Set objIE = CreateObject("InternetExplorer.Application") 'オブジェ クトを作成します。 objIE.Visible = True '可視、Trueで見えるようにします。 objIE.Top = 0 objIE.Left = 0 '処理したいページを表示します。 objIE.Navigate "http://ie.vba- ken3.jp/test/20160706/test20160706.html" 'ページの表示完了を待ちます。 While objIE.ReadyState <> 4 Or objIE.Busy = True '.ReadyState <> 4 の間まわる。 DoEvents '重いので嫌いな人居るけど。 Wend 'エレメントを集め、データを代入 テスト Dim objTR As HTMLTableRow '行のオブジェクト Dim y As Integer 'Y行目 Dim objTD As HTMLTableCell '列 セル一つ TDタグ Dim objIMG As HTMLImg 'IMGタグを一つ保存したいので Dim strTEMP As String '作業用の変数 Dim nGIF As Integer '.gifの場所を探すとき使用する 'For Each オブジェクト In オブジェクト複数 で 回す y = 1 For Each objTR In objIE.document.getElementsByTagName("TR") 'TRタグ を抜き出す 'テストでInnerTEXTとOutherHTMLをデバックへ Debug.Print y & "行目" Debug.Print ".outerHTML でHTML付き文字列取得" Debug.Print objTR.outerHTML 'ここから文字列でぬいてもいいけど '1列目、Aの処理 0から始まるので、一列目は(0) Set objTD = objTR.Cells.Item(0) 'ITEMはTDなのでまず代入 'TD内のIMGのファイル名から数値を取り出す strTEMP = "" For Each objIMG In objTD.getElementsByTagName("IMG") 'IMGタグを 抜き出す '../img/1.gifから1を抜く、../img/5.gifなら5を取りたい nGIF = InStr(objIMG.src, ".gif") '.SRCから.gifの文字を探す If nGIF <> 0 Then '文字が見つかったら strTEMP = strTEMP & Mid(objIMG.src, nGIF - 1, 1) End If Next '値をセットする Cells(y, "A") = Val(strTEMP) '数値変換してA列y行目にセット '2列目、Bの処理 0から始まるので、2列目は(1) Set objTD = objTR.Cells.Item(1) 'ITEMはTDなのでまず代入 Cells(y, "B") = Val(objTD.innerText) '単純にテキストを数値変換 してB列y行目にセット y = y + 1 '次の行へ Next Stop End Sub
※冒頭と同じ動画です↓
【IE操作 VBA】データ取得の基本?.InnerTEXT.OuterHTML For Each で回す【三流君】 - YouTube
www.youtube.com
※冒頭と同じ動画です↑
IE操作,VBA,データ取得,.InnerTEXT,.OuterHTML,
For Each In,.getElementsByTagName