IE 9 não aceita SendKeys
-
11-12-2019 - |
Pergunta
eu postei em IE 9 não aceita SendKeys para baixar um arquivo, mas esse problema está suficientemente separado da resposta que recebi para justificar outra pergunta.Meu problema é que não consigo fazer com que o IE 9 aceite nenhum dos SendKeys
.eu tentei Página para baixo, Aba, todos os Fá# chaves, e nenhuma delas funciona.
Aqui está o código que estou usando:
Dim ie As Object
'This creates the IE object
Sub initializeIE()
'call this subprocedure to start internet explorer up
Set ie = CreateObject("internetexplorer.application")
pos = 1
End Sub
'Initialize the class object
Private Sub Class_Initialize()
initializeIE
End Sub
Function followLinkByText(thetext As String) As Boolean
'clicks the first link that has the specified text
Dim alink As Variant
'Loops through every anchor in html document until specified text is found
' then clicks the link
For Each alink In ie.document.Links
If alink.innerHTML = thetext Then
alink.Click
'waitForLoad
Application.Wait Now + TimeValue("00:00:01")
Application.SendKeys "{PGDN}", True
Application.SendKeys "{PGUP}", True
'I've also tried calling it without Application before it
SendKeys "{F1}", True
SendKeys "{F2}", True
'Etc... Each of these not being received by IE 9
followLinkByText = True
Exit Function
End If
Next
End Function
Estou totalmente perdido porque parece que a maioria dos fóruns ou tutoriais não faz nada diferente para o IE 9.O objeto IE é criado em um módulo de classe e inicializado no Class_Initialize
sub.Não tenho certeza se isso ajuda em alguma coisa, mas realmente não tenho ideia de por que isso não está funcionando e qualquer ajuda sobre como enviar chaves para o IE seria muito apreciada.
Solução
Na verdade, esta é uma cópia minha resposta para essa questão, mas ainda pode ser aplicável.
A janela do IE está ativa quando você tenta o seu SendKeys
?Caso contrário, isso explicaria que não está funcionando.
Para ativar sua janela:
No início do seu módulo, coloque esta linha de código:
Public Declare Function SetForegroundWindow Lib "user32" (ByVal HWND As Long) As Long
Isso permitirá que você acesse o SetForegroundWindow
função integrada no Windows.
No seu código, ao interagir com seu objeto IE, registre o HWND dessa janela da seguinte forma:
Dim HWNDSrc As Long
HWNDSrc = ie.HWND
Depois de carregar a página, use isto para continuar e envie suas ações principais:
SetForegroundWindow HWNDSrc
No entanto, isso pode não ser necessário, dependendo de como você interage com o IE.Em outras palavras, se você não precisa ver/tocar a janela (você precisa por SendKeys
), você ainda poderá interagir usando o objeto no código.
Agora, vejo você usando Application.Wait depois de clicar, mas isso não garante que a página do IE foi carregada.Esta função deve ajudar com isso.
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
Correndo o risco de ser prolixo, atualizei seu código com estas sugestões...
' Added by Gaffi
Public Declare Function SetForegroundWindow Lib "user32" (ByVal HWND As Long) As Long
Dim HWNDSrc As Long
Dim ie As Object
'This creates the IE object
Sub initializeIE()
'call this subprocedure to start internet explorer up
Set ie = CreateObject("internetexplorer.application")
' Added by Gaffi
HWNDSrc = ie.HWND
pos = 1
End Sub
'Initialize the class object
Private Sub Class_Initialize()
initializeIE
End Sub
Function followLinkByText(thetext As String) As Boolean
'clicks the first link that has the specified text
Dim alink As Variant
'Loops through every anchor in html document until specified text is found
' then clicks the link
For Each alink In ie.document.Links
If alink.innerHTML = thetext Then
alink.Click
'waitForLoad
' Added by Gaffi
WaitForIE ie, HWNDSrc, 1
SetForegroundWindow HWNDSrc
'Application.Wait Now + TimeValue("00:00:01")
Application.SendKeys "{PGDN}", True
Application.SendKeys "{PGUP}", True
'I've also tried calling it without Application before it
SendKeys "{F1}", True
SendKeys "{F2}", True
'Etc... Each of these not being received by IE 9
followLinkByText = True
Exit Function
End If
Next
End Function