↓のサイトで、IEを表示、要素を抜き出すことができました。
次は、楽天証券にログインしてみたいと思います。


VBAでIEを操作しgoogleで検索する方法~VBA(マクロ)でIE操作
今回は、VBAでを操作しgoogleで検索する方法を紹介したいと思います。
まず、サイト内のインプット要素の一覧を見てみましょう。
下記コードは「https://www.google.com/?hl=ja」の全てのインプット要素をエクセルに書き出すコードです。
ダブルクリックでコピーできますのでとりあえずVBAに張り付けて実行してみてください。
001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 023 024 025 026 027 028 029 030 031 032 033 034 035 036 037 038 039 040 041 042 043 044 045 046 047 048 049 050 051 052 053 054 055 056 057 058 059 060 061 062 063 064 065 066 067 068 069 070 071 072 073 074 075 076 077 078 079 080 081 082 083 084 085 086 087 088 089 090 091 092 093 094 095 096 097 098 099 100 101 102 103 104 105 106 107 108 | Sub IEinput() Application.ScreenUpdating = False '*****↓ここまでは以前と一緒*************************************************** 'IEの起動 Dim objIE As Object Set objIE = GetObject( "" , "InternetExplorer.Application" ) objIE.Visible = True ' ページの表示完了待ち。 While objIE.ReadyState <> 4 Or objIE.Busy = True DoEvents Wend '*****↑ここまでは以前と一緒*************************************************** '****今日はここから↓*************************************************** On Error Resume Next '値がないとエラーが出るので、エラー回避用 I = 1 '開始行を指定 J = objIE.document.all.Length '要素の数を知る Cells(I, 1).Value = "No" Cells(I, 2).Value = "tagname" Cells(I, 3).Value = "Type" Cells(I, 4).Value = "NAME" Cells(I, 5).Value = "ID" Cells(I, 6).Value = "className" Cells(I, 7).Value = "TABINDEX" Cells(I, 8).Value = "Vakue" Cells(I, 9).Value = "checked" Cells(I, 10).Value = "親のtagname" Cells(I, 11).Value = "innertext" Cells(I, 12).Value = "outertext" Cells(I, 13).Value = "outherhtml" Cells(I, 14).Value = "innerhtml" Cells(I, 15).Value = "リンク先" Dim A As Object For Each A In objIE.document.getElementsByTagName( "*" ) If A.TagName = "INPUT" Or A.TagName = "BUTTON" Then Debug.Print A.TagName Cells(I + 1, 1) = I - 1 '個数 Cells(I + 1, 2) = A.TagName 'TAGネーム Cells(I + 1, 3) = A.Type 'タイプ ※selectボックスは”select-one”と取得 Cells(I + 1, 4) = A.Name '名前 Cells(I + 1, 5) = A.ID 'ID Cells(I + 1, 6) = A.className 'クラス名 Cells(I + 1, 7) = A.TabIndex 'フォーカス順序 (Tabでの移動順) Cells(I + 1, 8) = A.Value '値 Cells(I + 1, 9) = A.Checked 'チェック状態 (True = チェック有り、false = チェック無し) 'checkboxやradioボタンから取得します Cells(I + 1, 10) = A.parentElement.TagName '親のTAG If Len(A.innerHTML) > 50 Then Cells(I + 1, 11) = Left(A.innertext, 10) & " ~~~ " & Right(A.innertext, 10) Cells(I + 1, 12) = Left(A.outertext, 10) & " ~~~ " & Right(A.outerrext, 10) Cells(I + 1, 13) = Left(A.outerHTML, 10) & " ~~~ " & Right(A.outerHTML, 10) Cells(I + 1, 14) = Left(A.innerHTML, 10) & " ~~~ " & Right(A.innerHTML, 10) Else Cells(I + 1, 11) = A.innertext Cells(I + 1, 12) = A.outertext Cells(I + 1, 13) = A.outerHTML Cells(I + 1, 14) = A.innerHTML End If I = I + 1 End If 'ステータスバーに進捗を表示 Application.StatusBar = I & "/" & J Next On Error GoTo 0 Cells.WrapText = False Application.ScreenUpdating = True Application.StatusBar = False Range(Cells(1, 1), Cells(1, 14)).EntireColumn.AutoFit Range(Cells(1, 2), Cells(1, 2)).EntireColumn.Interior.ColorIndex = 6 Range(Cells(1, 4), Cells(1, 4)).EntireColumn.Interior.ColorIndex = 6 Range(Cells(1, 8), Cells(1, 8)).EntireColumn.Interior.ColorIndex = 6 End Sub |
検索結果を確認し、操作したい要素を確認。
上記のマクロを実行すると、下記のようなinputとbuttonの要素を抜き出すことができたと思います。
今回は楽天証券にログインしたいのでので、
IDを入力するテキストボックスと、PWを入力する要素、ログインボタンがどれか判別する必要があります。
今回の場合、
ID → NAME:loginid ID:form-login-id
パスワード → NAME:passwd ID:form-login-pass
ボタン → 手掛かりになりそうな要素無し → BUTTONとしては3つ目
であることが分かりました。

早速ログインしてみよう!
入力したいID欄と、パスワード欄、ボタンを見つけることができたので、
プログラムに落とし込んでいきたいと思います。
やることは先ほどのプログラムと同じ要領で、
①FOR EACH でTagName("INPUT")、 TagName("BUTTON") をすべて抜き出す(なぜか大文字です)。
②IF文で入力したい要素を見つける。
③値を入力orボタンを押す
という構成になっています。
今回、最後のクリックだけ、手掛かりになりえる要素がなかったので、
objIE.document.getElementsByTagName("BUTTON")(2).Clickとして代用しました。
※ボタンとして3つ目なのですが、プログラムでは0から数字を始めますので、(2)となっております。
ダブルクリックでコピーできますのでVBAに張り付けて実行してみてください。
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | Sub IE_LOGIN() 'IEの起動 Dim objIE As Object Set objIE = GetObject( "" , "InternetExplorer.Application" ) objIE.Visible = True ' ページの表示完了待ち。 While objIE.ReadyState <> 4 Or objIE.Busy = True DoEvents Wend ' On Error Resume Next '値がないとエラーが出るので、エラー回避用 Dim A As Object For Each A In objIE.document.getElementsByTagName( "INPUT" ) '①FOR EACH でINPUTをすべて抜き出す。 If A.Name = "loginid" Then A.Value = "わたしのid" '②IF分で入力したい要素を見つけて ③値を代入 Next For Each A In objIE.document.getElementsByTagName( "INPUT" ) '①FOR EACH でINPUTをすべて抜き出す。 If A.Name = "passwd" Then A.Value = "111111111" '②IF分で入力したい要素を見つけて ③値を代入 Next objIE.document.getElementsByTagName( "BUTTON" )(2).Click On Error GoTo 0 End Sub |
いろいろのやり方でテキストボックスに入力してみる。
今回、ボタンのクリックがイレギュラーな感じになりましたが、
実は要素が特定できれば何でもありなのです。
その例を紹介していきます。
今回のid入力の場合を例にとってみると、4通り考えられます。
①まず、先ほどのプログラムのように要素を名前など限定して指定。
②inputタグの中で何番目か指定。
③getElementsByName(””)(0)でNameを直接指定。
Nameでもそのまま検索することができます。
getElementsByName(””)の後に(0)で一番最初の要素を取り出していますが、
ほかに同じ名前があったときに、違う要素を選択してしまう可能性がありますのでご注意ください。
④getElementByid("")で指定。
idを指定する場合は、getElementsではなく、 getElement です。
idはそのHTMLの中に重複が許されていないので、一つの値に決まるから複数形ではありません。
したがって、 getElementsbyTagNameやgetElementsbyNameで使用したような番号は必要ありません。
01 02 03 04 05 06 07 08 09 10 | '①先ほどのやり方 For Each A In objIE.document.getElementsByTagName( "INPUT" ) '①FOR EACH でINPUTをすべて抜き出す。 If A.Name = "loginid" Then A.Value = "わたしのid" '②IF分で入力したい要素を見つけて ③値を代入 Next '②何番目の要素かを指定。 objIE.document.getElementsByTagName( "INPUT" )(2).Value = "わたしのid" '③名前で指定。 objIE.document.getElementsByName( "loginid" )(0).Value = "わたしのid" '④IDで決定 objIE.document.getElementByid( "form-login-id" ).Value = "わたしのid" |
ちょっと困った、ログインボタン。
後で気づいたのですが、
TAGINDEXが4なので、これを用いてログインすることができることに気づきました…すみません。
※ちなみにTAGINDEXとはタグを押したときの順序を表しており、
4回TAGを押すとそこに行くようになっております。

その他、VBAでIEを動かすために必要な情報をまとめています!!
コメント欄