2012-07-25 35 views
7

La macro que estoy creando toma nombres de una hoja de cálculo de Excel, abre Internet Explorer y busca en el directorio en línea. Después de buscar en el directorio, muestra un formulario Java con el nombre del administrador. Puedo tabular manualmente el nombre del administrador, hacer clic con el botón secundario, copiar el acceso directo y luego publicarlo nuevamente en la hoja de cálculo. Sin embargo, estoy teniendo problemas con las pestañas consistentes y copiando el atajo.Interacción de VBA con Internet Explorer

  1. ¿Hay alguna manera simple de volver a enfocar la ventana de IE?
  2. ¿Cómo se copia un atajo sin hacer clic manualmente sobre él?

Código:

Sub Macro1() 
' 
Dim ie As Object 
Set ie = CreateObject("internetexplorer.application") 

ie.Visible = True 
ie.navigate "****url****" 

While ie.busy 
    DoEvents 
Wend 

ie.document.getElementById("SSOID").Value = "Z19516732" 
ie.document.getElementById("Advanced").Checked = False 
ie.document.all("Search").Click 

'this loop is to slow the macro as the java form is filled from the search 
For i = 1 To 400000000 
    i = i + 1 
Next i 

'ie.Object.Activate 
ie.document.getElementById("Advanced").Checked = False 
ie.document.getElementById("SSOID").Focus 
Application.SendKeys "{TAB 6}" ', True 

'bring up the control menu/right click 
Application.SendKeys "+{F10}" 

'copy shortcut is 8 items down on the list 
Application.SendKeys "{DOWN}" 
Application.SendKeys "{DOWN}" 
Application.SendKeys "{DOWN}" 
Application.SendKeys "{DOWN}" 
Application.SendKeys "{DOWN}" 
Application.SendKeys "{DOWN}" 
Application.SendKeys "{DOWN}" 
Application.SendKeys "{DOWN}" 

'enter was not working so the shortcut for the menu is 't' 
'SendKeys "{ENTER}" 
Application.SendKeys "{t}" 

Windows("Book21").Activate 
Range("A1").Select 
ActiveSheet.Paste 

End Sub 

Respuesta

6

Al comienzo de su módulo, poner esta línea de código:

Public Declare Function SetForegroundWindow Lib "user32" (ByVal HWND As Long) As Long 

Esto se llama un Declare Statement y le permitirá acceder a la función SetForegroundWindow que está integrado en Windows. Esta función reside en el archivo DLL user32 del sistema Windows. En realidad, hay varias otras funciones entre varias DLL a las que VBA tiene acceso de esta manera (consulte el enlace para ver más ejemplos).

En su código, mientras que la interacción con el objeto de IE, registrar la HWND (handle a la ventana), así:

Dim HWNDSrc As Long 
HWNDSrc = ie.HWND 

Entonces, después de haber interactuado con Java, usar esto para continuar:

SetForegroundWindow HWNDSrc 

Esto le dice al sistema de Windows que configure la ventana identificada por HWND como la ventana de primer plano (como su nombre lo indica).

Sin embargo, esto puede no ser necesario, dependiendo de cómo esté interactuando con IE. En otras palabras, si no necesita ver/tocar la ventana, aún puede interactuar utilizando el objeto como ya lo hizo en su código.

Existen formas de obtener el acceso directo que está buscando utilizando código como GetElementById() y GetElementsByTagName() (see here for more info), pero dependerá de cómo se creó la fuente. p.ej. un enlace <a href="...> debería ser relativamente fácil de extraer, si conoce la fuente HTML.


Después de revisar su código por segunda vez, me di cuenta de que utiliza un bucle para 'frenar' la macro. Tengo una función que utilizo todo el tiempo para métodos propios similares. Espero que esto ayude a que consigas lo que necesitas. Modifiqué mi código a continuación desde mi propio original, ya que tenía detalles adicionales que no se aplican a su caso. Si hay algún error con él, puedo ajustarlo según sea necesario.

Public Sub WaitForIE(myIEwindow As InternetExplorer, HWND As Long, WaitTime As Integer) 

    ' Add pauses/waits so that window action can actually 
    ' begin AND finish before trying to read from myIEWindow. 

    ' myIEWindow is the IE object currently in use 
    ' HWND is the HWND for myIEWindow 
    ' The above two variables are both used for redundancy/failsafe purposes. 
    ' WaitTime is the amount of time (in seconds) to wait at each step below. 
    ' This is variablized because some pages are known to take longer than 
    ' others to load, and some pages with frames may be partially loaded, 
    ' which can incorrectly return an READYSTATE_COMPLETE status, etc. 

    Dim OpenIETitle As SHDocVw.InternetExplorer 

    Application.Wait DateAdd("s", WaitTime, Now()) 

    Do Until myIEwindow.ReadyState = READYSTATE_COMPLETE 
     ' Wait until IE is done loading page and/or user actions are done. 
    Loop 

    Application.Wait DateAdd("s", WaitTime, Now()) 

    While myIEwindow.Busy 
     DoEvents ' Wait until IE is done loading page and/or user actions are done. 
    Wend 

    On Error Resume Next 
    ' Make sure our window still exists and was not closed for some reason... 
    For Each OpenIETitle In objShellWindows 
     If OpenIETitle.HWND = HWND Then 
      If Err.Number = 0 Then 
       Set myIEwindow = OpenIETitle 
       Exit For 
      Else 
       Err.Clear 
      End If 
     End If 
    Next OpenIETitle 
    On Error GoTo 0 

End Sub 
+0

intenté ese setForegroundWindow antes, pero esta vez funcionó, ¡Gracias! Sin embargo, la fuente html no muestra el enlace que se necesita. Aunque el enlace no es específicamente lo que necesito. Necesito el texto (El nombre del administrador), pero no puedo copiarlo con un clic derecho. ¿Tal vez hay una forma simple de resaltar el texto? Estaba planeando simplemente copiar y pegar el enlace y luego hacer algunas líneas rápidas para limpiar el nombre del formulario de enlace. – orangehairbandit

+1

Gracias Gaffi!Esa primera parte con el enfoque de ventana funciona como impresionante. Como dije, lo intenté antes, pero debes haber tenido el toque mágico. A partir de la segunda parte de mi pregunta, crear atajo, encontré mi error. Por alguna razón, el ".Focus" que estaba usando para el compendio de búsqueda, simplemente estaba enfocando pero no seleccionando. Así que cuando lo cambié a ".select" y especificaba hte sendkeys con una aplicación.sendkeys "~" (La tecla enter), ¡todo se completó! ¡Mi primera vez aquí en stackflow como usuario, no solo como lector, es bastante desagradable! ¡Gracias! – orangehairbandit

+0

@orangehairbandit ¡Me alegro de poder ayudar! – Gaffi