質問
2016年3月30日水曜日 3:16
指定の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 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型に変換