VBA accroché sur ie.occupé et readystate vérifier
Je suis en train d'essayer d'attraper un joueur de football de données à partir d'un site web pour combler un usage privé de la base de données. J'ai inclus le code complet ci-dessous. Cette première section est un looper qui appelle la deuxième fonction à remplir une base de données. J'ai exécuter ce code dans MSAccess pour remplir une base de données, l'été dernier, et il a travaillé beaucoup.
Maintenant, je suis seulement de faire un peu d'équipes à remplir avant que le programme est accrochée à
While IE.Busy Or IE.ReadyState <> READYSTATE_COMPLETE: DoEvents: Wend
J'ai cherché sur d'innombrables sites web concernant cette erreur et essayé de changer ce code, en mettant en sous-fonction d'attendre une période de secondes ou d'autres solutions de rechange. Aucun de ceux résoudre le problème. J'ai aussi essayé de lancer ce sur plusieurs ordinateurs.
Le premier ordinateur fait par le biais de 3 équipes (ou les trois appels de la 2ème fonction). La seconde plus lent ordinateur permet au travers de 5 équipes. Tous deux fini par accrocher. Le 1er ordinateur a Internet Explorer 10 et le second a IE8.
Sub Parse_NFL_RawSalaries()
Status ("Importing NFL Salary Information.")
Dim mydb As Database
Dim teamdata As DAO.Recordset
Dim i As Integer
Dim j As Double
Set mydb = CurrentDb()
Set teamdata = mydb.OpenRecordset("TEAM")
i = 1
With teamdata
Do Until .EOF
Call Parse_Team_RawSalaries(teamdata![RotoworldTeam])
.MoveNext
i = i + 1
j = i / 32
Status("Importing NFL Salary Information. " & Str(Round(j * 100, 0)) & "% done")
Loop
End With
teamdata.Close ' reset variables
Set teamdata = Nothing
Set mydb = Nothing
Status ("") 'resets the status bar
End Sub
Deuxième fonction:
Function Parse_Team_RawSalaries(Team As String)
Dim mydb As Database
Dim rst As DAO.Recordset
Dim IE As InternetExplorer
Dim HTMLdoc As HTMLDocument
Dim TABLEelements As IHTMLElementCollection
Dim TRelements As IHTMLElementCollection
Dim TDelements As IHTMLElementCollection
Dim TABLEelement As Object
Dim TRelement As Object
Dim TDelement As HTMLTableCell
Dim c As Long
' open the table
Set mydb = CurrentDb()
Set rst = mydb.OpenRecordset("TempSalary")
Set IE = CreateObject("InternetExplorer.Application")
IE.Visible = False
IE.navigate "http://www.rotoworld.com/teams/contracts/nfl/" & Team
While IE.Busy Or IE.ReadyState <> READYSTATE_COMPLETE: DoEvents: Wend
Set HTMLdoc = IE.Document
Set TABLEelements = HTMLdoc.getElementsByTagName("Table")
For Each TABLEelement In TABLEelements
If TABLEelement.id = "cp1_tblContracts" Then
Set TRelements = TABLEelement.getElementsByTagName("TR")
For Each TRelement In TRelements
If TRelement.className <> "columnnames" Then
rst.AddNew
rst![Team] = Team
c = 0
Set TDelements = TRelement.getElementsByTagName("TD")
For Each TDelement In TDelements
Select Case c
Case 0
rst![Player] = Trim(TDelement.innerText)
Case 1
rst![position] = Trim(TDelement.innerText)
Case 2
rst![ContractTerms] = Trim(TDelement.innerText)
End Select
c = c + 1
Next TDelement
rst.Update
End If
Next TRelement
End If
Next TABLEelement
' reset variables
rst.Close
Set rst = Nothing
Set mydb = Nothing
IE.Quit
End Function
IE.Quit
parvient à fermer tous les IE application de manière efficace. Vous pourriez essayer de n'ouvrir qu'un seul IE application et de le passer en paramètre à ta fonction. Mon expérience de l'ouverture de IE processus qui prend du temps...OriginalL'auteur Doubledown | 2013-07-05
Vous devez vous connecter pour publier un commentaire.
Dans
Parse_Team_RawSalaries
, au lieu d'utiliser leInternetExplorer.Application
objet, comment sur l'utilisation deMSXML2.XMLHTTP60
?Ainsi, au lieu de cela:
Peut-être essayer d'utiliser ce (ajouter une référence à "Microsoft XML 6.0" dans l'Éditeur VBA première):
J'ai généralement trouvé que
MSXML2.XMLHTTP60
(etWinHttp.WinHttpRequest
, d'ailleurs) fonctionnent généralement mieux (plus rapide et plus fiable) queInternetExplorer.Application
.Vous pouvez modifier 'IE.Quitter' pour 'Set IE = Rien". Content que ça a aidé!
parce que certains page web met beaucoup de contenu important en javascript pour empêcher les gens de les frotter. Ne MSXML2.XMLHTTP60 prend en charge l'exécution js?
Vous devez également ajouter la référence "Microsoft HTML Object Library" [MSHTML.TLB]
OriginalL'auteur wlgreg
J'ai trouvé ce post très utile lorsque j'ai rencontré de problème similaire. Voici ma solution:
J'ai utilisé
et
Parfois la page est chargé, mais le code s'arrête sur la fonction DoEvents et va sur et sur et sur. À l'aide de ce code, il va sur seulement 1 minute et, si le navigateur n'est pas prêt, il ferme le navigateur et les sorties sub.
OriginalL'auteur user2267971
Je sais que c'est un vieux post, mais. J'ai eu le même problème avec mon code pour le téléchargement du site web des photos à l'aide de VBA Excel automation. Certains sites ne vous laissera pas télécharger un fichier image à l'aide d'un lien sans l'ouvrir le lien dans un navigateur. Cependant, mon code a été accroché, parfois, lorsque le objBrowser.visible a été mis à faux avec le code suivant
la seule solution était de faire de la objBrowser.visible
Je l'ai réparé avec
objBrowser seulement clignote pendant moins d'une seconde, mais il fait le travail!
OriginalL'auteur Rodney Sammut