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.
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
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
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é. –