私が作成しているマクロは、Excelスプレッドシートから名前を取得し、Internet Explorerを開いて、オンラインディレクトリを検索します。ディレクトリを検索すると、マネージャーの名前が含まれるJavaフォームが表示されます。手動でマネージャー名にタブで移動し、右クリックしてショートカットをコピーし、投稿し直すことができます。スプレッドシート。ただし、一貫したタブとショートカットのコピーに問題があります。
コード:
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
モジュールの先頭に、次のコード行を配置します。
_Public Declare Function SetForegroundWindow Lib "user32" (ByVal HWND As Long) As Long
_
これは _Declare Statement
_ と呼ばれ、Windowsに組み込まれているSetForegroundWindow
関数にアクセスできるようになります。この関数は、Windowsシステムの_user32
_ DLL)にあります。実際には、この方法でVBAにアクセスできる複数のDLLの中に、他の多くの関数があります(その他の例についてはリンクを参照してください)。 )。
コードで、IEオブジェクトを操作しながら、HWND
( handle をそのウィンドウに)を次のように記録します。
_Dim HWNDSrc As Long
HWNDSrc = ie.HWND
_
次に、Javaを操作した後、これを使用して続行します。
_SetForegroundWindow HWNDSrc
_
これは、HWND
で識別されるウィンドウをフォアグラウンドウィンドウとして設定するようにWindowsシステムに指示します(名前が示すように)。
ただし、IEとのやり取りの方法によっては、これは必要ない場合があります。つまり、ウィンドウを表示/タッチする必要がない場合でも、コードに既にあるように、オブジェクトを使用して対話できます。
GetElementById()
やGetElementsByTagName()
( 詳細はこちら )のようなコードを使用して、探しているショートカットを取得する方法はいくつかありますが、方法によって異なります。ソースが作成されました。例えばHTMLソースがわかっている場合、_<a href="...>
_リンクは比較的簡単にプルできるはずです。
コードをもう一度確認した後、ループを使用してマクロを「スローダウン」していることに気付きました。自分と同じような方法でいつも使っている機能があります。うまくいけば、これはあなたが必要なことを成し遂げるのに役立つでしょう。あなたのケースには当てはまらない追加の詳細があったので、以下のコードを自分のオリジナルから変更しました。エラーがあれば、必要に応じて調整できます。
_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
_