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

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

ただいまの
回答率

89.63%

VBAで取得済みIEのHTMLを取得する

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 143

kuron_c

score 0

前提・実現したいこと

VBAで取得済みIEのHTMLを取得すること

発生している問題・エラーメッセージ

<HTMLの取得について>

Call tagClick(objIE, "a", "文字列1")
はうまくいくのですが、

Debug.PrintobjIE.document.all(0).outerHTML
Call tagClick(objIE, "a", "文字列2")
がうまくいきません。エラーは出ませんが、リンクをクリックできません。

該当のソースコード

'-----------------------Main------------------------
Sub Main()
    Dim objIE As InternetExplorer
    Dim objLink As Object

    Call ieView(objIE, "ログイン画面のURL")

    objIE.document.getElementsByName("IDのHTML")(0).Value = "ID"
    objIE.document.getElementsByName("PASSのHTML")(0).Value = "PASS"
    objIE.document.getelementbyid("ログインボタンのHTML").Click

    Set objIE = 最新画面
    Call ieCheck(objIE)
    Call tagClick(objIE, "a", "文字列1")

    Set objIE = 最新画面
    Call ieCheck(objIE)



'以下問題個所 ↓>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>



    Debug.Print "  URL:" & objIE.document.Url
    Debug.Print objIE.document.all(0).outerHTML

    Call tagClick(objIE, "a", "文字列2")

'問題点_______________________________________________
Call tagClick(objIE, "a", "文字列1")
はうまくいくのですが、

Debug.PrintobjIE.document.all(0).outerHTML
Call tagClick(objIE, "a", "文字列2")
がうまくいきません。

IEオブジェクトを紛失していると思い、再取得のコードを付け加えた(最新画面)のですが、うまくいきませんでした。Debug.Print "  URL:" & objIE.document.Url
で操作したいIEオブジェクト(objIE)を掴んでいることは確認済みです。しかし、そのIEオブジェクトのHTMLが一切操作できません。機密性の問題でしょうか? 
'_________________________________________________




'以上問題個所 ↑>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>




End Sub
'-----------------ieView----------------------
Sub ieView(objIE As InternetExplorer, urlName As String, Optional viewFlg As Boolean = True)
    Debug.Print ">>> ieView"
    Set objIE = CreateObject("InternetExplorer.Application")

    objIE.Visible = viewFlg

    objIE.navigate urlName

    Call ieCheck(objIE)
End Sub
'-----------------ieCheck-------------------
Sub ieCheck(objIE As InternetExplorer)
    Debug.Print ">>> ieCheck"
    Dim timeOut As Date
    timeOut = Now + TimeSerial(0, 0, 20)
    Do While objIE.Busy = True Or objIE.readyState <> 4
        DoEvents
        If Now > timeOut Then
            objIE.Refresh
               timeOut = Now + TimeSerial(0, 0, 20)
        End If
    Loop
    timeOut = Now + TimeSerial(0, 0, 20)
    Do While objIE.document.readyState <> "complete"
        DoEvents
        If Now > timeOut Then
            objIE.Refresh
            timeOut = Now + TimeSerial(0, 0, 20)
        End If
    Loop
End Sub
'---------------------tagclick------------------
Sub tagClick(objIE As InternetExplorer, tagName As String, tagStr As String)
    Debug.Print ">>> tagclick"

    Dim objTag As Object

    For Each objTag In objIE.document.getElementsByTagName(tagName)
        Debug.Print "      L___ " & objTag.innerHTML
        If InStr(objTag.outerHTML, tagStr) > 0 Then
            objTag.Click
            Call ieCheck(objIE)
            Exit For
        End If
    Next
End Sub
'--------------------最新画面-----------------
Function 最新画面() As Object
    Debug.Print ">>> 最新画面"
    Dim objShell As Object, n As Long
    Set objShell = CreateObject("Shell.Application")
    For n = objShell.Windows.Count To 1 Step -1
        If TypeName(objShell.Windows(n - 1).document) = "HTMLDocument" Then
            Set 最新画面 = objShell.Windows(n - 1)
            Exit For
        End If
    Next n
    Debug.Print "      L___ Title: " & 最新画面.document.Title
    Set objShell = Nothing




End Function
'----------------------getLink-------------------
Sub goLink(objIE As InternetExplorer, str As String)
    Debug.Print ">>> goLink: " & str
    For Each Tag In objIE.document.getElementsByTagName("a")
        If InStr(Tag.innerHTML, str) > 0 Then
            Tag.Click
            Call ieCheck(objIE)
            Exit For
        End If
    Next
End Sub

試したこと

IEオブジェクトを紛失していると思い、再取得のコードを付け加えた(最新画面)のですが、うまくいきませんでした。
Debug.Print "  URL:" & objIE.document.Url
で操作したいIEオブジェクト(objIE)を掴んでいることは確認済みです。
しかし、そのIEオブジェクトのHTMLが一切操作できません。機密性の問題でしょうか? 

補足情報(FW/ツールのバージョンなど)

Excel 2016 32 bit
InternetExplorer 11
サイトの保護モードはすべて有効

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • kuron_c

    2020/02/23 15:04

    目的はログインとHTMLに含まれるデータの取得なので、VBA以外の方法で実現する可能性がありましたら、ご教示願いたいです。

    キャンセル

  • Lhankor_Mhy

    2020/02/25 10:04

    document.all(0) は、何を返すコードなのですか?
    MSDNで検索してみましたが、それらしいものを見つけることができませんでした。ドキュメントなどがあれば教えてください。

    キャンセル

  • Lhankor_Mhy

    2020/02/25 10:09

    ああ、すみません、勘違いです。

    キャンセル

回答 1

+2

きっちりとした回答ではないですが、当方で経験した事例です。

(1)保護モード
保護モードの違うページに移動することによって、DOM参照時にオートメーション
エラーが発生し、DOM配下が一切参照できなくなることがあります(その場合でも
document.titleや.urlは参照できる)。
【参考】
(デクノスティック)IE の保護モードの違いによって整合性レベルの切り替えの有無が変わりオートメーションの操作に影響が出る場合がある
http://dechnostick.hatenablog.com/entry/2015/01/27/032113
(Qiitaコミュニティ)Excel VBAでIE操作時にオートメーションエラーが出た時は、対象のURLが「信頼済みサイト」に登録されているからかもしれない
https://qiita.com/3mc/items/da045e86d25ef697ec43

※上記が原因ならばおそらく↓のdocument.all(0).outerHTMLでエラーが
出ます。今回はエラーが出ていないとのことですので該当しない
かもしれませんが…
>Debug.PrintobjIE.document.all(0).outerHTML
>Call tagClick(objIE, "a", "文字列2")

(2)JavaScript
対象のaタグが単純なリンクではなくスクリプトやCSSで動作するように
なっている場合は、そのスクリプトを直接呼び出さないと動作しないことが
あります。

(3)そのほか原因不明
原因不明ですが、DOMにアクセスでき、aタグが参照できるのであれば
clickの代わりに、aタグのhref属性からURLを生成し、直接ナビゲーション
してしまうとうまくいくことがあります。
【サンプル】

  set objA=該当のAタグのオブジェクト
  objIE.navigate(objIE.document.Location.protocol & "//" & objIE.document.Location.host & objA.getAttribute("href"))


※↑ここではaタグのリンクが相対パスで書かれていると仮定してプロトコルとホストを補っていますが、絶対パスなら不要です。一度該当aタグの内容を
確認してください。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/02/23 15:01

    返信ありがとうございます。


    (1)Mediumで実行しましたが、出力は変更前と同様でした。

    (2)"文字列2"のリンクはjsで書かれていました。(doPostBackLink:)
         "文字列1"もjsでかかれており、(enablePostBackLink:)でした。
         ポストバックリンクが何か関係しているのかもしれません。
         (jsについては勉強中です、、、)

    (3)frame取得時にアクセス拒否されたので、おそらくDOMを取得できていません。


    やはり、セキュリティーの都合上、HTMLを取得できない仕様になっているような気がしています、、、。

    キャンセル

  • 2020/02/23 15:05

    目的はログインとHTMLに含まれるデータの取得なので、VBA以外の方法で実現する可能性がありましたら、ご教示願いたいです。

    キャンセル

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

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