スポンサーリンク

【簡単】VBAでIEを操作しログインする方法~VBA(マクロ)でIE操作

IE関係
この記事は約12分で読めます。

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

【簡単】VBAでIEの任意のサイトを表示させる方法~VBA(マクロ)でIE操作
VBAでIEを操作する方法はネットを検索しても、まだ確立されきっていないように感じますので、素人が学びながら、そこまで深堀せずに簡単に説明していきたいと思います。VBAでIEの任意のサイトを表示させる方法VBAの入門編とし...
【簡単】VBAでIEの全要素のデータを取得する方法~VBA(マクロ)でIE操作
↓のサイトで、IEを表示することができました。次は、HTMLの中身を確認し、任意の情報を取り出す方法を書いていこうと思います。VBAでIEの全要素のデータを取得する方法マクロでIEを操作して行いたいことは、①サイト...
スポンサーリンク

VBAでIEを操作しgoogleで検索する方法~VBA(マクロ)でIE操作

今回は、VBAでを操作しgoogleで検索する方法を紹介したいと思います。
まず、サイト内のインプット要素の一覧を見てみましょう。
下記コードは「https://www.google.com/?hl=ja」の全てのインプット要素をエクセルに書き出すコードです。
ダブルクリックでコピーできますのでとりあえずVBAに張り付けて実行してみてください。

Sub IEinput()
    
 Application.ScreenUpdating = False
     
'*****↓ここまでは以前と一緒***************************************************
'IEの起動
Dim objIE As Object
     
Set objIE = GetObject("", "InternetExplorer.Application")
     
objIE.Visible = True
         
         
    objIE.Navigate "https://www.rakuten-sec.co.jp/"  ' このURLを任意に変更
         
    ' ページの表示完了待ち。
    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に張り付けて実行してみてください。

Sub IE_LOGIN()
   
'IEの起動
Dim objIE As Object
   
Set objIE = GetObject("", "InternetExplorer.Application")
   
objIE.Visible = True
       
    objIE.Navigate "https://www.rakuten-sec.co.jp/"  ' このURLを任意に変更
       
    ' ページの表示完了待ち。
    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で使用したような番号は必要ありません。

'①先ほどのやり方
    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を押すとそこに行くようになっております。

↑この子が厄介なのです。。。

コメント欄

タイトルとURLをコピーしました