[VBA/HTML] SET de champ qui marche en F8 mais pas en F5

SET de champ qui marche en F8 mais pas en F5 [VBA/HTML] - VB/VBA/VBS - Programmation

Marsh Posté le 30-10-2017 à 11:59:06    

Bonjour tout le monde,

 

J'ai un petit probleme (Sinon je ne serais pas la), J'essaie de remplir un champ dans un formulaire HTML a partir d'un word, jusque la rien de complique.

 

J'ai presque fini la macro VBA mais je n'arrive pas a set le champ que je veux remplir quand j'execute ma macro avec F5, mais tout marche quand je fais un F8 pour la demarrer ...

 

Je vous joint la 1er partie ou ca bloque, avec un bout du code HTML de la page.

 
Code :
  1. Dim htmlSelectElem As HTMLInputElement
  2. Set htmlSelectElem = IEDoc.all("summary4" )
  3. If Not Left(cc.Range, 7) = "Cliquez" Then
  4.     IEDoc.all("summary4" ).Value = cc.Range
 
Code :
  1. <input name ="summary" id="summary4" style="WIDTH" 49.7em" type="text"></input>
 

Si je lance avec F5 la macro s’arrête sur le IEDoc.all("summary4" ).Value = cc.Range et htmlSelectElem reste a nothing en valeur, comme si le set passait a la trap =/
Si vous avez des idées etc, je suis a l’écoute.

 

Edit: normalement je fais un  htmlSelectElem.Value = cc.Range mais je voulais test directement avec le IEDoc.all("summary4" ).


Message édité par lalan28200 le 30-10-2017 à 13:10:36
Reply

Marsh Posté le 30-10-2017 à 11:59:06   

Reply

Marsh Posté le 30-10-2017 à 17:08:26    

Bon j'ai fais 1-2 test ..

Code :
  1. Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
  2. Option Compare Text:
  3. Sub WaitIE(IE As InternetExplorer)
  4.    'On boucle tant que la page n'est pas totalement chargée
  5.    Do Until IE.ReadyState = READYSTATE_COMPLETE
  6.       DoEvents
  7.    Loop
  8. End Sub
  9. Sub clickbutton(bouton As HTMLInputElement)
  10.     bouton.Click
  11. End Sub
  12. Sub test()
  13. Dim cc As ContentControl
  14. Dim IE As New InternetExplorerMedium
  15. Dim IEDoc As HTMLDocument
  16. Dim htmlSelectElem As HTMLGenericElement
  17. Dim htmlstring As String
  18. Dim InputGoogleBouton As HTMLInputElement
  19. Dim htmlTagCol As IHTMLElementCollection
  20. Dim htmlTagname As IHTMLElementCollection
  21. Dim NbrEntree As Integer
  22. Dim elem As Object
  23. Dim nom As String
  24. Dim chemin As String
  25. chemin = "D:\H590653\Desktop\TMP\"
  26. IE.Visible = True
  27. IE.Navigate "http://jtrac:8080/jtrac/app/"
  28. WaitIE IE
  29. Set IEDoc = IE.Document
  30. Set htmlTagCol = IEDoc.getElementsByTagName("a" )
  31.     For Each titre In htmlTagCol
  32.         If titre.sourceIndex = "53" Then
  33.             Set InputGoogleBouton = titre
  34.                 clickbutton InputGoogleBouton
  35.                 WaitIE IE
  36.             Exit For
  37.         End If
  38.     Next
  39. Set htmlSelectElem = IEDoc.all("summary" )
  40.     If htmlSelectElem Is Nothing Then Set htmlSelectElem = IEDoc.all("summary4" )
  41.     If htmlSelectElem Is Nothing Then Set htmlSelectElem = IEDoc.all(64)
  42.     If htmlSelectElem Is Nothing Then Set htmlSelectElem = IEDoc.getElementsByName("summary" )(0)
  43.                
  44.     If htmlSelectElem Is Nothing Then
  45.         MsgBox "error"
  46.         IE.Quit
  47.         Set IE = Nothing
  48.         Exit Sub
  49.     Else
  50.         htmlSelectElem.Value = "Test"
  51.     End If
  52.        
  53. IE.Quit
  54. Set IE = Nothing
  55. End Sub


Programme de test.

 

Si je fais un stop sur "Set htmlSelectElem = IEDoc.all("summary" )" et que je relance directement c'est ok, sinon ca plante sur "htmlSelectElem.Value = "Test""


Message édité par lalan28200 le 30-10-2017 à 17:08:54
Reply

Marsh Posté le 30-10-2017 à 17:17:34    

Bon si je met un

Code :
  1. Sleep 100

avant le set c'est ok ... je comprend pas pourquoi, si quelqu'un a une explication je suis preneur.

Reply

Marsh Posté le 31-10-2017 à 11:42:59    

 
             Bonjour,
 
             c'est juste un problème d'observation du fonctionnement de la page Web, un souci de synchronisation !
             Il faut attendre la disponibilité de l'élément avant de l'appeler !        Via  IsObject  par exemple …
 

Reply

Marsh Posté le 31-10-2017 à 13:57:39    

Merci beaucoup Marc L, je vais regarder ça.

Reply

Marsh Posté le 31-10-2017 à 15:40:30    

 
            Parfois il n'y a pas d'autre choix d'utiliser une temporisation …
            Ne pas oublier aussi la propriété  Busy  d'IE lors de la boucle d'attente du chargement initial de la page.
 
            Voici un exemple sur ce forum combinant tout ceci.
 
            Au passage dans ton code  Is Nothing  sur une variable objet est équivalent à  IsObject  …


Message édité par Marc L le 31-10-2017 à 15:44:19
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed