🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

1回答

2610閲覧

ExcelVBAを使って管理画面ログイン後Tableをシートに出力したい

wing283

総合スコア123

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2019/10/03 03:20

編集2019/10/03 14:23

前提・実現したいこと

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を使用しています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg_

2019/10/03 10:56

・インデントが分かるように、コードは「コードの挿入」で記入してください。 ・ループ内のobj、obj2、obj3はそれぞれオブジェクトが取得できていますか?
wing283

2019/10/03 12:16

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 を外すとそれぞれ取得でき、シートに反映されます。
wing283

2019/10/03 12:23

meg_様 >・インデントが分かるように、コードは「コードの挿入」で記入してください。 理解できました!大変失礼いたしました!
meg_

2019/10/03 13:09

ステップ実行ではなく、breakポイントなどでオブジェクトが取得できているか確認してみてください。 おそらくログイン後にページ読み込みが完了する前に処理が走っているかと思われます。
wing283

2019/10/03 14:39

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 をログイン後に記載してあげればよろしいのでしょうか? それでも反映されなかったのです...。
Youbun

2019/10/04 00:33

「Set ieDoc = objIE.Document」 このコードの前に 「Sleep 1000' 10秒待つ(これは、ログイン時間にあわせて調整)」 このコードを入れてみてください。 これで動くなら「'該当のWebサイトが表示されるのを待つ」 コードの部分が上手く動いていないのが原因です。 これで動かないなら、 そもそもログインできているのか確認してみてください。 「htmlDoc.getElementById("wp-submit").Click」この処理は サイトごとに出来ないこともあるのであなたのURLでは上手く動かないことがあります
wing283

2019/10/04 01:41

Youbun様 お返事ありがとうございます。 Sleep 1000を入れるとコンパイルエラー SubまたはFunctionが定義されていません。 とでたのでApplication.Wait Now + TimeValue("00:00:10")を入れました。 が、変わらずシートに書き込み出来ていませんでした。 >そもそもログインできているのか確認してみてください。 実行を押すとIEを立ち上げてログインしていることは確認できていますが、この自動で立ち上がった画面はあまりアテにならないということでしょうか?
Youbun

2019/10/04 04:14

すいません。 ソースの「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の部分をもっと大きくしていってください。
guest

回答1

0

ベストアンサー

ステップ実行で正しく処理が出来ているなら、ページ読み込み完了前にhtmlソースを取得しようとしていると思われます。

vba

1While objIE.Busy Or objIE.readyState <> READYSTATE_COMPLETE 2 DoEvents 3 Wend

上記コードでも失敗することもあるようです。その場合はsleep処理を追加してみてください。

投稿2019/10/03 23:14

meg_

総合スコア10739

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wing283

2019/10/04 01:46

上の Do While objIE.Busy = True Or objIE.readyState <> 4 DoEvents Loop と下の While objIE.Busy Or objIE.readyState <> READYSTATE_COMPLETE DoEvents Wend をどちらも Application.Wait Now + TimeValue("00:00:05") へ変更してみたらできました!! 何度もご連絡頂きありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問