2012-07-25 167 views
7

Macro tôi đang xây dựng lấy tên từ bảng tính Excel, mở Internet Explorer và tìm kiếm thư mục trực tuyến. Sau khi tìm kiếm thư mục, nó kéo lên một biểu mẫu Java với tên của người quản lý trong đó. Tôi có thể tự tab cho tên người quản lý, bấm chuột phải, sao chép lối tắt, và sau đó đăng nó trở lại trên bảng tính. Tuy nhiên, tôi đang gặp sự cố với tabbing nhất quán và sao chép lối tắt.Tương tác VBA với internet explorer

  1. Có cách đơn giản nào để đưa tiêu điểm trở lại cửa sổ IE không?
  2. Làm cách nào để sao chép lối tắt mà không cần nhấp vào nó?

Code:

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 

Trả lời

6

Vào đầu module của bạn, đặt dòng mã này:

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

này được gọi là Declare Statement và sẽ cho phép bạn truy cập vào SetForegroundWindow chức năng được xây dựng trong Windows. Chức năng này sống trong user32 DLL của hệ thống Windows. Thực tế có một số hàm khác giữa nhiều DLL có thể truy cập VBA theo cách này (xem liên kết để biết thêm ví dụ).

Trong code của bạn, trong khi tương tác với đối tượng IE của bạn, ghi lại HWND (handle sang cửa sổ đó) như vậy:

Dim HWNDSrc As Long 
HWNDSrc = ie.HWND 

Sau đó, sau khi bạn đã tương tác với Java, sử dụng này để tiếp tục:

SetForegroundWindow HWNDSrc 

Điều này yêu cầu hệ thống Windows đặt cửa sổ được xác định bằng HWND làm cửa sổ nền trước (như tên ngụ ý).

Tuy nhiên, điều này có thể không cần thiết, tùy thuộc vào cách bạn tương tác với IE. Nói cách khác, nếu bạn không cần xem/chạm vào cửa sổ, bạn vẫn có thể tương tác bằng cách sử dụng đối tượng như bạn đã có trong mã của mình.

Có nhiều cách để có được lối tắt bạn đang tìm kiếm bằng cách sử dụng mã như GetElementById()GetElementsByTagName() (see here for more info), nhưng nó sẽ phụ thuộc vào cách nguồn được tạo. ví dụ. liên kết <a href="...> tương đối dễ kéo, nếu bạn biết nguồn HTML.


Sau khi xem xét mã của bạn lần thứ hai, tôi nhận thấy bạn sử dụng vòng lặp để 'làm chậm' macro. Tôi có một chức năng tôi sử dụng tất cả các thời gian cho các phương pháp tương tự của riêng tôi. Hy vọng rằng điều này sẽ giúp bạn hoàn thành những gì bạn cần. Tôi đã sửa đổi mã của tôi dưới đây từ bản gốc của riêng tôi, vì tôi có thêm chi tiết cụ thể không áp dụng cho trường hợp của bạn. Nếu có bất kỳ lỗi nào với nó, tôi có thể điều chỉnh khi cần thiết.

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

tôi đã thử setForegroundWindow trước đây, nhưng lần này nó hoạt động, Cảm ơn! Tuy nhiên, nguồn html không hiển thị liên kết cần thiết. Mặc dù liên kết là không specfically những gì tôi cần. Tôi cần văn bản (tên của người quản lý), nhưng tôi không thể sao chép nó bằng một cú nhấp chuột phải. Có lẽ có một cách đơn giản để làm nổi bật văn bản? Tôi đã lên kế hoạch sao chép và dán liên kết rồi thực hiện một số dòng nhanh để xóa tên khỏi biểu mẫu liên kết hte. – orangehairbandit

+1

Cảm ơn Gaffi!Đó là phần đầu tiên với cửa sổ tập trung làm việc như tuyệt vời. Giống như tôi đã nói tôi đã thử điều đó trước đây, nhưng bạn chắc hẳn đã có sự liên lạc ma thuật. Trong phần thứ hai của câu hỏi của tôi, lối tắt tạo, tôi đã tìm thấy lỗi của mình. Vì lý do gì, ". Tập trung" tôi đã sử dụng cho các tìm kiếm compenent, chỉ đơn giản là tập trung nhưng không chọn. Vì vậy, khi tôi chuyển nó sang ".select" và chỉ định hte sendkeys với một application.sendkeys "~" (Chìa khóa nhập), tất cả đều đến với nhau! Lần đầu tiên của tôi ở đây trên stackflow như một người sử dụng không chỉ là một người đọc và khó chịu khá đau ốm của nó! Cảm ơn! – orangehairbandit

+0

@orangehairbandit Vui vì tôi có thể giúp! – Gaffi