Excel VBA のinternetexplorer.applicationを使用して あるサイトの情報を自動取得していたのですがうまくいきません。
解決済
回答 2
投稿
- 評価
- クリップ 1
- VIEW 4,986
あるサイトの情報を自動取得したいのですがうまくいきません。
やりたいこととしては自動ログインしてログイン成功後のページ
の特定のAタグをクリックして表示されたページの情報の取得したい、というものになります。
ターゲットのサイトを例えとして
http://abchoge.co.jp/login
とすると、まずこのサイトをNavigateして次にFor EachでInputタグを探し
該当の箇所にユーザー名とパスを入れ、同様にSubmitボタンを探し
Clickすると、画面はログイン成功後のページに遷移するのですが、
この遷移後のページのタグ等の情報が取得できないのです。
具体的にはログイン成功して画面が遷移した後も
objIeオブジェクトの内容が遷移前のログイン画面の情報のままになっており、
更新されていないようです。更新する方法や
または現在ブラウザに表示されているページ内の情報を取得する方法は
ありませんでしょうか?
ちなみにどういうわけか
ログイン画面のClickメソッドを実行する箇所にブレークポイントを
設け、手動でステップインしてログインするとうまくobjIeオブジェクトの内容が
遷移後のページ情報のものに更新されますが、全自動が望ましいです。
コードは以下のようになります。
Dim objIe As Object
Dim a As Object
Set objIe = CreateObject("internetexplorer.application")
objIe.Visible = True
objIe.navigate "http://abchoge.co.jp/login"
Do While objIe.Busy = True Or objIe.readyState <> 4
DoEvents
Loop
For Each a In objIe.document.all.tags("input")
If a.Name = "id" Then
a.Value = "id"
End If
Next
For Each a In objIe.document.all.tags("input")
If a.Name = "pass" Then
a.Value = "pass"
End If
Next
For Each a In objIe.document.all.tags("input")
If a.Name = "submit" Then
a.Click 'ここでブレークポイントを設け手動でステップインで実行するとobjIeの情報は更新されるのですが・・・
End If
Next
Do While objIe.Busy = True Or objIe.readyState <> 4
DoEvents
Loop
'↑ここまではログイン成功となり画面も遷移してうまくいきます
'↓ここであるはずの目的のAタグが見つからず失敗します(objIeの情報が遷移前のまま更新されていない)
For Each a In objIe.document.all.tags("a")
If a.Innertext = "target" Then
a.Click
End If
Next
ちなみにこのサイトは社内のイントラネットのものとなり、
社内PC以外からは通常アクセス不可能です。
またログイン後のページのURLもログイン画面のURLと同じもの
(両者http://abchoge.co.jp/login)となっており、
少し特殊?な作りとなっているサイトになります。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
0
以下のページを参考に「ページが完全に表示されるまで待機」させてみてはどうでしょうか?
エクセルVBAでInternetExplorerが完全に読み込まれるまで処理を待機するサブルーチン「ieCheck」
Do While objIE.document.ReadyState <> "complete"
先ほどはInternetExplorerオブジェクトの状態を対象にチェックしましたが、
こちらではDocumentオブジェクトの状態を対象にチェックをしています。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
InternetExplorerMedium か、IInternetExplorerManager を使うとか。
https://gist.github.com/kumatti1/6b68ea65fdfc9ecf727f
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.36%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2016/04/10 10:29
While objIE.document.ReadyState <> "complete"
で試してみましたが結果は同じでページ遷移後の情報は取得できませんでした。
2016/04/11 13:14
また次のようにすることでログイン後の情報を取得できました。
'Sleep(待機)関数を使うためのAPI宣言
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Dim objWin As Object
For Each objWin In CreateObject("Shell.Application").Windows
Sleep (1000)
'Debug.Print "LocationURL = " & objWin.LocationURL
If objWin.LocationURL = "http://abchoge.co.jp/after_login" Then
Set objIe = objWin
Exit For
End If
Next
For Each a In objIe.document.all.tags("a")
'~略~
手元の確認ではログイン画面とログイン後画面のURLは別のものでした。
そのためobjWin.LocationURLでログイン後の画面を"URLで"探すことができました。
同じURLなのでこの手と全く同じ手ではうまくいかない可能性があります。
取得したWindowに対してそのページが正しいログイン画面かを確認してから、
目的のタグを探す必要があると思います。
参考ページ:
TypeNameとShell.Applicationを使い起動済みのIEを探す
http://www.ken3.org/vba/backno/vba156.html
2016/06/11 08:09
来週テストしてみます。ありがとうございました。
2016/06/18 00:02
こちらの方法でうまくいけそうです。ありがとうございました。