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
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 "--- 逆に、シェルの起動番号からシェルを表示 ---"
Dim c
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
TGTpageURL = "https://hatenablog.com/"
Dim objIE As Object
Set objIE = CreateObject("InternetExplorer.Application")
objIE.Visible = True
objIE.Navigate TGTpageURL
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
TGTpageURL2 = "https://hatenablog.com/guide/academy"
MsgBox "新しくタブを開きます。" & vbCrLf & "URL: " & TGTpageURL2
objIE.Navigate2 TGTpageURL2, &H800
Sleep 3000
Debug.Print " ***** 2つ目のページが開きました。", Now
Debug.Print "◆現在の起動シェル数: "; objShell.Windows.Count
Dim objIE2 As Object
Set objIE2 = objShell.Windows(objShell.Windows.Count - 1)
Debug.Print "objIE2 URL:"; objIE2.document.Url
Debug.Print "objIE2 URL:"; objIE2.locationurl
Debug.Print "↑このURLが2番目に指定したURLであれば成功です。"
'---------------------------------------------------
End Sub
以上です。
objIE2.locationurl について
VBAで扱えるシェルのタイプは
・IShellFolderViewDual3 : エクスプローラー(フォルダ管理の)
・HTMLDocument : IEで表示されているタブ
の二つだけのようなのですが
.locationurl を使用すると、シェルタイプがエクスプローラーのときは、現在参照しているフォルダのディレクトリ階層を書き出し、IEの場合だと、そのタブのURLを書き出してくれます。
今日までで、IEのページ操作に必要なオブジェクトのつかまえ方について調べてきました。次は、実際にIEを制御する処理の流れに組み込めるようなコードを作っていきたいと思います。