前提・実現したいこと
ExcelVBAを使って管理画面にログインしてtableを抜き出しシートに出力(入力?)したいです。
当方初心者なりに頑張ってはみましたができません><
お助けいただけますでしょうか。
よろしくお願いいたします。
発生している問題・エラーメッセージ
エラーメッセージは特にないのですが、
エクセルのシートに書き込みができません。
該当のソースコード
'変数を必ず定義すると宣言 Option Explicit '変数を宣言 Dim objIE As InternetExplorer Dim ieDoc As HTMLDocument Dim obj As Object Dim obj2 As Object Dim obj3 As Object Dim j As Integer Dim i As Integer Sub IE_open() j = 0 '変数を初期化 'Internet Exploreを立ち上げる Set objIE = CreateObject("InternetExplorer.Application") objIE.Visible = True 'URLを指定する objIE.Navigate2 "http://hogeho.ge/login.php" Do While objIE.Busy = True Or objIE.readyState <> 4 DoEvents Loop Dim htmlDoc As HTMLDocument Set htmlDoc = objIE.Document With htmlDoc .getElementById("login").Value = "XXXXXXXXX" 'ユーザー名を指定 .getElementById("pass").Value = "AAAAAAAAAA" 'パスワードを指定 .getElementById("submit").Click End With Set ieDoc = objIE.Document 'ログイン後のページのHTMLを読み込む '該当のWebサイトが表示されるのを待つ While objIE.Busy Or objIE.readyState <> READYSTATE_COMPLETE DoEvents Wend Set ieDoc = objIE.Document For Each obj In objIE.Document.all '表示されているサイトの全タグ一つずつを変数objにセット '各アンカータグ単位に以下の処理を実施 Select Case obj.tagName 'タグ名により処理を分岐 Case "TR", "TD", "TH" 'TR,TD,THタグの場合、以下の処理を実施 If obj.offsetParent.className = "boardFin yjSt marB6" Then '親タグのCLASS名が「boardFin yjSt marB6」の場合 Select Case obj.tagName 'タグ名により処理を分岐 Case "TR" 'TRタグの場合 j = j + 1 '行カウンターを1アップ i = 0 '列カウンターをクリアー Case "TD", "TH" 'TD,THタグの場合、以下を処理 i = i + 1 '列カウンターを1アップ Worksheets("Sheet1").Cells(j, i).Value = obj.innerText 'タグのテキスト内容をセルにセット End Select End If End Select Next End Sub
補足情報(FW/ツールのバージョンなど)
2019/10/3/23:20 th取得のため 修正いたしました。
2019/10/3/21:15 修正いたしました。
現在の状況:ステップ インでは取得したい値が取得てきております。
当方Excel2013を使用しています。
・インデントが分かるように、コードは「コードの挿入」で記入してください。
・ループ内のobj、obj2、obj3はそれぞれオブジェクトが取得できていますか?
meg_様ご連絡ありがとうございます。
>・インデントが分かるように、コードは「コードの挿入」で記入してください。
コードはコードの挿入で記入してください。
大変申し訳ございません。よくわかりません。
>・ループ内のobj、obj2、obj3はそれぞれオブジェクトが取得できていますか?
ステップ インでは取得できるようです。
また、ログインせずに取得するよう
Dim htmlDoc As HTMLDocument
Set htmlDoc = objIE.Document
htmlDoc.getElementById("user_login").Value = "webmaster" 'ユーザー名を指定
htmlDoc.getElementById("user_pass").Value = "QqLsbCr7OLpilX^L" 'パスワードを指定
htmlDoc.getElementById("wp-submit").Click
Do While objIE.Busy = True Or objIE.readyState <> 4
DoEvents
Loop
を外すとそれぞれ取得でき、シートに反映されます。
meg_様
>・インデントが分かるように、コードは「コードの挿入」で記入してください。
理解できました!大変失礼いたしました!
ステップ実行ではなく、breakポイントなどでオブジェクトが取得できているか確認してみてください。
おそらくログイン後にページ読み込みが完了する前に処理が走っているかと思われます。
meg_様 遅くにご返信ありがとうございます。
breakポイントでの取得を調べてやってみました。
ウォッチウィンドウに出てきていたので取得出来ているのではないでしょうか。
また、tr、tdだけではなくthの取得もと考えコードを変更しております。
実はこちらからの引用なのですがhttps://ie-excel.com/excel-vba%E3%81%A7ie%E3%82%92%E6%93%8D%E4%BD%9C%E3%80%80%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E3%82%92%E3%82%A8%E3%82%AF%E3%82%BB%E3%83%AB%E3%81%AE%E3%82%B7%E3%83%BC%E3%83%88%E3%81%AB%E3%82%B3%E3%83%94/
こちらにログインのイベントを入れています。
ログインのイベントがなければシートに反映されるのですが...
>おそらくログイン後にページ読み込みが完了する前に処理が走っているかと思われます。
ということは
Do While objIE.Busy = True Or objIE.readyState <> 4
DoEvents
Loop
をログイン後に記載してあげればよろしいのでしょうか?
それでも反映されなかったのです...。
「Set ieDoc = objIE.Document」
このコードの前に
「Sleep 1000' 10秒待つ(これは、ログイン時間にあわせて調整)」
このコードを入れてみてください。
これで動くなら「'該当のWebサイトが表示されるのを待つ」
コードの部分が上手く動いていないのが原因です。
これで動かないなら、
そもそもログインできているのか確認してみてください。
「htmlDoc.getElementById("wp-submit").Click」この処理は
サイトごとに出来ないこともあるのであなたのURLでは上手く動かないことがあります
Youbun様 お返事ありがとうございます。
Sleep 1000を入れるとコンパイルエラー SubまたはFunctionが定義されていません。
とでたのでApplication.Wait Now + TimeValue("00:00:10")を入れました。
が、変わらずシートに書き込み出来ていませんでした。
>そもそもログインできているのか確認してみてください。
実行を押すとIEを立ち上げてログインしていることは確認できていますが、この自動で立ち上がった画面はあまりアテにならないということでしょうか?
すいません。
ソースの「Option Explicit」の下に
「Private Declare Sub Sleep Lib "kernel32" (ByVal ms As Long)」
このコードを入れるとSleepがコンパイルエラーにならないです。
あなたのコードの「'該当のWebサイトが表示されるのを待つ」の上の方の
「Set ieDoc = objIE.Document 'ログイン後のページのHTMLを読み込む」この部分を消して下さい。
意味のないコードになってますので。。。
そして、違う方の
「Set ieDoc = objIE.Document 'ログイン後のページのHTMLを読み込む」
このコードにブレークを貼って、
この行で処理が止まる前に「IEの画面がログイン後の画面になっている」のを確認してみてください
ログイン画面になる前に処理が停止していたらウェイトの時間が足りないので
「Sleep 1000」の、1000の部分をもっと大きくしていってください。
回答1件
あなたの回答
tips
プレビュー