2

ファイルをダウンロードするために SendKeys を受け入れない IE 9に投稿しましたが、この問題は別の質問を正当化するために受け取った回答とは十分に別のものです。私の問題は、IE 9 にSendKeys. 、、すべてのPage Downキーを試しましたが、どれも機能しません。TabF#

私が使用しているコードは次のとおりです。

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

ほとんどのフォーラムやチュートリアルは IE 9 に対して何も変わっていないように見えるので、私は完全に途方に暮れています。IE オブジェクトはクラス モジュールで作成され、Class_Initializeサブで初期化されます。それが役立つかどうかはわかりませんが、これが機能しない理由が本当にわかりません.IEにキーを送信する方法についての助けをいただければ幸いです.

4

1 に答える 1

3

これは実際にはこの質問に対する私の答えのコピーですが、それでも当てはまる可能性があります。

試してみると、IEウィンドウはアクティブになっていますSendKeysか?そうでない場合、これはそれが機能していないことを説明します。

ウィンドウをアクティブにするには:

モジュールの先頭に、次のコード行を配置します。

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

SetForegroundWindowこれにより、 Windowsに組み込まれている機能にアクセスできるようになります。

コードで、IEオブジェクトを操作しながら、次のようにそのウィンドウのHWNDを記録します。

Dim HWNDSrc As Long
HWNDSrc = ie.HWND

次に、ページを読み込んだ後、これを使用して続行し、主要なアクションを送信します。

SetForegroundWindow HWNDSrc

ただし、IEとの対話方法によっては、これは必要ない場合があります。つまり、ウィンドウを表示/タッチする必要がない場合(の場合SendKeys)、コード内のオブジェクトを使用して対話できます。


クリックした後、Application.Waitを使用しているようですが、IEページが読み込まれたことを保証するものではありません。この関数はそれを助けるはずです。

 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

時間がかかるリスクを冒して、これらの提案でコードを更新しました...

' 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
于 2012-07-25T18:21:32.920 に答える