三流君 ken3のmemo置き場

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

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

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

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

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

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


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


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

Sub test()

    Dim objIE As Object
 
    'Webページ表示
    Set objIE = CreateObject("InternetExplorer.Application")
    objIE.Visible = True
    objIE.Navigate "https://sec-sso.click-sec.com/loginweb/"
      
    '画面表示待ち
    While objIE.readyState <> 4  'READYSTATE_COMPLETE = 4
            While objIE.Busy = True
                DoEvents  '特に何もしないで.Busyの状態が変わるまで待つ
            Wend
        Wend
    
    'テストボックスへ入力
    
    ''画面表示待ち
    'Dim time20 As Date
    '
    '    time10 = DateAdd("s", 16, Now) '3秒待ち、三秒後を計算、
    '    While Now < time20  '現在時刻が上↑の三秒後以下の間まわる。
    '        DoEvents   '嫌いな人多いけど、
    '    Wend
    objIE.document.all("j_username").Value = "test dayo"
    objIE.document.all("j_password").Value = "123456789"
    
    'フォーム(0番目)を .Submit(送信・投稿) またはClickする
    objIE.document.forms(0).submit
    'objIE.document.forms.("LoginForm").submit
    'objIE.document.all(LoginForm).Click
    
    'Dim x As Object
    'For Each x In objIE.document.forms(0).all
    '     If TypeName(x) = "HTMLInputElement" Then
    '         If x.alt = "ログイン" Then
    '             Call x.Click
    '             Exit For
    '         End If
    '     End If
    'Next

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

    'Webページ表示  調査したいページを表示する
    objIE.Navigate "http://www.ken3.org/cgi-bin/test/test027-2.asp"
 
    '画面表示待ち
    While objIE.readyState <> 4 Or objIE.Busy = True  'READYSTATE_COMPLETE = 4
         DoEvents  '特に何もしないで.Busyの状態が変わるまで待つ
    Wend

    '※FORM(0)の下 オブジェクトを1つ1つ表示してみた
    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 '列幅を20に変更
    
    'Form(0)のオブジェクトをFor Each で書き出す
    i = 0
    For Each objTAG In objIE.document.Forms(0)
        'データをセルへセットする
        Cells(i + 2, "A") = i 'i番目 結局iは使うのかよ(笑)
        Cells(i + 2, "B") = "'" & TypeName(objTAG) 'TypeNameでオブジェクトのタイプを表示
        
        Cells(i + 2, "C") = objTAG.TagName   'タグの名前
        Cells(i + 2, "D") = "'" & Left(objTAG.OuterHTML, 256) 'HTML 頭から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内を探してみました。

    'フォーム(0番目)を .Submit(送信・投稿) またはClickする
    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

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

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

Ken3 ホームページ 目次

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

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



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