XXXXXさんへ IEのタグ表示は、外側を含めた .OuterHTML で 確認すると便利です。 (original) (raw)

とある三流プログラマーのデバック風景 です。笑ってやってください。

下記の質問をもらいました。
※IDとパスワードは消させてもらいました。
※※株、FX系は、質問いただいてもテストできないから
(テスト結果を出しにくいから敬遠してるんだけど。。。)

'----------------- ここから質問

ログインIDとパスワードと入力する所までは
うまく行くのですが、その後のログインボタンがどうしても押せません。
SubmitとClickを試してみたのですがそれでも駄目でした。
どうかご教授願えませんでしょうか?
以下がコードです。
試して出来なかった没はコメントにしてあります。

Sub test()

Dim objIE As Object


Set objIE = CreateObject("InternetExplorer.Application")
objIE.Visible = True
objIE.Navigate "https://sec-sso.click-sec.com/loginweb/"
  

While objIE.readyState <> 4 
        While objIE.Busy = True
            DoEvents 
        Wend
    Wend


objIE.document.all("j_username").Value = "test dayo"
objIE.document.all("j_password").Value = "123456789"


objIE.document.forms(0).submit

End Sub

'------- ここまで。

デバッグ
STOP で 止めて、現物を見るのも あきてきたので、
パターン的に探す時、
外側のHTMLを含めて書きだすと わかりやすいと思います。
(※読者心の声: 「そんな方法があるなら先に、ページの頭に書いとけよ」...)

私のサンプルで、InnerTEXTやInnerHTMLが多いのが原因なんだけど、
探る時は、OuterHTML で エレメント・アイテムを探ると便利です。

Youtubeで大きく見る→ http://www.youtube.com/watch?v=QAF0MVqpOgQ
www.youtube.com

テストで使用したコード

新規のブックに Form(0)だけ書き出してみました(複数フォームに対応しないとなぁ・・・)

Option Explicit

Sub test()

Dim objIE As Object

Set objIE = CreateObject("InternetExplorer.Application")
objIE.Visible = True


objIE.Navigate "http://www.ken3.org/cgi-bin/test/test027-2.asp"


While objIE.readyState <> 4 Or objIE.Busy = True 
     DoEvents 
Wend


Dim i As Integer     
Dim objTAG As Object 

Workbooks.Add 

Range("A1") = "NO.i番目" 
Range("B1") = "TypeName関数の結果"
Range("C1") = ".TagName タグの名前"
Range("D1") = ".OuterHTML 外側含むHTML"
Range("E1") = ".Value 値"
Range("F1") = ".Name 項目に付けた名前"
Columns("A:G").ColumnWidth = 20


i = 0
For Each objTAG In objIE.document.Forms(0)
   
    Cells(i + 2, "A") = i
    Cells(i + 2, "B") = "'" & TypeName(objTAG)
    
    Cells(i + 2, "C") = objTAG.TagName  
    Cells(i + 2, "D") = "'" & Left(objTAG.OuterHTML, 256)
    Cells(i + 2, "E") = objTAG.Value 
    Cells(i + 2, "F") = objTAG.Name  
    
    i = i + 1  
Next

End Sub

その他、デバック確認は
http://www.ken3.org/cgi-bin/group/vba_ie_form.asp
↑を見て笑ってください。

確認後、修正

ボタンのオブジェクトが
HTMLButtonElement
だったみたいです。(※Inputのチェックが違っていたのと、)
Button は .altが無いので、
Instr関数でOuterHTML内を探してみました。

Dim x As Object
For Each x In objIE.document.Forms(0)
     
     If TypeName(x) = "HTMLButtonElement" Then
         Debug.Print x.OuterHTML
         If InStr(x.OuterHTML, "alt=ログイン") > 0 Then
             Call x.Click
             Exit For
         End If
     End If
Next

に変更すると、動作すると思います。
証券会社のページは、自動ログイン除けとかあるので大変だと思いますが....

終わりの挨拶

原因は、
質問者が参考にした三流プログラマーのHP

三流君VBAでIE操作 InternetExplorer.Applicationを操作する
http://www.ken3.org/cgi-bin/group/vba_ie.asp

三流君VBAでIEのフォーム操作 Document.Formsを操作する
http://www.ken3.org/cgi-bin/group/vba_ie_form.asp

が探しにくいからなぁ。
(※読者心の声で 「だったら、探しやすく・見やすくしろよ」と聞こえて所で逃げるように失礼します。)

デバック処理の参考となれば幸いです。