2012-07-25 2 views
7

내가 만든 건물 매크로는 Excel 스프레드 시트에서 이름을 가져 와서 Internet Explorer를 열고 온라인 디렉토리를 검색합니다. 디렉토리를 검색 한 후 관리자 이름이있는 Java 양식을 가져옵니다. 관리자 이름을 수동으로 탭하여 마우스 오른쪽 버튼을 클릭하고 바로 가기를 복사 한 다음 스프레드 시트에 다시 게시 할 수 있습니다. 그러나 일관된 탭 및 바로 가기 복사 문제가 있습니다.VBA와 인터넷 익스플로러의 상호 작용

  1. IE 창에 포커스를 다시 가져 오는 간단한 방법이 있습니까?
  2. 바로 가기를 수동으로 클릭하지 않고 어떻게 복사합니까?

코드 :

모듈의 시작 부분에서
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 

답변

6

코드 행을 넣어 :이 Declare Statement라고하고 SetForegroundWindow 기능에 액세스 할 수 있습니다

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

을 그 Windows에 내장되어 있습니다. 이 함수는 Windows 시스템의 user32 DLL에 있습니다. 실제로 이러한 방식으로 VBA에 액세스 할 수있는 여러 DLL 중에서 다른 많은 기능이 있습니다 (자세한 예제는 링크 참조). 코드에서

, 당신의 IE 객체와 상호 작용하는 동안, 그래서 같이 HWND (해당 창에 handle)를 기록 :

Dim HWNDSrc As Long 
HWNDSrc = ie.HWND 

을 다음, 당신은 자바와 상호 작용 한 후,이 계속 사용

SetForegroundWindow HWNDSrc 

이것은 Windows 시스템이 HWND으로 식별되는 창을 (이름에서 알 수있는 것처럼) 전경 창으로 설정하도록 지시합니다.

그러나 IE와 상호 작용하는 방식에 따라 필요하지 않을 수도 있습니다. 즉, 창을 보거나 터치 할 필요가없는 경우 코드 에서처럼 객체를 사용하여 상호 작용할 수 있습니다.

GetElementById()GetElementsByTagName() (see here for more info)과 같은 코드를 사용하여 찾고있는 바로 가기를 가져 오는 방법이 있지만 소스가 작성된 방법에 따라 다릅니다. 예 : <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 
+0

전에 setForegroundWindow를 시도했지만 이번에는 고마워! 그러나 HTML 소스는 필요한 링크를 표시하지 않습니다. 비록 링크가 특별히 필요한 것은 아닙니다. 텍스트 (관리자의 이름)가 필요하지만 마우스 오른쪽 버튼으로 복사 할 수 없습니다. 텍스트를 강조하는 간단한 방법이 있습니까? 나는 단지 링크를 복사하여 붙여 넣기를 계획하고 있었고, 빠른 링크를 사용하여 hte 링크 양식에서 이름을 지울 수있었습니다. – orangehairbandit

+1

감사합니다. Gaffi!창의력을 집중시키는 첫 번째 부분은 멋지다. 내가 전에 말했던 것처럼,하지만 당신은 마법의 손길이 있었을 것입니다. 내 질문의 두 번째 부분 인 바로 가기 만들기에서 실수를 발견했습니다. 어떤 이유로 든, 검색 초점을 위해 사용했던 "초점"은 초점을 맞추기 만했으나 선택하지 않았습니다. 그래서 ".select"로 전환하고 application.sendkeys "~"(Enter 키)로 hte sendkeys를 지정하면 모든 것이 함께 나타납니다! 여기에 처음으로 stackflow 사용자가 아니라 독자와 꽤 아프고 심술 궂은 냄새! 감사! – orangehairbandit

+0

@orangehairbandit 기꺼이 도와 드리겠습니다! – Gaffi