2012-07-25 33 views
7

Makro, które buduję, pobiera nazwy z arkusza kalkulacyjnego Excel, otwiera Internet Explorer i przeszukuje katalog online. Po przeszukaniu katalogu, wyciąga formularz Java z nazwą menedżera. Jestem w stanie ręcznie wybrać nazwę menedżera, kliknąć prawym przyciskiem myszy, skopiować skrót, a następnie opublikować go z powrotem na arkuszu. Mam jednak problem ze spójnym tabulowaniem i kopiowaniem skrótu.Interakcja VBA z eksploratorem internetowym

  1. Czy istnieje prosty sposób przywrócenia ostrości z okna IE?
  2. Jak skopiować skrót bez ręcznego kliknięcia?

Kod:

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 

Odpowiedz

6

Na początku modułu, umieścić ten wiersz kodu:

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

To się nazywa Declare Statement i pozwoli na dostęp do funkcji SetForegroundWindow że jest wbudowany w system Windows. Ta funkcja działa w bibliotece DLL user32 systemu Windows. W rzeczywistości istnieje wiele innych funkcji między wieloma bibliotekami DLL, które są dostępne dla VBA w ten sposób (więcej informacji na ten temat można znaleźć w łączu).

W kodzie, podczas interakcji z obiektem IE, zapisz HWND (handle do tego okna) tak:

Dim HWNDSrc As Long 
HWNDSrc = ie.HWND 

Następnie, po tym jak w interakcję z Java, użyj tego, aby kontynuować:

SetForegroundWindow HWNDSrc 

ta informuje system Windows, aby ustawić okno zidentyfikowany przez HWND jako pierwszym planie okna (jak sama nazwa wskazuje).

Jednak może to nie być konieczne, w zależności od sposobu interakcji z IE. Innymi słowy, jeśli nie musisz widzieć/dotykać okna, możesz nadal korzystać z obiektu, jak już masz w swoim kodzie.

Istnieją sposoby, aby uzyskać skrót, którego szukasz, używając kodu takiego jak GetElementById() i GetElementsByTagName() (see here for more info), ale zależy to od sposobu utworzenia źródła. na przykład link <a href="...> powinien być stosunkowo łatwy do ściągnięcia, jeśli znasz źródło HTML.


Po ponownym przejrzeniu kodu zauważyłem, że używasz pętli do "spowolnienia" makra. Mam funkcję, której używam cały czas dla podobnych metod. Mam nadzieję, że to pomoże ci zrobić to, czego potrzebujesz. Zmodyfikowałem poniższy kod z mojego własnego oryginału, ponieważ miałem dodatkowe informacje, które nie dotyczą twojej sprawy. Jeśli są jakieś błędy, mogę je dostosować w razie potrzeby.

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

Próbowałem tego setForegroundWindow wcześniej, ale tym razem zadziałało, Dzięki! Źródło html nie pokazuje jednak łącza, które jest potrzebne. Chociaż link nie jest konkretnie to, czego potrzebuję. Potrzebuję tekstu (nazwa menedżera), ale nie mogę go skopiować prawym przyciskiem. Może istnieje prosty sposób wyróżnienia tekstu? Planowałem po prostu skopiować i wkleić link, a następnie zrobić kilka szybkich linii, aby oczyścić nazwę z formularza linku HTE. – orangehairbandit

+1

Dzięki Gaffi!Ta pierwsza część z funkcjami ogniskowania okien, jak niesamowite. Jak już powiedziałem, próbowałem tego wcześniej, ale musiałaś mieć magiczny dotyk. Od drugiej części mojego pytania, skrót tworzenia, znalazłem swój błąd. Z jakiegoś powodu ".Focus", którego używałem dla kompenentu wyszukiwania, po prostu skupiało się, ale nie wybierało. Więc kiedy zmieniłem go na ".select" i podałem hte sendkeys za pomocą application.sendkeys "~" (klawisz Enter), wszystko się połączyło! Mój pierwszy raz tutaj na pileflow jako użytkownik nie tylko czytelnik i jego dość chory paskudny! Dzięki! – orangehairbandit

+0

@orangehairbandit Cieszę się, że mogę pomóc! – Gaffi