2016-04-28 58 views
0

我希望有人能幫助我。我有一個公司網站,我試圖通過瀏覽,所以當我最終設法到達我需要的位置時,我可以自動完成某些表單。VBA IE自動化 - 控制兒童/新窗口

我到代碼中的一個地方,通過代碼「鏈接」鏈接,並打開一個新窗口。我需要能夠在新窗口上單擊鏈接,然後將控件切換回父窗口。

我已經看到了一些這樣做的方法,但它們不適合我,或者更可能是我沒有正確地將它們插入到我的代碼中。

我有shell方法放入我的代碼中,並且在運行時沒有引發錯誤,但它沒有做任何事情,而且我不確定控件是否被移動到子窗口。

任何人都可以協助嗎?

Sub Fill_FormLog() 

Dim ie As InternetExplorer 
Dim URL As String 
Dim objElement As Object 
Dim objButton As Object 
Dim objLink As Object 
Dim objLink2 As Object 
Dim objShell As Object 

'Logs into website 
    Set ie = CreateObject("InternetExplorer.Application") 
    With ie 
    .Visible = True 
    .Navigate URL:="***parentwindowURL***" 
    Do Until .ReadyState = 4 
     DoEvents 
    Loop 
    Set mytextfield1 = .Document.all.Item("txtUserName") 
    mytextfield1.Value = "***username***" 
    Set mytextfield2 = .Document.all.Item("txtPassword") 
    mytextfield2.Value = "***password***" 
    ie.Document.getElementById("Submit").Click 
    While .Busy Or .ReadyState <> 4: DoEvents: Wend 
    End With 

'Opens the a link 
With ie 
While .Busy Or .ReadyState <> 4: DoEvents: Wend 
ie.Navigate "***URLstillinparent***", , self 
End With 

'Opens the Profile menu 
With ie 
While .Busy Or .ReadyState <> 4: DoEvents: Wend 
ie.Navigate "***anotherURLinparent***", , ["left"] 
End With 

'Opens the Profile search menu 
With ie 
While .Busy Or .ReadyState <> 4: DoEvents: Wend 
ie.Navigate "***anotherURLinparent***", , ["mainParent"] 
End With 

'Copies the ID# from the Excel worksheet and pastes it to search in site 
With ie 
While .Busy Or .ReadyState <> 4: DoEvents: Wend 
Application.Wait (Now + TimeValue("0:00:02")) 
Set objElement = .Document.frames("mainParent").Document.frames("main1").Document.forms("AgentIdentificationNumberSearch").Document.getElementById("IDN") 
objElement.Value = Sheets("Appointments").Range("a2").Value 
Set objButton = .Document.frames("mainParent").Document.frames("main1").Document.forms("AgentIdentificationNumberSearch").Document.getElementById("Search") 
objButton.Click 
End With 

'Opens view profile summary via child window 
With ie 
While .Busy Or .ReadyState <> 4: DoEvents: Wend 
Application.Wait (Now + TimeValue("0:00:02")) 
Set objLink = .Document.frames("mainParent").Document.forms("AgentProfileList").Document.getElementById("grdProfile_r_0").Document.getElementsByTagName("a")(1) 
objLink.Click 
End With 

'Should move control to child window 
Application.Wait (Now + TimeValue("0:00:05")) 
Set objShell = CreateObject("Shell.Application") 
IE_count = objShell.Windows.Count 
For x = 0 To (IE_count - 1) 
    On Error Resume Next ' sometimes more web pages are counted than are open 
    my_url = objShell.Windows(x).LocationURL 
    my_title = objShell.Windows(x).Document.Title 

    If my_url  Like "***URLofChild/NewWindow***" Then 
    Set ie = objShell.Windows(x) 
    Exit For 
Else 
End If 
Next 

'Should click a link on the child window 
With ie 
While .Busy Or .ReadyState <> 4: DoEvents: Wend 
Application.Wait (Now + TimeValue("0:00:02")) 
Set objLink2 = .Document.forms("form1").Document.getElementsByClassName("topHead").Document.getElementById("topLinks").Document.getElementsByTagName("a")(1) 
objLink2.Click 
End With 

'if I can get the section above to work, I need to return control to the parent window at this point 


End Sub 

回答

0

我發現那個工作來控制子窗口,並能夠進行其他網站一些代碼,但我有另外一個問題就處理這使得這種不必要的。至少我現在知道如何去做。以下代碼適用於我。

該代碼必須在一個對象而不是一個模塊工作。

 Option Explicit 

Public WithEvents IE1 As InternetExplorer 
Public IE2 As InternetExplorer 


Private Sub Automation() 

Dim objElement As Object 
Dim objButton As Object 
Dim objLink As Object 
Dim objLink2 As Object 
Dim mytextfield1 As Object 
Dim mytextfield2 As Object 

Set IE1 = CreateObject("internetexplorer.application") 
Set IE2 = Nothing 

With IE1 
.navigate "***website url***" 
.Visible = True 'allows for viewing the web page 
While .Busy Or .readyState <> 4: DoEvents: Wend 
    Set mytextfield1 = .document.all.Item("txtUserName") 
    mytextfield1.Value = "***username***" 
    Set mytextfield2 = .document.all.Item("txtPassword") 
    mytextfield2.Value = "***password***" 
    While .Busy Or .readyState <> 4: DoEvents: Wend 
    IE1.document.getElementById("Submit").Click 
End With 

    ' loop until the page finishes loading 
Do While IE1.Busy: Loop 

'Opens another link 
With IE1 
While .Busy Or .readyState <> 4: DoEvents: Wend 
IE1.navigate "***url***" 
End With 

'Opens the menu 
With IE1 
While .Busy Or .readyState <> 4: DoEvents: Wend 
IE1.navigate "***URL in frame***", ["left"] 
End With 

'Opens the Profile search menu 
With IE1 
While .Busy Or .readyState <> 4: DoEvents: Wend 
IE1.navigate "***url in another frame***", , ["mainParent"] 
End With 

'Copies the ID# from the Excel worksheet and pastes it to search in site to search 
With IE1 
While .Busy Or .readyState <> 4: DoEvents: Wend 
Application.Wait (Now + TimeValue("0:00:03")) 
Set objElement = .document.frames("mainParent").document.frames("main1").document.forms("AgentIdentificationNumberSearch").document.getElementById("IDN") 
objElement.Value = Sheets("Appointments").Range("a2").Value 
Set objButton = .document.frames("mainParent").document.frames("main1").document.forms("AgentIdentificationNumberSearch").document.getElementById("Search") 
objButton.Click 
End With 

'Clicks "View Profile Summary" and opens new window 
With IE1 
While .Busy Or .readyState <> 4: DoEvents: Wend 
Application.Wait (Now + TimeValue("0:00:03")) 
Set objLink = IE1.document.frames("mainParent").document.forms("AgentProfileList").document.getElementById("grdProfile_r_0").document.getElementsByTagName("a")(1) 
objLink.Click 
End With 

'Ensure new window has been created (if the window does not generate, this will go on forever) 
Do While IE2 Is Nothing: Loop 
Do While IE2.Busy: Loop 

'Click first link in the new window 
With IE2 
While .Busy Or .readyState <> 4: DoEvents: Wend 
Application.Wait (Now + TimeValue("0:00:03")) 
Set objLink2 = IE2.document.forms("form1").document.getElementsByTagName("a")(2) 
objLink2.Click 
End With 

Set IE2 = Nothing 

End Sub 

________________________ 

Private Sub IE1_NewWindow2(ppDisp As Object, Cancel As Boolean) 
    Set IE2 = New InternetExplorer 
    Set ppDisp = IE2.Application 
    Debug.Print "NewWindow2" 
End Sub