2012-07-25 28 views
7

La macro che sto creando prende i nomi da un foglio di calcolo di Excel, apre Internet Explorer e cerca nella directory online. Dopo aver cercato la directory, richiama un modulo Java con il nome del manager al suo interno. Posso modificare manualmente il nome del gestore, fare clic con il pulsante destro del mouse, copiare il collegamento e quindi pubblicarlo sul foglio di lavoro. Tuttavia, sto riscontrando problemi con tabulazioni consistenti e copia del collegamento.Interazione VBA con Internet Explorer

  1. C'è un modo semplice per riportare l'attenzione sulla finestra di IE?
  2. Come si copia un collegamento senza fare clic manualmente su di esso?

Codice:

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 

risposta

6

All'inizio del modulo, inserire questa riga di codice:

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

Questo si chiama un Declare Statement e vi permetterà di accedere alla funzione SetForegroundWindow che è integrato in Windows. Questa funzione è presente nella DLL user32 del sistema Windows. Esistono in realtà una serie di altre funzioni tra più DLL che sono accessibili a VBA in questo modo (vedi link per altri esempi).

Nel codice, mentre interagiscono con l'oggetto IE, registrare il HWND (handle a quella finestra) in questo modo:

Dim HWNDSrc As Long 
HWNDSrc = ie.HWND 

Poi, dopo aver interagito con Java, utilizzare questo per continuare:

SetForegroundWindow HWNDSrc 

Questo indica al sistema Windows di impostare la finestra identificata dallo HWND come finestra in primo piano (come suggerisce il nome).

Tuttavia, ciò potrebbe non essere necessario, a seconda di come si sta interagendo con IE. In altre parole, se non hai bisogno di vedere/toccare la finestra, puoi comunque interagire usando l'oggetto come già nel tuo codice.

ci sono modi per ottenere il collegamento che cerchi utilizzando il codice come GetElementById() e GetElementsByTagName() (see here for more info), ma dipenderà da come è stato creato il sorgente. per esempio. un collegamentodovrebbe essere relativamente facile da estrarre, se si conosce il codice sorgente HTML.


Dopo aver esaminato il codice una seconda volta, ho notato si utilizza un ciclo per 'rallentare' la macro. Ho una funzione che uso sempre per metodi simili. Speriamo che questo ti aiuterà a fare ciò di cui hai bisogno. Ho modificato il mio codice qui sotto dal mio originale, poiché avevo specifiche aggiuntive che non si applicano al tuo caso. Se ci sono errori con esso, posso aggiustare secondo necessità.

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

ho provato SetForegroundWindow prima, ma questa volta ha funzionato, grazie! La sorgente HTML tuttavia non mostra il collegamento necessario. Sebbene il link non sia specficmente quello di cui ho bisogno. Ho bisogno del testo (il nome del gestore), ma non riesco a copiarlo con un clic destro. Forse c'è un modo semplice per evidenziare il testo? Stavo pensando di copiare e incollare il link, quindi fare alcune linee veloci per ripulire il nome dal modulo di collegamento. – orangehairbandit

+1

Grazie Gaffi!Quella prima parte con la messa a fuoco della finestra funziona come impressionante. Come ho detto, l'ho provato prima, ma tu hai avuto il tocco magico. A partire dalla seconda parte della mia domanda, la scorciatoia creata, ho trovato il mio errore. Per qualsiasi motivo, il "focus" che stavo usando per il compenent della ricerca, era semplicemente focalizzato ma non selezionato. Quindi, quando l'ho cambiato in ".select" e ho specificato hte sendkeys con un'applicazione.sendkeys "~" (la chiave di invio), tutto si è riunito! La mia prima volta qui su Stackflow come utente, non solo un lettore e piuttosto malato! Grazie! – orangehairbandit

+0

@orangehairbandit Contento di poterti aiutare! – Gaffi