2017-09-19 14 views
0

Excelスプレッドシートのデータを使用してオンラインフォームに記入する方法を検討中です。 ExcelでVBAモジュールを使用しています。 1)ページ 2に移動します)詳細を入力し 3)詳細 5に記入)次のページ 4に進み、「続行」をクリックして「保存」をクリックしてください):次のように Excel VBAでInternet Explorerオブジェクトをリフレッシュまたは再ロード

手順

ですここではページに

を保存するコードです:

Sub FillInternetForm() 
    'Header Start 
    Dim IE As Object 
    Dim ROW As Integer 
    Dim MAXROW As Integer 

    Set IE = CreateObject("InternetExplorer.Application") 
    MAXROW = 3 
    ROW = 2 
    'Header End 

    'Step 1 Navigate to the page 
    IE.Navigate *PAGE_1_URL* 
    IE.Visible = True 

    While IE.Busy Or IE.ReadyState <> 4 
    DoEvents 
    Wend 
    'Step 1 Ends 

    'Step 2&3 Fill in the details and click "continue" 
    IE.Document.ALL("ctl00_PageContent_PAYDPaymentMode").Value = "18" 
    IE.Document.ALL("ctl00_PageContent_PAYDPaymentDate").Value = Cells(ROW, 1).Value 
    IE.Document.ALL("ctl00_PageContent_PAYDBusinessUnit").Value = "104" 
    IE.Document.ALL("ctl00_PageContent_PAYDAmountPaid").Value = Cells(ROW, 2).Value 
    IE.Document.ALL("ctl00_PageContent_ContinueButton__Button").Click 

    While IE.Busy Or IE.ReadyState <> 4 
    DoEvents 
    Wend 
    'Step 2&3 Ends (IE moved to page 2) 

    'Step 4&5 Fill in more details and click "Save" 
    IE.Document.ALL("ctl00_PageContent_BankChequeOrOtherRef").Value = ThisWorkbook.Sheets("sheet1").Cells(ROW, 3).Value 
    IE.Document.ALL("ctl00_PageContent_PAYDRemarks").Value = ThisWorkbook.Sheets("sheet1").Cells(ROW, 4).Value 
    IE.Document.ALL("ctl00_PageContent_SaveButton__Button").Click 
    'Step 4&5 Ends 

End Sub 

私は3罰金にステップ1を行いました。ただし、手順4になるとエラーが発生します。エラーは次のとおりです。実行時エラー424オブジェクトが必要です。私は、これはモジュールが正確で誤りがあるステップ4

の要素を見つけることができないことを意味していることを認識しています:プロセスを終了する必要があり

IE.Document.ALL("ctl00_PageContent_BankChequeOrOtherRef").Value = ThisWorkbook.Sheets("sheet1").Cells(ROW, 3).Value 

前に。ステップ4のコードはどんな問題があるかどうかをデバッグする

は、私はそれを取り出して別々に走りました。私はStep4 & 5のセクション全体とヘッダを取り出して、代わりに2ページ目にナビゲートします。

ので、同様

Sub FillInternetForm() 
    Dim IE As Object 
    Dim ROW As Integer 
    Dim MAXROW As Integer 

    Set IE = CreateObject("InternetExplorer.Application") 
    MAXROW = 3 
    ROW = 2 

    IE.Navigate *PAGE_2_URL* 
    IE.Visible = True 
    While IE.Busy Or IE.ReadyState <> 4 
    DoEvents 'wait until IE is done loading page. 
    Wend 

    IE.Document.ALL("ctl00_PageContent_BankChequeOrOtherRef").Value = ThisWorkbook.Sheets("sheet1").Cells(ROW, 3).Value 
    IE.Document.ALL("ctl00_PageContent_PAYDRemarks").Value = ThisWorkbook.Sheets("sheet1").Cells(ROW, 4).Value 
    IE.Document.ALL("ctl00_PageContent_SaveButton__Button").Click 

End Sub 

そしてそれは働きました。

何が問題なのかわかりません。私はすべてのelementIDが最初か何かにロードされていて、ページ2のIDがロードされていないと推測していますか?

誰もがこの問題のソースや解決策を知っていますか?ありがとうございました。

P.S.すべての名前要素IDは、Webフォームのソースコードからコピーされて貼り付けられます。正しいものでなければなりません。

編集:私は以下のコメントで問題を更新しました 。

EDIT2は:エクセル2016のコードが完全に働いたとwin10マシン上で正確に同じコードを試してみました。すべての助けをありがとう。

+0

ウェブスクリプトでは、プログラムの終わりまで単に「ハッピーフロー」ではなくオブジェクトが見つかるまで待つのが一般的です。これには、Outright Waits(オブジェクトのテスト)や、Objectの存在を待つことが優先されます。 Webページの読み込みは、常にWeb開発者の変更ページを検討する必要があり、時には接続の問題があります。 – MacroMarc

+0

私は通常、 'WaitForObject(文字列としてのidOrPath、つまりInternetExplorerとしての)As Boolean'のような関数を持っています。次に、関数は異なる命令を扱い、 'ie.Document'オブジェクト内のオブジェクトを見つけることができます。通常は、私が読んで興味のあるHTMLElementまたはルートを見つけようとしているループで、その後、私がそこにいることを期待しているページの他のすべての要素を読み込みます。 – MacroMarc

+0

IDを検索する前に、ページのすべてがロードされるのを待つ特別な方法はありますか?私は「IE.BusyまたはIE.ReadyState <> 4 DoEvents Wend」がそれをしたと思ったが、私は間違っているかもしれないと思った。 –

答えて

0

(テストされていない)...これを試してみてください:

このスニペットは、それが想定されていてもページが更新されていないことが判明
Sub FillInternetForm() 
    'Header Start 
    Dim IE As Object 
    Dim DOC As Object 
    Dim ROW As Integer 
    Dim MAXROW As Integer 
    Dim SAVEBUTTON As Object 
    Dim COUNTER As Integer 

    Set IE = CreateObject("InternetExplorer.Application") 
    Set SAVEBUTTON = Nothing 
    MAXROW = 3 
    ROW = 2 
    COUNTER = 0 
    'Header End 

    'Step 1 Navigate to the page 
    IE.Navigate "*WEBSITE*" 
    IE.Visible = True 

    While IE.Busy Or IE.ReadyState <> 4 
    DoEvents 
    Wend 
    'Step 1 Ends 

    Set DOC = IE.Document 

    'Step 2&3 Fill in the details and click "continue" 
    DOC.ALL("ctl00_PageContent_PAYDPaymentMode").Value = "18" 
    DOC.ALL("ctl00_PageContent_PAYDPaymentDate").Value = Cells(ROW, 1).Value 
    DOC.ALL("ctl00_PageContent_PAYDBusinessUnit").Value = "104" 
    DOC.ALL("ctl00_PageContent_PAYDAmountPaid").Value = Cells(ROW, 2).Value 
    DOC.ALL("ctl00_PageContent_ContinueButton__Button").Click 
    'Step 2&3 Ends (IE moved to page 2) 


    While IE.Busy Or IE.ReadyState <> 4 Or SAVEBUTTON Is Nothing 
    DoEvents 
    If Not IE.Busy Or IE.ReadyState = 4 Then 
     IE.Refresh 
    End If 
    Set DOC = IE.Document 
    On Error Resume Next 
    Set SAVEBUTTON = DOC.ALL("ctl00_PageContent_SaveButton__Button") 
    COUNTER = COUNTER + 1 
    Wend 


    'Step 4&5 Fill in more details and click "Save" 
    DOC.ALL("ctl00_PageContent_BankChequeOrOtherRef").Value = ThisWorkbook.Sheets("sheet1").Cells(ROW, 3).Value 
    DOC.ALL("ctl00_PageContent_PAYDRemarks").Value = ThisWorkbook.Sheets("sheet1").Cells(ROW, 4).Value 
    DOC.ALL("ctl00_PageContent_SaveButton__Button").Click 
    'Step 4&5 Ends 

End Sub 

に。

If Not IE.Busy Or IE.ReadyState = 4 Then 
     IE.Refresh 
    End If 

オブジェクトが途中で落ちる可能性はありますか? IEの表示がオフになっているとき

は時折コードは動作しますが、正確に同じエラーがポップアップする前に、それは一回毎時間か何かのように動作します。

私がアクセスしていますがページはASPXを使用していないようにみえて、データベース上のページのベースを生成し、これが役立つ場合は考え。

編集:win10マシンでexcel 2016と全く同じコードを試してみました。コードは完璧に機能しました。

0

にコードを更新しました

Sub FillInternetForm() 
    'Header Start 
    Dim IE As Object 
    Dim Doc As Object 
    Dim ROW As Integer 
    Dim MAXROW As Integer 
    Dim ContinueButton As Object 
    Dim SaveButton As Object 

    Set IE = CreateObject("InternetExplorer.Application") 
    MAXROW = 3 
    ROW = 2 
    'Header End 

    'Step 1 Navigate to the page 
    IE.Navigate PAGE_1_URL 
    IE.Visible = True 

    While IE.Busy Or IE.ReadyState <> 4 Or ContinueButton Is Nothing 
    DoEvents 
    Set Doc = IE.document 
    Set ContinueButton = Doc.ALL("ctl00_PageContent_ContinueButton__Button") 
    Wend 
    'Step 1 Ends 

    'Step 2&3 Fill in the details and click "continue" 
    Doc.ALL("ctl00_PageContent_PAYDPaymentMode").Value = "18" 
    Doc.ALL("ctl00_PageContent_PAYDPaymentDate").Value = Cells(ROW, 1).Value 
    Doc.ALL("ctl00_PageContent_PAYDBusinessUnit").Value = "104" 
    Doc.ALL("ctl00_PageContent_PAYDAmountPaid").Value = Cells(ROW, 2).Value 
    ContinueButton.Click 

    While IE.Busy Or IE.ReadyState <> 4 Or SaveButton Is Nothing 
    DoEvents 
    Set Doc = IE.document 
    Set SaveButton = Doc.ALL("ctl00_PageContent_SaveButton__Button") 
    Wend 
    'Step 2&3 Ends (IE moved to page 2) 

    'Step 4&5 Fill in more details and click "Save" 
    Doc.ALL("ctl00_PageContent_BankChequeOrOtherRef").Value = ThisWorkbook.Sheets("sheet1").Cells(ROW, 3).Value 
    Doc.ALL("ctl00_PageContent_PAYDRemarks").Value = ThisWorkbook.Sheets("sheet1").Cells(ROW, 4).Value 
    SaveButton.Click 
    'Step 4&5 Ends 

End Sub 
+0

こんにちは、私はあなたのコードを試して、同じエラーが発生しました。このときだけ、 'Save SaveButton = Doc.ALL(" ctl00_PageContent_SaveButton__Button ")'がwhileループ内にあります。 –

+0

そのエラーとは何ですか?ページの正しい要素を参照していることを確認してください。 – sktneer

+0

エラーは「エラーは:ランタイムエラー424オブジェクトが必要」です。 要素の名前が正しいです。ただし、ページがロードされた後に、ページ内の要素が生成されている可能性があります。私はOnErrorを使用して、要素がロードされたときに強制的に検出しようとしましたが、ページがIEでのロードを完了したにもかかわらずVBAが新しくロードされた要素を検出できないようです。 –

関連する問題