Question

j'ai posté sur IE 9 n'accepte pas SendKeys pour télécharger un fichier, mais ce problème est suffisamment distinct de la réponse que j'ai reçue pour justifier une autre question.Mon problème est que je n'arrive pas à faire en sorte que IE 9 accepte les SendKeys.j'ai tenté Bas de page, Languette, la totalité de la F# clés, et aucune d’entre elles ne fonctionne.

Voici le code que j'utilise :

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

Je suis totalement perdu car il semble que la plupart des forums ou tutoriels ne font rien de différent pour IE 9.L'objet IE est créé dans un module de classe et initialisé dans le Class_Initialize sous.Je ne sais pas si cela aide, mais je n'ai vraiment aucune idée de pourquoi cela ne fonctionne pas et toute aide sur la façon d'envoyer des clés à IE serait grandement appréciée.

Était-ce utile?

La solution

Il s'agit en fait d'une copie de ma réponse à cette question, mais cela peut toujours s'appliquer.

La fenêtre IE est-elle active lorsque vous essayez votre SendKeys?Sinon, cela expliquerait que cela ne fonctionne pas.

Pour activer votre fenêtre :

Au début de votre module, mettez cette ligne de code :

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

Cela vous permettra d'accéder au SetForegroundWindow fonction intégrée à Windows.

Dans votre code, tout en interagissant avec votre objet IE, enregistrez le HWND pour cette fenêtre comme ceci :

Dim HWNDSrc As Long
HWNDSrc = ie.HWND

Ensuite, après avoir chargé la page, utilisez ceci pour continuer, puis envoyez vos actions clés :

SetForegroundWindow HWNDSrc

Cependant, cela peut ne pas être nécessaire, selon la manière dont vous interagissez avec IE.En d'autres termes, si vous n'avez pas besoin de voir/toucher la fenêtre (vous le faites pour SendKeys), vous pouvez toujours interagir en utilisant l'objet dans le code.


Maintenant, je vois que vous utilisez Application.Wait après avoir cliqué, mais cela ne garantit pas que la page IE soit chargée.Cette fonction devrait y contribuer.

 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

Au risque d'être long, j'ai mis à jour votre code avec ces suggestions...

' 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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top