2017-09-19 1 views
0

Je travaille sur un moyen de remplir des formulaires en ligne en utilisant les données d'une feuille de calcul Excel. J'utilise les modules VBA dans Excel pour le faire.Actualiser ou recharger l'objet Internet Explorer dans Excel VBA

Les étapes sont les suivantes: 1) Accédez à la page 2) Remplir les détails 3) Cliquez sur « Continuer » pour continuer à la page suivante 4) Remplissez plus de détails 5) Cliquez sur « Enregistrer » pour enregistrer la page

Voici le code:

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 

Je l'ai fait étape 1 à 3 bien. Cependant, quand il s'agit de l'étape 4, j'obtiens une erreur. L'erreur est: Erreur d'exécution 424 Objet requis. Je suis conscient que cela signifie que le module est incapable de localiser les éléments à l'étape 4.

L'erreur est exactement:

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

Avant que le processus doit être terminé.

Pour déboguer si le code à l'étape 4 a un problème, je l'ai retiré et l'ai exécuté séparément. J'ai pris la section entière de Step4 & 5 et l'en-tête et l'a fait aller à la deuxième page à la place.

comme ceci:

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 

Et cela a fonctionné.

Je n'ai aucune idée de quel est le problème. Je devine que tout le elementID a été chargé au début ou quelque chose et que les ID de la page 2 n'ont pas été chargés?

Est-ce que quelqu'un connaît la source ou la solution à ce problème? Je vous remercie.

P.S. Tous les noms d'éléments sont copiés et collés à partir du code source du formulaire Web et doivent être corrects.

Modifier: J'ai mis à jour le problème dans un commentaire ci-dessous. Edit2: Essayé exactement le même code sur une machine win10 avec Excel 2016. Code a parfaitement fonctionné. Merci pour toute l'aide fournie.

+0

Il est généralement recommandé d'attendre que l'objet soit trouvé plutôt que de simplement «Happy Flow» jusqu'à la fin de votre programme. Cela peut inclure des attentes directes (puis test pour les objets), ou ma préférence est d'attendre l'existence de l'objet). La lecture de pages Web doit toujours prendre en compte les pages de modification des sites Web, et il existe parfois des problèmes de connectivité. – MacroMarc

+0

J'ai habituellement une fonction quelque chose comme 'WaitForObject (idOrPath en tant que chaîne, ie InternetExplorer) As Boolean'. Ensuite, la fonction peut gérer différentes instructions pour trouver un objet dans l'objet 'ie.Document'. Typiquement une boucle avec essayer de trouver le HTMLElement ou la racine que je suis intéressé à lire, puis aller de l'avant et lire tous les autres éléments sur la page que j'attends d'être là. – MacroMarc

+0

Existe-t-il un moyen particulier d'attendre que tout le contenu de la page soit chargé avant de rechercher des ID? Je pensais que «tandis que IE.Busy ou IE.ReadyState <> 4 DoEvents Wend» fait juste cela, mais je me suis peut-être trompé. –

Répondre

0

Mise à jour le code:

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 

trouvé que cet extrait ne rechargeant la page même si elle est censée à.

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

Est-il possible que l'objet soit déposé à mi-chemin?

Parfois, le code fonctionne lorsque la visibilité de IE est désactivée, mais cela fonctionne comme une fois par heure ou quelque chose avant que la même erreur n'apparaisse.

La page que j'accède semble utiliser ASPX et génère la base de page sur une base de données, aucune idée si cela peut aider.Edit: Essayé exactement le même code sur une machine win10 avec Excel 2016. Code a parfaitement fonctionné.

0

S'il vous plaît essayer ce ... (non testé)

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

Bonjour, j'ai essayé votre code et la même erreur s'est produite. Seulement cette fois-ci, c'est 'Set SaveButton = Doc.ALL (" ctl00_PageContent_SaveButton__Button ")' qui se trouve dans la boucle while. –

+0

Qu'est-ce que cette erreur dit? Assurez-vous de faire référence à l'élément correct sur la page. – sktneer

+0

L'erreur est "L'erreur est: Erreur d'exécution 424 Objet requis." Le nom de l'élément est correct. Toutefois, les éléments de la page peuvent avoir été générés après le chargement de la page ou de quelque chose. J'ai essayé d'utiliser OnError pour détecter avec force quand l'élément est chargé, cependant, il semble que Excel VBA ne peut pas détecter les éléments nouvellement chargés même si la page a fini de charger dans l'IE. –