Взаимодействие VBA с internet explorer
макрос, который я создаю, берет имена из электронной таблицы Excel, открывает Internet Explorer и выполняет поиск в онлайн-каталоге. После поиска в каталоге он извлекает форму Java с именем менеджера в ней. Я могу вручную вкладка имя менеджера, щелкните правой кнопкой мыши, скопируйте ярлык, а затем опубликовать его обратно на листе. Тем не менее, у меня возникают проблемы с согласованным табулированием и копированием ярлыка.
- есть ли простой способ вернуть фокус на окна IE?
- Как скопировать ярлык, не щелкнув его вручную?
код:
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