三流君 ken3のmemo置き場

三流プログラマーのメモ書きです。主にVBAやWindowsの話題が多いです

挨拶・自己紹介:
失敗続きのAB型の変わり者 :三流プログラマー Ken3です
フリーのエンジニア・個人事業主です・・と書くと聞こえはイイが(それとなくカッコよく聞こえるが)、 現在は小さな案件の受注請負 と 短期派遣 で 日々つつましく?ほそぼそと暮らしてます。

よく検索されるキーワード: [質問回答XXXXさんへ] [CreateObject] [VBA] [JRA競馬オッズ]

XXXXXさんへ IE操作 img src の ファイル名を取得したい

※いつもの、脳内垂れ流し動画です。
【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

Ken3 ホームページ 目次

分類:HPを大きく分けると4つの柱(分類)です。

  1. [VBA・マクロ プログラミング]の解説
    当店の人気はVBA系のCreateObject("XXXXXX.application")で他のアプリケーションを操作するサンプルが人気です
  2. [プログラマーの愚痴]では、あまり見せたくない三流プログラマーの内面かな。
    三流君を踏み台にする
  3. [古いクラシック ASP(Active Server Pages)]の解説。
  4. [元コンビニ店長時代の話]が弟に巻き込まれ、失敗した脱サラ、畑違い?の仕事で失敗。
主に上記4つの分類でHP作成やメルマガの発行を行ってます。
※更新頻度が落ちていて情報の鮮度が悪いです。



本当に三流なんです(笑):たまにスゴイですねなんて言われることもありますが、
真実は→ [三流君の真実は...] ←を初めに見てくださるとわかると思います。
(からくりは、成功例↑しか載せてなくて ヒドイ失敗例はお蔵入り迷宮入りが多かったりします)