■4-5 Webページ操作に直ぐ利用できるサンプルマクロ例
Webページ処理のマクロ作成には、コントロールの指定が必要ですが、まずコントロールを特定するため
に必要な「エレメント番号取得」及び「リンク番号取得」するためのサンプルマクロを紹介します。
その後実際にWebページを制御するンプルマクロを紹介します。ハイパーリンクの制御では一般に掲載
されているHPのURLをサンプルに指定できますが、その場合相手先の承諾がいることと何時URLが変更
なるか不安なので著者が出しているHPをサンプルにしました。サンプルを参考にして自分用のマクロに
改造して活用してください。
いずれのサンプルもこの本でソースを公開しており使用に当たってのマクロ作者への使用許可確認は
不要です。




(1)Webページ制御に必要なHTMLタグのエレメント番号取得マクロ
前項までにHTMLタグの制御方法を説明しましたが、一番確実に制御する方法はそのボックスやボタン
に付いている固有の名前を指定する方法です。
しかし、実際には固有の名前が付いて無いコントロールも沢山あります。その場合はエレメント番号で
指定する以外に方法はありません。エレメント番号を知ることはHTMLファイル操作の第一歩です。

【操作方法】
@「エレメント番号取得」ボタンクリックで「ファイル名指定」のダイアログを
  表示します(ダイアログに表示されるファイルは拡張子htmlのみです)。
Aエレメント番号をチェックしたいHTMLファイルを指定し「開く」をクリック。
B「エレメント番号シート」にInternetExplorerを開き指定したHTMLファイルを
 自動表示します(エレメント番号取得後にファイルは自動的に閉じます)
C「エレメント番号シート」にフォーム番号とエレメント番号を記入。

サンプル画面43のようなHTMLファイルのエレメント番号取得結果は、画面44
のようにシートに一覧表示されます。

画面43 エレメント番号を取得したHTML元ファイル例


画面44シートへエレメント番号を記入

Dim myobj As Object, objIE As Object
Dim fff As String, mycnt
 
Sub エレメント番号()
 
Set myobj = CreateObject("Shell.Application")
mycnt = myobj.Windows.Count
 
fal = "HTMLファイル(*.html),*.html"
fff = Application.GetOpenFilename(fal, , Title:="htmlファイル指定") 'ファイル指定
 
If fff = "False" Then
   MsgBox "ファイルを指定して下さい"
   Exit Sub
End If
 
Worksheets("エレメント番号").Select
    Cells.ClearContents
 
With myobj.Windows
    Shell ("EXPLORER.EXE " & fff)
        Do
            DoEvents
        Loop Until mycnt + 1 <= .Count
    Set objIE = .Item(mycnt)
End With
 
   Do While objIE.ReadyState <> 4 Or objIE.Busy = True
        DoEvents
   Loop
 
   Do While objIE.ReadyState <> 4 Or objIE.Busy = True
        DoEvents
   Loop
 
cnt = 1
For i = 0 To objIE.Document.forms.Length - 1
    For j = 0 To objIE.Document.forms(i).elements.Length - 1
        Cells(cnt, 1) = "forms(" & i & ").elements(" & j & ") ⇒ " & _
            objIE.Document.forms(i).elements(j).outerHTML
            cnt = cnt + 1
        Next
    cnt = cnt + 1
    Next i
objIE.Quit
End Sub




(2)◆Webページ制御に必要なHTMLタグのリンク番号取得マクロ
アンカータグ<A>で指定したハイパーリンクはエレメント番号はないし、名前がついていないので何番目
のリンクか調べLinks(番号)で制御します。
これは、リンク制御の項目で述べましたが、HTMLファイルのソースを見てリンクステータスを上から順に
数えれば番号の取得は可能です。ただし、数え間違いのでミスが起き正確な取得は難しい。
このマクロでExcelシートに一覧表を簡単に表示します。

【操作方法】
@「エレメント番号取得」ボタンクリックで「ファイル名指定」のダイアログを
  表示します(ダイアログに表示されるファイルは拡張子htmlのみです)。
Aエレメント番号をチェックしたいHTMLファイルを指定し「開く」をクリック。
B「リンク番号シート」にInternetExplorerを開き指定したHTMLファイルを
 自動表示(画面45参照)(リンク番号取得後にファイルは自動的に閉じます)
C「リンク番号シート」にリンク番号を記入(画面46参照)。

画面45 リンク番号を取得したファイル例


画面46 シートへリンク番号を記入


Sub リンク番号()
Dim fal As String, fff As String, objIE As Object
Dim cnt As Integer, i As Integer
 
fal = "HTMLファイル(*.html),*.html"
fff = Application.GetOpenFilename(fal, , Title:="htmlファイル指定") 'ファイル指定
 
If fff = "False" Then
   MsgBox "ファイルを指定して下さい"
   Exit Sub
End If
 
 ・・・・・4-7節「Sub エレメント番号()マクロ」と同じであり省略 ・・・・・
 
cnt = 1
    For i = 0 To objIE.Document.Links.Length - 1
        Cells(cnt, 1) = "Links(" & i & ") ⇒ " & _
            objIE.Document.Links(i).outerHTML
        cnt = cnt + 1
    Next i
    objIE.Quit
End Sub




(3)Webページのリンク表を一段ずつ自動クリックするマクロ
ホームページを出している者がお互いにリンクを張る「相互リンク」は、多くの方に自分のホームページを
紹介する手段として広く用いられています。
ホームページを出し始めた昔の話ですが、著者の場合相互リンクを張って頂いた方にはお礼として、
当面こちらからも毎日10回訪問しましす。と約束したことがあります。約束は守ったが実際は自分が見
に行ったのではなく、ここで紹介のマクロを作って、無人で3秒間表示を10回訪問しました。

自動クリックマクロをここで紹介します(実行例は画面47参照)。

画面47ハイパーリンクを自動クリック実行例 


【操作方法】
@ KIの無人訪問.xlsを開く
AWeb表示準備」ボタンで下記記入のこと
  L2:ファイル場所、M4:実行回数、M5:表示時間(秒)
  上記指定済みの場合は「Web表示準備」は不要

B 「KIの無人訪問」実行ボタンをクリック
C 左上隅へダイアログが表示される
D ダイアログ上へリストのWebページを順次表示
E 全リンク終了で「実行終了」を表示

プロシージャの詳細はサンプルマクロを見てください。
ここにはメインの一部を紹介します。

Sub 無人訪問()
Dim cont As Integer, i As Integer
urlcheck = 1
    Call 表示準備
 
行数チェック
   gyousu = UserForm1.web1.Document.Links.Length - 1
 
For cont = 1 To kaisuu
    For i = 0 To gyousu
        With UserForm1
            .txt1 = i + 1
            .txt2 = UserForm1.web1.Document.Links(i).innerHTML
            .txt4 = cont & "/" & kaisuu
        End With
 
        enchk = 0
        UserForm1.web1.Document.Links(i).Click
            Call 読み込み終了確認
            Call 表示時間1
 
        UserForm1.web1.Navigate urle
            Call 読み込み終了確認
            If enchk = 0 Then: Exit Sub
            Call 表示時間2
    Next
Next
With UserForm1
    .txt1 = ""
    .txt2.BackColor = "&H8becff"
    .txt2 = "リンク表の各サイトを" & kaisuu & "回表示終了"
    .txt3 = byou
    .txt4 = kaisuu
End With
 
End Sub

Sub 表示時間1()
UserForm1.txt3 = byou
timck = Timer + byou
tm1 = byou
tm2 = Timer + 1
 
Do
    If Timer > timck Then
        UserForm1.txt3 = 0
        Exit Do
    End If
    If tm2 < Timer Then
        tm1 = tm1 - 1
        UserForm1.txt3 = tm1
        tm2 = Timer + 1
    End If
    DoEvents
Loop
 
End Sub




(4)Webページリンク表のハイパーリンクをマウス矢印で制御のマクロ
Webを制御する方法としては、通常の手操作を再現して、コントロールボタン上でマウスをクリックしたり
テキストボックスにホーカスを移して文字を入力することもExcelVBAで実現することができます。
ただしこの方法はWebページを表示するときのブラウザの種類や文字フォントサイズや画面解像度の
相違により表示位置が変わります。

したがって誰でもどのPCでも共通に使用できるマクロ化は困難であり、前項までの説明でもマウスクリック
方式の説明の記述はおこなっていません。
ただし、ExcelVBAでこんなこともできると言う事は覚えて欲しいので、マクロサンプルは紹介することにし
ました。
本紹介のマウスクリック方式はPCの設定相違により正常に動作しないことも考えられが、興味のある
方はソースを自分のPCに合ったにマウスポインタ位置に変更して使用して下さい。(画面48参照)

画面48ハイパーリンクをマウスでクリック例 


【操作方法】
[1]KIのマウス「無人訪問.xlsを開く
[2]L2セルに実行するHTMLファイル場所を記入
[3]ユーザーフォーム表示」でフォーム表示
[4]連続リンククリック実行」クリックで実行
[5]ダイアログ上へリストのWebページを順次表示
[6]終了で”自動実行終了”を表示

※マニュアルでおこなう場合
・行番号指定のテキストボックスへ実行したいNoの番号を入力します。
  ・ダイアログの「Web表示確認」クリックで指定したNo行を表示します。

プロシージャの詳細はサンプルマクロを見てください。ここにはメインの一部を紹介します。

Sub 連続実行()
Dim gyo As Integer
 
If UserForm1.Visible = False Then
    Call ダイアログ
End If
 
For i = 0 To gyousu
    UserForm1.txt01.Text = i + 1
        DoEvents
    gyo = 200 + (i * 24)
    Ret = SetCursorPos(113, gyo)
            Call タイミング2
        If GetCursor <> 65581 Then
            MsgBox "マウスがハイパーリンク上にありません."
            Exit For
        End If
        Call 左クリック
        DoEvents
        Call タイミング2
    Call 読み込み終了確認
    Call 表示時間1
 
    UserForm1.web1.Navigate urle
    Call 読み込み終了確認
       Call タイミング2
Next
 
UserForm1.Hide
MsgBox "自動実行終了"
 
End Sub



Sub 左クリック()
DoEvents
    mouse_event 2, 0, 0, 0, 0
    mouse_event 4, 0, 0, 0, 0
End Sub




(5)郵便番号を住所に変換をWebページを利用して実行するマクロ
Webページの検索機能を利用して必要なデータを取得して、その結果をExcelシートに記入したいケース
があると思います。本例は郵便事業株式会社が出している公式ページの「郵便番号検索」ページを利用
して、郵便番号を入力しその番号に該当する住所を取得してExcelシートに記入するマクロです。

Webページ上で、検索スタートは「該当地域を検索」ボタンをクリックしますが、このリンクが「type=image」
の画像ボタンであり、4-5節「(1)Webページ制御に必要なHTMLタグのエレメント番号取得マクロ」または
「(2)◆Webページ制御に必要なHTMLタグのリンク番号取得マクロ」で制御できません。ここでは
「type=image」のケースをVBAで自動クリック方法も合わせて紹介します。

なお、一般に公開されているWebページであり更新されたりURLが変更になった場合、本サンプルは動か
なくなることが考えられます。永遠に動作を保証するサンプルでないことを承知の上他への応用を含め
参考にして下さい。


[1]郵便番号マクロ」の概略と操作説明
@郵便番号検索シートの「ダイアログ表示」ボタンクリック
A画面54に示すような「UserForm1」ダイアログが表示されます
 (WebBrowser コントロール使用して実行ですが初期はWebページ未表示)

Bユーザーフォームの郵便番号テキストボックスに3桁と4桁の郵便番号を入力
C「検索後セルへ記入」ボタンクリックで、J列セルに住所が記録されます
  なお、「住所検索」ボタンのクリックの場合はシートのセルへは未記入で結果のみユーザーフォームの
テキストボックスに表示します。

「検索後セルへ記入」ボタンクリックでマクロは以下の処理します
【1】記入された「郵便番号」を読み取る(変数banへ代入)
【2】郵便事業会社(旧郵政省)の郵便番号検索ページを表示
【3】指定した郵便番号(変数banの内容)をWebの所定箇所に入力
【4】Webページの「該当地域を検索」ボタンクリック
【5】検索結果表示のページに変わるので検索された住所データを読み取る
  (データは変数mydat3へ代入)
【6】住所データをテキストボックスへ表示
【7】住所データをI列、J列セルへ記入する

画面54 郵便番号から住所を検索例



[2]「郵便番号マクロ」説明
4-5WebBrowser コントロールで紹介済みの「読み込み終了確認」プロシージャの説明は省略します。


Public kiroku As Integer
Dim urle As String, ban As String
Dim mydat2 As String, mydat3 As String
----------------------------------------------------------
Sub ダイアログ()
    With UserForm1
        .Show 0
        .txt1.SetFocus
    End With
End Sub
----------------------------------------------------------
Sub 検索実行()
urle = "http://www.post.japanpost.jp/zipcode/index.html"
 
ban = UserForm1.txt1.Text & UserForm1.txt2.Text
 
If Len(ban) <> 7 Then
    MsgBox "7桁の郵便番号を入力してく下さい。"
    Exit Sub
End If
 
enchk = 0
UserForm1.web1.Navigate urle
 
Call 読み込み終了確認
UserForm1.web1.Document.all("zip").Value = ban
enchk = 0
Dim objInput As Object
 
    Set objInput = UserForm1.web1.Document.getElementsByTagName("input")
For Each cnt In objInput
    If (LCase(cnt.Type) = "image") And (cnt.alt = "該当地域を検索") Then
        cnt.Click
        Exit For
    End If
Next
 
Call 読み込み終了確認
 
myhtml = UserForm1.web1.Document.Body.innerText
stchc = InStr(1, myhtml, "変更時期", 1)
If stchc = 0 Then
    MsgBox "該当する郵便番号が見つかりませんでした。"
        Exit Sub
End If
enck1 = InStr(stchc, myhtml, "このページの先頭", 1)
mydat1 = Mid(myhtml, stchc + 6, enck1 - stchc)
 
enck2 = InStr(1, mydat1, Chr(13), 1)
mydat2 = Mid(mydat1, 1, 9)
mydat3 = Mid(mydat1, 10, enck2 - 10)
 
UserForm1.txt3.Text = mydat3
 
If kiroku = 1 Then
    Call セルへ記入
End If
kiroku = 0
End Sub
----------------------------------------------------------
Sub セルへ記入()
 
endr = Range("I1000").End(xlUp).Row + 1
Cells(endr, 9).Value = mydat2
    Cells(endr, 9).WrapText = False
 
Cells(endr, 10).Value = mydat3
 
End Sub
 



【戻る】    【Top画面】   【HPへ】