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

質問
-
指定のURLを起動中のIEから新規タブで開こうとしています。
そのため次のコードを作成しました。
よく見る形のコードだとは思うのですが、その中の2箇所の挙動がよく理解出来ません。- (中段 [For Each]文中の) 「objWin.document」 実行時エラー
IE以外のウィンドウは問題無くスキップされます。
IEのウィンドウがobjWinにセットされた時にobjWin.documentで
「'Document' メソッドは失敗しました:'IWebBrowser2'オブジェクト」と出る時があります。出ない時もあり、差が不明です。
なお、IE側のタブは全て読み込み完了しています。
- (下段の) 「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 Controls
Sub 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 NextErr.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
- 編集済み junnny 2016年3月30日 3:24
- (中段 [For Each]文中の) 「objWin.document」 実行時エラー
回答
-
「'Document' メソッドは失敗しました:'IWebBrowser2'オブジェクト」と出る時があります。出ない時もあり、差が不明です。
例えば、すでに閉じられてしまったIEを見つけてしまってDocumentを読もうとすると失敗しますね。
他にもあるでしょうが、Documentが操作できない状態になっているのでしょう。
(下段の) 「objIE.Navigate2」で Flagsが効かない。
lngFlagをLongではなくVariantで宣言してみてください。
個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)
- 回答としてマーク junnny 2016年3月30日 5:39
すべての返信
-
「'Document' メソッドは失敗しました:'IWebBrowser2'オブジェクト」と出る時があります。出ない時もあり、差が不明です。
例えば、すでに閉じられてしまったIEを見つけてしまってDocumentを読もうとすると失敗しますね。
他にもあるでしょうが、Documentが操作できない状態になっているのでしょう。
(下段の) 「objIE.Navigate2」で Flagsが効かない。
lngFlagをLongではなくVariantで宣言してみてください。
個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)
- 回答としてマーク junnny 2016年3月30日 5:39
-
例えば、すでに閉じられてしまった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型に変換
- 編集済み junnny 2016年3月30日 5:36