Взаимодействие VBA с internet explorer

макрос, который я создаю, берет имена из электронной таблицы Excel, открывает Internet Explorer и выполняет поиск в онлайн-каталоге. После поиска в каталоге он извлекает форму Java с именем менеджера в ней. Я могу вручную вкладка имя менеджера, щелкните правой кнопкой мыши, скопируйте ярлык, а затем опубликовать его обратно на листе. Тем не менее, у меня возникают проблемы с согласованным табулированием и копированием ярлыка.

  1. есть ли простой способ вернуть фокус на окна IE?
  2. Как скопировать ярлык, не щелкнув его вручную?

код:

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

1 ответов


в начале вашего модуля поместите эту строку кода:

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

это называется Declare Statement и позволит вам получить доступ к SetForegroundWindow функция, встроенная в Windows. Эта функция живет в user32 DLL системы Windows. На самом деле существует ряд других функций среди нескольких библиотек DLL, которые доступны для VBA таким образом (см. ссылку для получения дополнительных примеров).

в коде при взаимодействии с объектом IE запишите the HWND (дескриптор к этому окну) вот так:

Dim HWNDSrc As Long
HWNDSrc = ie.HWND

затем, после взаимодействия с Java, используйте это, чтобы продолжить:

SetForegroundWindow HWNDSrc

это говорит системе Windows, чтобы установить окно, идентифицированное HWND как окно переднего плана (как следует из названия).

однако это может быть не нужно, в зависимости от того, как вы взаимодействуете с IE. Другими словами, если вам не нужно видеть/касаться окна, вы все равно можете взаимодействовать с помощью объект, как у вас уже есть в коде.

есть способы получить ярлык, который вы ищете с помощью кода, как GetElementById() и GetElementsByTagName() (см. здесь для получения дополнительной информации), но это будет зависеть от того, как источник был создан. например, an <a href="...> ссылка должна быть относительно легко вытащить, если вы знаете HTML источник.


после повторного просмотра кода я заметил, что вы используете цикл для "замедления" макроса. У меня есть функция я пользуюсь все время для моих собственных методов. Надеюсь, это поможет вам сделать то, что вам нужно. Я изменил свой код ниже из моего собственного оригинала, так как у меня были дополнительные особенности, которые не относятся к вашему случаю. Если есть какие-либо ошибки с ним, я могу настроить по мере необходимости.

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