自分方位研究所

日々の活動記録

VBA。起動済みIE (Internet Explorer)で新しくタブを開き、そのタブを制御する。

2/28の続きです。前回の記事では、新しいタブを開くところまでできましたが、きょうは、その新しく開いたタブをオブジェクト化して制御できるようにします。

制御するといっても、制御の前段階。先ずはオブジェクト化して「捕まえる」というところまでをやります。

debug.print と注釈で長くなってしまいましたが、処理として追加したのは以下の2行のみです。

Dim objIE2 As Object
Set objIE2 = objShell.Windows(objShell.Windows.Count - 1)

objIE2 に新しく開いたタブをオブジェクトとしてセットできました。

以降は、objIE2 で色々制御ができます。

 この新しく開いたタブをオブジェクトとして取得するコードは、三流君ken3さんの以下の記事を参考にしました。ありがとうございます。2011年に投稿された記事です。

ken3memo.hatenablog.com

 

三流君ken3さんの記事を参考にしておしまいでは、あまりにも芸がないので、シェルの指定方法 「objShell.Windows(起動番号)」について、簡単に検証してみました。

コード中に、説明など入れてみましたので、実行しつつ、眺めていただければわかるかなと思います。

Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Sub OpenIE_SetNewTab()

Debug.Print "---------------------------"
Debug.Print "***** " & Now & " ***** Sub OpenIE_SetNewTab()"

Dim objShell As Object
Set objShell = CreateObject("Shell.Application")
Debug.Print "◆現在の起動シェル数: "; objShell.Windows.Count
'ここで認識されているシェルとは、エクスプローラーとIE だけ・・・かな?
'・IShellFolderViewDual3 : エクスプローラー(フォルダ管理の)
'・HTMLDocument : IEで表示されている1タブ
'--------------------------------------------------

Dim i As Integer
i = 1

'現在の起動シェルを表示
Dim objWindow As Object
For Each objWindow In objShell.Windows
    Debug.Print i & ") " & _
    TypeName(objWindow.document), objWindow.locationurl
    i = i + 1
Next

'--------------------------------------------------
Debug.Print "--- 逆に、シェルの起動番号からシェルを表示 ---"
'数値で指定するときは 「0ゼロ」から始まります。
Dim c   'integer とか Long とかを指定するとエラーが発生しました。
For c = 0 To objShell.Windows.Count - 1
    Debug.Print c + 1 & ") " & _
    TypeName(objShell.Windows(c).document), objShell.Windows(c).locationurl
Next
'--------------------------------------------------

Dim TGTpageURL As String    '表示したいURL
TGTpageURL = "https://hatenablog.com/"

Dim objIE As Object
Set objIE = CreateObject("InternetExplorer.Application")
objIE.Visible = True
objIE.Navigate TGTpageURL   '指定URLを開く

'ページが開くまで待機
Do While objIE.ReadyState <> 4 Or objIE.Busy = True
    DoEvents
Loop

Debug.Print " ***** 1つ目のページが開きました。", Now
Debug.Print "objIE  URL:"; objIE.document.Url
Debug.Print "◆現在の起動シェル数: "; objShell.Windows.Count

Set objShell = CreateObject("Shell.Application")
Debug.Print objShell.Windows.Count

'--------------------------------------------------
Dim TGTpageURL2 As String    '追加で表示したいURL
TGTpageURL2 = "https://hatenablog.com/guide/academy"

MsgBox "新しくタブを開きます。" & vbCrLf & "URL: " & TGTpageURL2


objIE.Navigate2 TGTpageURL2, &H800    '新しくタブを開く
'objIE.Navigate2 TGTpageURL2, 2048

'この状態で新しいタブに別のURLが表示されますが、
'まだ新しいタブの表示完了を検知できないので(つかまえていない)、
'とりあえず「3秒」ほど 待ってみます。
'Sleepを利用するには、このモジュールの先頭に以下のコードを入れて下さい。
'Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Sleep 3000  '3秒待つ

Debug.Print " ***** 2つ目のページが開きました。", Now
Debug.Print "◆現在の起動シェル数: "; objShell.Windows.Count

'***********************************************************
'これが、直近に開いたタブのオブジェクトの一発取得コードです。
Dim objIE2 As Object
Set objIE2 = objShell.Windows(objShell.Windows.Count - 1)
'シェルを番号で指定するときは0から始まるので、
'シェルの起動数から1引いています。
'シェルの番号は起動順に割り振られていくので、
'一番大きい数値が、一番最後に起動したシェルというわけです。
'***********************************************************

Debug.Print "objIE2 URL:"; objIE2.document.Url
Debug.Print "objIE2 URL:"; objIE2.locationurl
Debug.Print "↑このURLが2番目に指定したURLであれば成功です。"
'もし、objIE2 URL:about:blank とかになっていたら、
'Sleep の時間を、もう少し大きくする必要があります。
'---------------------------------------------------
'この方式だと、最後に開いたのがたまたま新しいタブという気がします。
'なので 新しくつかんだオブジェクトのURLの確認が必要です。
'もし違うのをつかむようなら、ぐるぐる回して見つけるのが確実かと。

End Sub

 以上です。

 

objIE2.locationurl  について

VBAで扱えるシェルのタイプは

・IShellFolderViewDual3 : エクスプローラー(フォルダ管理の)
・HTMLDocument : IEで表示されているタブ

の二つだけのようなのですが

.locationurl  を使用すると、シェルタイプがエクスプローラーのときは、現在参照しているフォルダのディレクトリ階層を書き出し、IEの場合だと、そのタブのURLを書き出してくれます。

 

今日までで、IEのページ操作に必要なオブジェクトのつかまえ方について調べてきました。次は、実際にIEを制御する処理の流れに組み込めるようなコードを作っていきたいと思います。