- ベストアンサー
VBAコードで複数のタブを操作する方法とは?
- VBAを使用して複数のタブを操作する方法について教えてください。
- VBAのコードで二つ目のタブにURLを入力する方法を教えてください。
- objIE.Navigate2とFor Each構文を使って二つ目のタブを操作する方法を教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。お邪魔します。 やり方は多数ありますけれど、 とりあえず、 ie.Navigate2 url, navOpenInNewTab で開いた'新しいタブ'をIEオブジェクトとして捉えるのには、 Shell を使う方法が一番簡単ですし、一般的です。 ご提示のコードでは「2ページ目のタブ」を objIE.Navigate2 で追加していますが、 objIEそのものは変わらず「1ページ目のタブ」を捉えたままです。 今回の問題は「2ページ目のタブを如何にして捉えるか」の一点に絞られます。 ご提示のコードの修正という意味では既に正解は出ていると思いますが、 少し設計を替えたものを参考として提案してみようかと思いました。 .NavigateしたIEも.Navigate2したIEも一様に ループの中で捉える(捉え直す)ようにして、 本来は非同期の処理を同期っぽく扱ってWaitの時間を減らすことと、 ' ' input 'URL:' ' ' click 'チェック' という一様で共通した処理をする為の既述の繰り返しを1ヶ所に纏める、 ことを意図して書きました。 Array()関数の中身(URL)を自在に指定して要素の数だけループします。 各コントロールの捉え方もより直接的なものに変えています。 勿論、クラスモジュールを使うとか、Win32API使うとか、 もっと発展させることも出来ますし、本当に色んなやり方がある中の、 ほんの一例に過ぎませんが、 ひとつのモジュール内での shell.Windows の扱い方として 一時期私が多用した書き方を今回の課題に合わせて書き直したものです。 (参照設定(3件)を正しく設定しないと動かないように書いてあります) (DoEvents を踏襲していますが この場合はSleep関数に置き換えた方が 一貫性のある書き方にはなります(今回は非APIで揃えたかったので省略)。) そのまま使うことはなくとも、部分的にでも参考になることでもあれば、と思っています。 ' ' 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓 ' ' 参照設定(3件) ' ' ■ Microsoft Shell Controls And Automation ■ Shell32 ' ' ■ Microsoft Internet Controls ■ SHDocVw ' ' ■ Microsoft HTML Object Library ■ MSHTML ' ' 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓 Option Explicit Sub Re8939992() Const URL_lint = "http://www.htmllint.net/html-lint/htmllint.html" Const navOpenInNewTab As Long = &H800& ' = 2048 Const navOpenInBackgroundTab As Long = &H1000& ' = 4096 ' ' ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー Dim objShell As Shell32.Shell Dim objIE As SHDocVw.InternetExplorer Dim colElms As MSHTML.IHTMLElementCollection Dim arrUrl() ' origin 0 Dim cnWnd As Long Dim tn As Long ' origin 0 Dim cn As Long ' origin 0 Dim i As Long ' ' ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー ' ' URL を配列で指定 ' arrUrl() = Array("http://www.yahoo.co.jp/") ' ←1つだけの場合 arrUrl() = Array("http://www.yahoo.co.jp/", _ "https://www.google.co.jp/") ' ←2つの場合 ' arrUrl() = Array("http://www.yahoo.co.jp/", _ "https://www.google.co.jp/", _ "http://www.bing.com/") ' ←3つの場合、、、のようにカンマ区切りで指定 ' ' 配列の要素数(0から数えるので=実際の要素の数 - 1)= .Navigate2 する回数 tn = UBound(arrUrl()) ' ' ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー ' ' objShell.Windows で 逐一 エクスプローラ を捉える為のShell オブジェクト Set objShell = New Shell32.Shell ' Set objShell = CreateObject("Shell.Application") ' ' objShell.Windows.Count = エクスプローラ(Windows+Internet)の数、初期値 cnWnd = objShell.Windows.Count ' ' ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー ' ' IEインスタンス生成・表示 Set objIE = New SHDocVw.InternetExplorer ' Set objIE = CreateObject("InternetExplorer.Application") objIE.Visible = True ' ' 普通に.Navigate objIE.Navigate URL_lint ' ' ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー ' ' .Navigate2 をtn回数分 一気に纏めて実行(↓アクティブタブを移動させない/↓させる) For i = 1 To tn objIE.Navigate2 URL_lint, navOpenInBackgroundTab ' navOpenInNewTab Next i Set objIE = Nothing ' ' ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー Do ' ' objShell.Windows.Count で 今処理したい エクスプローラ が読み込まれるまで待機。 Do While objShell.Windows.Count < cnWnd + cn + 1 DoEvents Loop ' ' ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー ' ' 読込まれた順番(.Navigate2の順番とは違う場合あり)に各タブを捉えて処理 With objShell.Windows(cnWnd + cn) ' ' As InternetExplorer (IE_tab) ' ' Wait (殆どの場合で、直前のShell.Windowsに対するWaitで済み) Do While .Busy Or .readyState <> READYSTATE_COMPLETE ' READYSTATE_COMPLETE = 4 DoEvents Loop ' ' ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー With .Document ' As MSHTML.HTMLDocument ' ' input 'URL:' Set colElms = .getElementsByName("URL") colElms(0).Value = arrUrl(cn) ' 配列の要素のURL を順に指定 DoEvents ' ' click 'チェック' Set colElms = .getElementsByClassName("vert-mid") colElms(0).Click End With End With ' ' ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー ' ' 次に処理する番号 cn = cn + 1 Loop Until cn > tn ' 配列の要素数を超えたらループを抜けて終了 ' ' ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー Set colElms = Nothing: Set objShell = Nothing End Sub ' ' 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
その他の回答 (2)
- watabe007
- ベストアンサー率62% (476/760)
参考に >Call wait >objIE.Navigate2 "http://www.htmllint.net/html-lint/htmllint.html", 2048 > Call wait Dim objIE2 As Object Dim objShell As Object Set objShell = CreateObject("Shell.Application") '3秒待機 Application.wait [Now() + "0:00:03"] 'アクティブタブを取得 With objShell.Windows Set objIE2 = .Item(.Count - 1) End With For Each myObj In objIE2.Document.all.tags("input") 'objIE → objIE2 に変更 > If myObj.Name = "URL" Then
すみません。答えではありませんが_ これはVBAであって、Excelではありません。すみません。
お礼
ありがとうございました。