TBoulz
TBoulz

Reputation: 351

Get an active IE window by partial URL

I currently am running some VBA to navigate an intranet site, perform some actions, etc. I have completed the actions I need to take, and now I have 2 IE windows open. One window, my original, I want to remain open. The second window, I want to close.

I have been having issues closing the second window. Using simple SendKeys "%{F4}" doesn't close the window at all, although it would if I did the steps manually rather than through VBA. Also, ieApp.Quit keeps closing the first IE window, which I want to remain open to use again. Which is strange because it isn't the active window at the time.

My question is...is there a way to find/select an open IE window based on a partial URL? I know the URL will start with http://ctdayppv02/PVEShowDocPopup.aspx? but everything after that will change each time.

I've seen plenty online about launching IE with a URL, or returning the URL of an already open IE instance, but I'm not trying to do either of those at this point. I just want to activate a specific open IE window, so then I can close that one only.

Here is part of my code, which isn't closing anything as of now, but also doesn't result in any errors. It's the very last part that doesn't work, everything else is good.:

'***** Click the Search button *****
        ieApp.Document.all.Item("btnSubmitProjectSearch").Click: DoEvents: Sleep 1000

'***** Click the Print button *****
        ieApp.Document.all.Item("printLink").Click: DoEvents: Sleep 1000

'***** Setting variables for Windows API. Will be used to find the proper windows box by name *****
        Dim windowHWND As LongPtr
        Dim buttonHWND As LongPtr
        Dim hwnd As String
        Dim hwindow2 As String

''***** Will click the Print button. MUST HAVE MICROSOFT PDF AS DEFAULT PRINTER *****
        windowHWND = getWindowPointer("Print", "#32770")

        If windowHWND > 0 Then
        '***** Add a small delay to allow the window to finish rendering if needed *****
            Sleep 250
            buttonHWND = FindWindowEx(windowHWND, 0, "Button", "&Print")
            If buttonHWND > 0 Then
            SendMessage buttonHWND, BM_CLICK, 0, 0
            Else
                Debug.Print "didn't find button!"
            End If
        End If

'***** Locate the "Save Print Output As" window, enter the filepath/filename and press ENTER *****
        hwnd = FindWindow(vbNullString, "Save Print Output As")
        Do
        DoEvents
        hwindow2 = FindWindow(vbNullString, "Save Print Output As")

        Loop Until hwindow2 > 0

        SendKeys "C:\Users\NAME\Documents\" & Range("G2").Value
        SendKeys "{ENTER}"

'***** Locate the Viewer Control box that appears after saving and press ENTER to advance *****
        hwnd = FindWindow(vbNullString, "PaperVision Document Viewer Control")
        Do
        DoEvents
        hwindow2 = FindWindow(vbNullString, "PaperVision Document Viewer Control")

        Loop Until hwindow2 > 0

        SendKeys "{Enter}"

'***** Locate the "PaperVision - View Document" IE window and close it *****
        hwnd = FindWindow(vbNullString, "PaperVision - View Document - Internet Explorer")
        Do
        DoEvents
        hwindow2 = FindWindow(vbNullString, "PaperVision - View Document - Internet Explorer")

        Loop Until hwindow2 > 0

        'ieApp.Quit
        SendKeys "%{F4}"

Any advice on how to close just that one page? Thanks in advance!

Upvotes: 1

Views: 967

Answers (2)

TBoulz
TBoulz

Reputation: 351

I like Domenic's response more, but I wanted to post another way I came across online for anybody who may be looking at this down the road and wants another method.

This way uses a function that is called in the primary sub. The "View Document" is the wording that appears in the IE window caption, NOT in the URL. This will close any IE that contains that specific phrase somewhere in the window caption. I only tested this a few times but it seems to work.

Sub CloseWindow()
    Do Until Not CloseIeIf("View Document"): Loop
End Sub

Function CloseIeIf(Str As String) As Boolean
    Dim ie As Object

    For Each ie In CreateObject("Shell.Application").Windows
        If InStr(ie.LocationName, Str) <> 0 Then
            ie.Quit
            CloseIeIf = True
        End If
    Next
End Function

Upvotes: 0

Domenic
Domenic

Reputation: 8114

As per the first suggestion by QHarr, try...

Option Explicit

Sub test()

    Dim oShell As Object
    Dim oShellWindows As Object
    Dim oShellWindow As Object
    Dim sPartialURL As String

    sPartialURL = "http://ctdayppv02/PVEShowDocPopup.aspx?"

    Set oShell = CreateObject("Shell.Application")
    Set oShellWindows = oShell.Windows

    For Each oShellWindow In oShellWindows
        If oShellWindow.Name = "Internet Explorer" Then
            If InStr(oShellWindow.Document.URL, sPartialURL) > 0 Then
                Exit For
            End If
        End If
    Next oShellWindow

    If Not oShellWindow Is Nothing Then
        'Do stuff
        '
        '
        oShellWindow.Quit
    Else
        MsgBox "The specified Internet Explorer window was not found!", vbExclamation
    End If

    Set oShell = Nothing
    Set oShellWindows = Nothing
    Set oShellWindow = Nothing

End Sub

Upvotes: 1

Related Questions