Search code examples
vbaexcelinternet-explorer-11

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!


Solution

  • 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