次の方法で共有


IWebBrowser2オブジェクトのDocumentプロパティとNavigate2メソッドで失敗する

質問

2016年3月30日水曜日 3:16

指定のURLを起動中のIEから新規タブで開こうとしています。
そのため次のコードを作成しました。

よく見る形のコードだとは思うのですが、その中の2箇所の挙動がよく理解出来ません。

  1.  (中段 [For Each]文中の) 「objWin.document」 実行時エラー

    IE以外のウィンドウは問題無くスキップされます。
    IEのウィンドウがobjWinにセットされた時にobjWin.documentで
    「'Document' メソッドは失敗しました:'IWebBrowser2'オブジェクト」と出る時があります。出ない時もあり、差が不明です。
    なお、IE側のタブは全て読み込み完了しています。

  2. (下段の) 「objIE.Navigate2」で Flagsが効かない。

    ここのNavigate2メソッドを実行すると、「起動中のIEの先頭タブでURLを開く」という挙動をします。
    少なくとも objIE、strURLは正しく設定出来ているようです。
    ブレークポイントを置いてlngFlagを見てみましたが 2048 となっていました。
    念の為「If lngFlag = 2048 Then objIE.Navigate2 strURL, lngFlag」としても、If節がTrueと評価されています。

    しかし 「objIE.Navigate2 strURL, 2048」 と直接記述すると、意図通り新規タブで開いてくれます。

どなたかご教示願えますでしょうか。

'※ 参照設定:Microsoft HTML Object Library / Microsoft Internet ControlsSub ieNavigate(strURL As String, Optional ByVal OpenInNewWindow As Boolean)

Dim objIE       As InternetExplorer
Dim objShell    As Object
Dim objWin      As Object
Dim lngFlag     As Long
  
  If OpenInNewWindow = True Then
      lngFlag = 1         'navOpenInNewWindow = 1
  
  Else
    lngFlag = 2048      'navOpenInNewTab = 2048

    Set objShell = CreateObject("Shell.Application")

    '起動中のウィンドウからIEを探す
    For Each objWin In objShell.Windows
        If objWin.Name = "Internet Explorer" And _
           TypeName(objWin.document) = "HTMLDocument" Then      '【質問1】objWin.document 実行時エラー
        
            '起動中のIEがあれば最初のウィンドウオブジェクトをセット
            Set objIE = objWin
            Exit For

        End If
    Next

  End If
  
    'OpenInNewWindow=True or 起動中IEなし > IEを新規ウィンドウで開く
    If objIE Is Nothing Then Set objIE = CreateObject("InternetExplorer.Application")

    '指定したURLを表示
    On Error Resume Next
    Err.Clear
    objIE.Navigate2 strURL, lngFlag      '【質問2】objIE.Navigate2のlngFlag(2048に置換で正しく動作)

    If Err.Number > 0 Then
        Set objIE = CreateObject("InternetExplorer.Application")
        objIE.Navigate2 strURL, lngFlag
    End If
    
    objIE.Visible = True


End Sub

すべての返信 (2)

2016年3月30日水曜日 4:08 ✅回答済み

「'Document' メソッドは失敗しました:'IWebBrowser2'オブジェクト」と出る時があります。出ない時もあり、差が不明です。

例えば、すでに閉じられてしまったIEを見つけてしまってDocumentを読もうとすると失敗しますね。
他にもあるでしょうが、Documentが操作できない状態になっているのでしょう。

(下段の) 「objIE.Navigate2」で Flagsが効かない。

lngFlagをLongではなくVariantで宣言してみてください。

個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)


2016年3月30日水曜日 5:30

例えば、すでに閉じられてしまったIEを見つけてしまってDocumentを読もうとすると失敗しますね。

つまり、「ウィンドウを閉じる=Shell.Windowsコレクションから無くなる」というわけではないんですね。
プロセスか何かが残っていたのかもしれません。

MSDNには「This object represents a collection of all of the "open windows" that belong to the Shell.」
とあるので閉じられたものはコレクションに入らないのかと思っていました。

Shell.Windows method :
https://msdn.microsoft.com/ja-jp/library/windows/desktop/bb774107(v=vs.85).aspx

とりあえず、ユーザーの想定する「IEが起動中である」状態とは異なると思いますので
On Error でトラップしようと思います。

lngFlagをLongではなくVariantで宣言してみてください。

Variant型にしたら上手くいきました!助かりました。

ただ、どういった理屈なのかがよく分かりません。
差し支えなければ参考情報をいただけませんでしょうか。

なお、Longのままで 「objIE.Navigate2 strURL, CLng(lngFlag)」としても上手くいきました。

・認識されない
・・lngFlag      '←Long型変数

・認識される
・・lngFlag      '←Variant型変数(今回は2048を代入のため内部Integer型)
・・Clng(lngFlag)    '←Long型変数の値をLong型に変換