2017-10-04 12 views
0

VBAを使用してIEオートメーションを実行しています(基本的にはIEを開き、シートの特定のURLに移動してからシートの資格情報を使用してログインしてからWebページからデータを抽出します)これは20のWebサイトで発生するため、私はループのために追加し、正常に動作します。エラーが発生したときにループを再開する方法

ループでエラーが発生した場合は、ループを再起動する必要があります。 私も "エラーが発生したとき0、エラーが発生したとき-1"を試みましたが、動作しませんでした。 以下は私のコードです - 貧しいコーディングのために私を親切にしてください。私はVBAを初めてお使いです。

Sub Get_Data() 
    Sheets("Sheet2").Select 
    Range("E2").Select 
    Range("H6:H120").ClearContents 
    Dim IE As Object 
    Set IE = CreateObject("InternetExplorer.application") 
    IE.Visible = True 
    Dim E As Long 
    Dim S As Long 
    E = Range("A" & Rows.Count).End(xlUp).Row 

JumpToHere: 
    For j = S To E 
     S = Range("H" & Rows.Count).End(xlUp).Row 
     Sheets("Sheet2").Select 
     Range("E" & S).Select 
     ActiveCell.Offset(1, -2).Select 
     Dim X As Variant 
     X = ActiveCell.Value 
     IE.navigate X 
     Do 
      If IE.ReadyState = 4 Then 
       IE.Visible = True 
       Exit Do 
      Else 
       DoEvents 
      End If 
     Loop 

     ActiveCell.Offset(0, 1).Select 
     Dim Y As Variant 
     Y = ActiveCell.Value 
     IE.document.all("username").Value = Y 
     ActiveCell.Offset(0, 1).Select 
     Dim Z As Variant 
     Z = ActiveCell.Value 
     IE.document.all("password").Value = Z 
     IE.document.all("merchant_login_submit_button").Click 
     Application.Wait (Now + TimeValue("0:00:8")) 

     Set ElementCol = IE.document.getElementsByTagName("span") 
     For Each link In ElementCol 
      If link.innerHTML = "Authentication Failed" Then 
       ActiveCell.Offset(0, 3).Value = "Authentication Failed" 
       GoTo JumpToHere 
      End If 
     Next 

     Set tags = IE.document.getElementsByTagName("input") 
     For Each tagx In tags 
      If tagx.Value = "Continue to Control Panel" Then 
       tagx.Click 
       Application.Wait (Now + TimeValue("0:00:3")) 
       Exit For 
      End If 
     Next 


     Set ElementCol = IE.document.getElementsByTagName("a") 
     For Each link In ElementCol 
      If link.innerHTML = "Reports" Then 
       link.Click 
      End If 
     Next 
     Application.Wait (Now + TimeValue("0:00:06")) 
     Dim checkdate As Integer 
     checkdate = Format(Date, "dd") - 1 

     IE.document.getElementById("snapshot_group_by").Value = "payment_processor" 
     IE.document.getElementById("snapshot_end_date_day").Value = checkdate 
     IE.document.all("reports_submit_button").Click 
     Application.Wait (Now + TimeValue("0:00:3")) 

     Dim ws As Worksheet 
     Dim rng As Range 
     Dim tbl As Object 
     Dim rw As Object 
     Dim cl As Object 
     Dim tabno As Long 
     Dim nextrow As Long 
     Dim I As Long 

     Set ws = Worksheets.Add 

     For Each tbl In IE.document.getElementsByTagName("TABLE") 
      tabno = tabno + 1 
      nextrow = nextrow + 1 
      Set rng = ws.Range("B" & nextrow) 
      rng.Offset(, -1) = "Table " & tabno 
      For Each rw In tbl.Rows 
       For Each cl In rw.Cells 
        rng.Value = cl.outerText 
        Set rng = rng.Offset(, 1) 
        I = I + 1 
       Next cl 
       nextrow = 0 
       Set rng = rng.Offset(1, -I) 
       I = 0 
      Next rw 
     Next tbl 

     ws.Cells.ClearFormats 
     Sheets("Sheet2").Select 
     ActiveCell.Offset(0, 3).Value = ActiveSheet.Previous.Range("F4") 
     Application.DisplayAlerts = False 
     ActiveSheet.Previous.Delete 
     Application.DisplayAlerts = True 

     Set ElementCol = IE.document.getElementsByTagName("a") 
     For Each link In ElementCol 
      If link.innerHTML = "Logout" Then 
       link.Click 
      End If 
     Next 
    Next j 

End Sub 
+0

*ループ内でエラーが発生した場合は、ループを再起動する必要があります。なぜ、単にエラーが再び発生しないと思われるのはなぜですか?そしてまた。そしてもう一度... –

+0

実際にあなたは正しいですが、私が求めているのは、私の同僚のシステムでこのコードをテストしたところです。エラーが発生するのは、IEがログイン情報を入力してログインボタンをクリックしてからこれは「初めて」のためだけに起こりますので、ログアウトしてIEを閉じてからコードをもう一度実行すると動作します。このコード行を追加することができることはわかっています。「Application.Wait(Now + TimeValue( "0:00:8"))」は待機しますが、正確で時間を節約してループを再起動すると役立ちます私の状況。 – David

+0

これはx/yの質問です。 'Application.Wait'を使わないでください。適切な準備完了/待機ループを使用して、IEオブジェクトがビジーでないことを確認します。 –

答えて

0

実際の問題のようなサウンドは、コードが適切に待機していないことが原因です。 Application.Waitの代わりに、IE.Navigateまたは任意の要素.Clickを呼び出すか、.Submitというイベントを呼び出すときはいつでも、適切な待機ループを使用してください。

VBA HTML not running on all computers

そうしないと、あなたはあなたのコード内の任意のアクティブなエラー・トラップを持っていません。以下のようにループをOn Errorステートメントで囲みます。

最初のものは、On Error GoTo MyErrorHandlerは、ループ内でエラーが発生した場合の対処方法をプログラムに指示します。エラーがある場合、MyErrorHandlerラベルの下のコードが実行され、NextJラベルで再開します。ループが終了すると、On Error GoTo 0は正常(つまり、なし)エラー処理を返します。ループ外で発生したエラーは、実行時に例外を発生させます。

Option Explicit 
Sub Get_Data() 
    '// Dim your variables 

    '// Executable code starts here 

JumpToHere:  
    For j = S To E 
     On Error GoTo MyErrorHandler 
     ' Now ANY ERROR, ANYWHERE in the loop will go to the error handler 

NextJ: 
    Next j 
    '// Code below this line won't be subject to the error handler 
    On Error GoTo 0 

    '// more code if you have it 

    ' Exit gracefully if there was no error: 
    Exit Sub 

    '// Here is the error handler: 
    MyErrorHandler: 
     Err.Clear() 
     Resume NextJ 
End Sub 

あなたが本当にループを再起動したい場合は

、その後、代わりの NextJは、 Resume JumpToHereを行います。

関連する問題