[[20180620190510]] 『起動済のIEの任意のタブを取得したい』(ぬるぬる) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『起動済のIEの任意のタブを取得したい』(ぬるぬる)

ネット上を捜索して、VBA上で既に起動されたIEを発見することはできました。
その上で、既に開かれているタブのタイトルやURLを検索して合致したタブをアクティブにした上で、Navigateしたいと考えております。

タブの検出については下記の記事で同じ投稿があったようですが、本文のリンク先のURLが(自社のアクセス制限で)閲覧不能なため、どのようなコードを掛けば良いのか知りたいのですが、教えて頂けないでしょうか。
[[20091129091530]]

Private Declare Function FindWindow Lib "user32" _

    Alias "FindWindowA" ( _
    ByVal lpClassName As String, _
    ByVal lpWindowName As String) As Long

Function GetIE() As Object

    Dim hWnd As Long
    hWnd = FindWindow("IEFrame", vbNullString)
    Set GetIE = GetWindowForHwnd(hWnd)
End Function

'hWndからウィンドウのオブジェクトを返す
Function GetWindowForHwnd(hWnd As Long) As Object

   Dim wn As Object
   Set GetWindowForHwnd = Nothing
   For Each wn In CreateObject("shell.application").Windows
      If wn.hWnd = hWnd Then
         Set GetWindowForHwnd = wn
         Exit For
      End If
   Next
End Function

Sub Sample()

    Dim ie As Object
    Set ie = GetIE()
    '↓任意のタブ(タイトル名orURLでマッチ)をアクティブにしてからページを移動したい
    ie.Navigate "http://google.co.jp"
End Sub

< 使用 Excel:Excel2016、使用 OS:Windows10 >


んー、IEならAPIを使わずとも、任意のタブを見つけるのはできるのですが、そのタブをアクティブにするのが面倒です。新しいタブで開く事でアクティブにさせ、見つけたタブは閉じてしまう、というのでは駄目でしょうか?
(目的のタブは、LocationName または LocationURLプロパティで判定すれば良いでしょう)

 Sub test()
    Const navOpenInNewTab = &H800
    Dim W As Object

    For Each W In CreateObject("Shell.Application").Windows
        If W.Name = "Internet Explorer" And W.LocationName = "Google" Then
            W.Navigate2 "http://www.excel.studio-kazu.jp", navOpenInNewTab
            W.Quit
            Exit For
        End If
    Next W
 End Sub
(???) 2018/06/21(木) 09:26

>If W.Name = "Internet Explorer" And W.LocationName = "Google" Then
昨日試した時はダメだったのでFindWindowを使ったのですが、今日はちゃんと動きました。

>新しいタブで開く事でアクティブにさせ、見つけたタブは閉じてしまう、というのでは駄目でしょうか?
盲点でした。この方法で行きたいと思います。
(ぬるぬる) 2018/06/21(木) 09:45


すいません。
上記コードでは問題が見つかりました。
> W.Navigate2 "http://www.excel.studio-kazu.jp", navOpenInNewTab
> W.Quit
こうしたことにより、Wの内容が破棄されてしまうため、別の目的でIEを操作したい時はWを再度取得しなければなりません。

しかし再取得するためには、Navigate2 の処理の完了待ちをしなければなりません。

完了待ちをするためには、通常こういったコードを書きますが、

    Do While ie.Busy = True Or ie.readyState <> 4
        DoEvents
    Loop
そもそもieを取得したいわけですから、堂々巡りになってしまいます。
暫定処置として、一定秒数スリープさせてから再取得していますが、出来れば確実に読み込みが終わるのを待ちたいです。

どうか知恵をお貸し下さい。
(ぬるぬる) 2018/06/21(木) 11:20


完了待ちは、元のWに対して行えば良いような? そして、Documents等を調べるには、別タブだから、開く時に使ったWとは違うオブジェクトなので、表示切り替え後、同じループで今度は LocationURL が開き直したページと一致するものを探せば、それが追加したタブのオブジェクトかと思いますが、いかがでしょう?(URL比較の際、後ろに"*"を付加しても良いですが、同じホームページの他のページを開いていたときに、開き直したほうでないものを見つける場合があります)
 Sub test()
    Const cURL = "http://www.excel.studio-kazu.jp/"
    Const navOpenInNewTab = &H800
    Dim W As Object
    Dim IE As Object

    For Each W In CreateObject("Shell.Application").Windows
        If W.Name = "Internet Explorer" And W.LocationName = "Google" Then
            W.Navigate2 cURL, navOpenInNewTab
            Call sWait(W)
            W.Quit
            DoEvents
            Exit For
        End If
    Next W

    If Not W Is Nothing Then
        For Each W In CreateObject("Shell.Application").Windows
            If W.Name = "Internet Explorer" And W.LocationUrl Like cURL Then
                Exit For
            End If
        Next W

        If Not W Is Nothing Then
            Set IE = W
            MsgBox IE.LocationUrl
        End If
    End If
 End Sub

 Sub sWait(OBJ As Object)
    DoEvents
    While OBJ.ReadyState <> 4
        While OBJ.Busy = True
            DoEvents
        Wend
    Wend
 End Sub
(???) 2018/06/22(金) 09:40

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.