2016-04-28 38 views
0

私は誰かが私を助けることを望んでいます。私は会社のウェブサイトを持っていますので、私は最終的に私はいくつかのフォームの完成を自動化することができる必要がある場所に着くために管理するときにナビゲートしようとしています。VBA IEの自動化 - 制御する子供/新しいウィンドウ

コードを介してリンクを「クリック」して新しいウィンドウが開きます。私は、新しいウィンドウでリンクをクリックし、親ウィンドウに制御を戻すことができる必要があります。

私はこれを行ういくつかの方法を見てきましたが、彼らは私のために働いていないか、私のコードに正しく挿入されていない可能性があります。

シェルメソッドを自分のコードに配置していますが、これを実行するとエラーは発生しませんが、何もしていないため、コントロールが子ウィンドウに移動されているかどうかわかりません。

誰でも手助けできますか?

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 
関連する問題