tratando de cerrar un libro de trabajo después de abrirlo, pero el bucle no lo hace

A través de un sub, descargo un archivo de Excel de un sitio web. cuando se hace clic en el botón de descarga, abre el archivo de Excel y también deja que el archivo se descargue. No necesito que se abra, así que tan pronto como se abra y antes de que comiencen los próximos subs, necesito cerrarlo. Por algunos códigos intenté hacerlo pero fallé.

El problema es que el Do Loop que escribí, no puede capturar el archivo y se cuelga. Simplemente funciona bien cuando lo depuro a través de F8. Entonces pensé que tal vez por el método application.wait puedo dejar que el sub espere hasta que aparezca el libro de trabajo, como lo que sucede en el modo de depuración, pero tampoco ayudó.

También necesito agregar eso, ya que cada vez que el sitio web descarga el archivo, su nombre cambia, luego utilicé el operador Me gusta.

Sub Test()    
    Dim wb As Workbook
    Dim wbName As String
    Dim Cnt As Integer
    
    wbName = "transactions_history_"
    
    'Application.Wait Now + TimeValue("00:00:10") ' it didnt help so i commented it
    Do
        Application.Wait Now + TimeValue("00:00:01")
        For Each wb In Application.Workbooks
            If wb.Name Like wbName & "*" Then
                Cnt = 1
                Exit Do
            End If
        Next wb
    Loop Until Cnt = 1 
    wb.Close
End Sub

¿Alguien tiene alguna idea? Gracias.

FaneDuru, copio aquí el código que descarga el libro de trabajo del sitio web. funcionó muy bien hasta que el sitio web cambió algo y cuando se descarga el archivo, también se abre. Necesito cerrarlo para que el resto de los programas funcionen sin problemas, pero hasta ahora no pude hacerlo.

Sub TBC()

    ' declerations
    Dim myBrowser                             As Selenium.ChromeDriver
    Dim FindBy                                As New Selenium.by
    Dim objFSO                                As Object
    Dim objFolder                             As Object
    Dim objFile                               As Object
    Dim A, I                                  As Integer
    Dim FileName, BankFolderAddress           As String
    Dim N                                     As Byte
  
    ' initializations
    BankFolderAddress = "D:\Projects\Excel\Main Program\Bank Statements\"
    Set FindBy = New Selenium.by
    Set myBrowser = New WebDriver
    I = 0
    A = 0
        
    Sheet2.Cells.ClearContents
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objFolder = objFSO.GetFolder(BankFolderAddress)
    For Each objFile In objFolder.Files 
        Sheet2.Cells(I + 1, 1) = objFile.Name
        Sheet2.Cells(I + 1, 2) = objFile.Path
        I = I + 1
    Next objFile
    If Sheet2.Cells(1, 1) <> "" Then
        For N = 1 To I
            Kill Sheet2.Cells(N, 2).value
        Next N
    End If
   
Start:
   
    myBrowser.SetProfile Environ("LOCALAPPDATA") & "\GOOGLE\CHROME\USER DATA"
    myBrowser.AddArgument "profile-directory=Default"
    myBrowser.Start "chrome"
    
    Application.DisplayAlerts = False
   
    
   'Address e website
    myBrowser.Get "https://tbconline.ge/tbcrd/login?t=false"
    myBrowser.Window.Maximize
    
    A = 0
    Do
        Application.Wait Now + TimeValue("00:00:01")
        A = A + 1
        If A = 10 Then GoTo Finish
    Loop Until myBrowser.IsElementPresent(FindBy.XPath("//button"))
      
    If myBrowser.IsElementPresent(FindBy.Css("input[formcontrolname='username']")) Then
        myBrowser.FindElementByXPath("//button").Click
    Else
        GoTo JMP
    End If

JMP:
   
   'For removing PopUps
    If myBrowser.IsElementPresent(FindBy.XPath("//div[@id='mainLoadingLayer']/ui-view/ui-view/div/div[2]/div/div/div/div/div[3]/button")) Then
        myBrowser.FindElementByXPath("//div[@id='mainLoadingLayer']/ui-view/ui-view/div/div[2]/div/div/div/div/div[3]/button").Click
    End If
   
   ' Choosing Transaction Menu
    A = 0
    Do
        Application.Wait Now + TimeValue("00:00:01")
        A = A + 1
        If A = 10 Then GoTo Finish
    Loop Until myBrowser.IsElementPresent(FindBy.XPath("//a[contains(text(),'Transactions')]"))

    If myBrowser.IsElementPresent(FindBy.XPath("//a[contains(text(),'Transactions')]")) Then
        myBrowser.FindElementByXPath("//a[contains(text(),'Transactions')]").Click
    End If

   'choosing Transaction submenu
    A = 0
    Do
        Application.Wait Now + TimeValue("00:00:01")
        A = A + 1
        If A = 10 Then GoTo Finish
    Loop Until myBrowser.IsElementPresent(FindBy.XPath("//span[contains(.,'Transactions')]"))

    If myBrowser.IsElementPresent(FindBy.XPath("//span[contains(.,'Transactions')]")) Then
        myBrowser.FindElementByXPath("//span[contains(.,'Transactions')]").Click
    End If
                
   'Clicking on Download icon
    Do
        Application.Wait Now + TimeValue("00:00:01")
    Loop Until myBrowser.IsElementPresent(FindBy.XPath("//ib-controls/div/div[2]/div[2]"))

    If myBrowser.IsElementPresent(FindBy.XPath("//ib-controls/div/div[2]/div[2]")) Then
        myBrowser.FindElementByXPath("//ib-controls/div/div[2]/div[2]").Click
    End If
              
   ' clicking on excel option to download it
    Do
        Application.Wait Now + TimeValue("00:00:01")
    Loop Until myBrowser.IsElementPresent(FindBy.XPath("//a[contains(.,'Excel')]"))

    If myBrowser.IsElementPresent(FindBy.XPath("//a[contains(.,'Excel')]")) Then
        myBrowser.FindElementByXPath("//a[contains(.,'Excel')]").Click
    End If
              
             
   'checking if the file is downloaded
    Do
        Application.Wait Now + TimeValue("00:00:02") 
    Loop Until Dir(BankFolderAddress & "transactions_history_*.xlsx") <> ""
  
   ' get the file name
    FileName = Dir(BankFolderAddress & "transactions_history_*.xlsx", vbDirectory)
    
   ' check if the downloaded file size
    Do
        Application.Wait Now + TimeValue("00:00:05") '03 bood
    Loop Until FileLen(BankFolderAddress & FileName) > 10000
  
Finish:
  
    ' close the Browser
    myBrowser.close

    ' ## I added this code to close the workbook but failed  
    ' call Test()
    
    Dim wb As Workbook
    Dim wbName As String
    Dim Cnt As Integer

wbName = FileName

Do
    Application.Wait Now + TimeValue("00:00:01")
    For Each wb In Application.Workbooks
        If wb.Name=FileName Then
            Cnt = 1
            wb.Close
            Exit Do
        End If
    Next wb
Loop Until Cnt = 1

call BankDataExtraction()    

Finalizar sub

el problema es que si no detengo el sub antes del bucle en el modo de depuración, el libro de trabajo descargado no aparece en la pantalla ni en el administrador de tareas, y el bucle no puede atraparlo y cerrarlo, luego se cuelga. el método de espera tampoco ayuda. Probé su código, pero me dio un error de automatización sintaxis no válida, mientras ejecutaba Set sessEx = GetObject (wbFullName). Aplicación Le pasé la dirección completa del archivo, si no es la misma ExSession (FileName).

Answer

Si está seguro de que wbNamees el nombre del libro de trabajo que busca, su código debe hacer lo que necesita, pero solo si el libro de trabajo en discusión está abierto EN LA MISMA SESIÓN DE EXCEL . Pregunté sobre el código que lo abría, pero no recibí ninguna aclaración. Utilice la siguiente función para verificar si el libro de trabajo está abierto en la misma sesión (con el libro de trabajo manteniendo el código de verificación). Si su segundo parámetro es True, cierra el libro de trabajo, incluso en una sesión diferente y sale de esa sesión. Muchos códigos buscan una sesión de Excel existente y la usan, pero abren una nueva sesión si no se ha encontrado tal sesión. Otros, utiliza una nueva sesión:

Function sameExSession(wbFullName As String, Optional boolClose As Boolean) As Boolean
   Dim sessEx As Excel.Application, wb As Workbook
  
   Set sessEx = GetObject(wbFullName).Application
   If sessEx.hwnd = Application.hwnd Then
        sameExSession = True
   Else
        sameExSession = False
        If boolClose Then
            sessEx.Workbooks(Right(wbFullName, Len(wbFullName) - InStrRev(wbFullName, "\"))).Close False
            sessEx.Quit: Set sessEx = Nothing
        End If
   End If
End Function

Se puede llamar desde su código existente de esta manera:

Sub Test()    
    Dim wb As Workbook, wbName As String, Cnt As Integer
    
    wbName = "transactions_history_"
    If Not sameExSession Then Exit Sub 'take care to use the workbook FULL NAME!
    Do
        Application.Wait Now + TimeValue("00:00:01")
        For Each wb In Application.Workbooks
            If wb.Name Like wbName & "*" Then
                Cnt = 1
                Exit Do
            End If
        Next wb
    Loop Until Cnt = 1 
    wb.Close
End Sub

Si no conoce la extensión del libro de trabajo (ya que no la usa en su código anterior), puede obtener el nombre del libro de trabajo usando:

    Dim strFullName As String, foldName As String
    foldName = "path to the folder where the workbook is downloaded"
    strFullName = dir(foldName & "\" & vbname & "*.*")
    If strFullName <> "" Then
       If Not sameExSession Then Exit Sub
    Else
        MsgBox "Strange...": Stop 'Just in case. It must be found, if foldName and vbName are correct...
    End If

Puede fallar si en la misma carpeta hay más de un libro de trabajo que tenga un nombre que contenga la cadena utilizada. Devolverá el primero de ellos, en orden alfabético. Pero, en tal caso, es usted quien debe aportar algunas aclaraciones... Por supuesto, si abrir en la otra sesión es la suposición correcta. En tal caso, una pieza de código puede iterar entre todos esos libros de trabajo que tienen la misma cadena en su nombre, para determinar cuál fue el último guardado .

Puede estar seguro de este aspecto (otra sesión), buscando manualmente el libro de trabajo, copiando su nombre completo y creando una prueba Subque solo llama a la función que proporcioné, usando el nombre completo determinado.