質問をすることでしか得られない、回答やアドバイスがある。

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

ただいまの
回答率

90.49%

  • VBA

    1858questions

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

  • Excel

    1592questions

    Excelは、マイクロソフト社が開発しているデータ集計や分析を行う表計算ソフトの一つです。文書作成や表計算、資料作成などの多彩な機能を備えており、統合パッケージであるMicrosoft Officeに含まれています。

  • VB

    309questions

    VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

  • Internet Explorer

    294questions

    Internet Explorer(IE;MSIE)はマイクロソフトが開発したウェブブラウザです。Microsoft Windowsに組み込まれています。

Excel VBA のinternetexplorer.applicationを使用して あるサイトの情報を自動取得していたのですがうまくいきません。

解決済

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 2,206

hyouma

score 5

あるサイトの情報を自動取得したいのですがうまくいきません。

やりたいこととしては自動ログインしてログイン成功後のページ
の特定の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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

以下のページを参考に「ページが完全に表示されるまで待機」させてみてはどうでしょうか?

エクセルVBAでInternetExplorerが完全に読み込まれるまで処理を待機するサブルーチン「ieCheck」

Do While objIE.document.ReadyState <> "complete"
先ほどはInternetExplorerオブジェクトの状態を対象にチェックしましたが、
こちらではDocumentオブジェクトの状態を対象にチェックをしています。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 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

    時間があまり取れず細かいテストはできませんでしたが、
    こちらの方法でうまくいけそうです。ありがとうございました。

    キャンセル

0

InternetExplorerMedium か、IInternetExplorerManager を使うとか。
https://gist.github.com/kumatti1/6b68ea65fdfc9ecf727f

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.49%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • VBA

    1858questions

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

  • Excel

    1592questions

    Excelは、マイクロソフト社が開発しているデータ集計や分析を行う表計算ソフトの一つです。文書作成や表計算、資料作成などの多彩な機能を備えており、統合パッケージであるMicrosoft Officeに含まれています。

  • VB

    309questions

    VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

  • Internet Explorer

    294questions

    Internet Explorer(IE;MSIE)はマイクロソフトが開発したウェブブラウザです。Microsoft Windowsに組み込まれています。

  • トップ
  • VBに関する質問
  • Excel VBA のinternetexplorer.applicationを使用して あるサイトの情報を自動取得していたのですがうまくいきません。