Errore di run-time ’91’ (variabile object o variabile di blocco With non impostata)

Sono relativamente nuovo a VBA e sto cercando di mettere insieme un msgbox che mi darà un numero specifico da un web scrap, tuttavia continuo a correre in un errore di run-time ’91’ e semplicemente non riesco a capire come risolvere questo problema. Ho cercato innumerevoli domande sullo stackoverflow, video su youtube e ricerche generiche su google, tuttavia non sono riuscito a scoprire l’errore da solo.

Ecco il codice:

Set IE = CreateObject("InternetExplorer.Application") IE.Visible = True IE.Navigate ("http://brokercheck.finra.org") Do DoEvents Loop Until IE.ReadyState = 4 'Enter values from the corresponding sheet 'Set some generic typing for ease Set doc = IE.document doc.GetElementbyID("GenericSearch_IndividualSearchText").Value = Worksheets("Master").Range("D203") doc.GetElementbyID("GenericSearch_EmploymingFirmSearchText").Value = Worksheets("Master").Range("C203") Set elements = doc.getElementsByTagName("button") For Each element In elements If element.getAttribute("type") = "submit" Then element.Click Exit For End If Next element Do DoEvents Loop Until IE.ReadyState = 4 'find CRD# Set crd = doc.getElementsByClassName("summarydisplaycrd")(0).innerText 'here is where the run time error occurs MsgBox crd 

e l’HTML sto cercando di ottenere le informazioni da:

 
[redacted] (CRD# 5944070)

Sto rivedendo questo codice e il sito finra.org e ho le seguenti osservazioni, che una volta indirizzate dovrebbero risolvere il problema.

inserisci la descrizione dell'immagine qui

  1. L’esempio HTML che hai fornito è semplicemente errato, in base all’HTML effettivo restituito dal pulsante “Verifica”.

    Il codice HTML restituito è simile a questo e il nome della class è "displayname" , non "summarydisplaycrd" :

 
[redacted] (CRD# 123456789)
  1. Il tuo codice esce dal ciclo For each element alla ricerca del primo pulsante “submit”. Questo potrebbe non essere il pulsante “Verifica” (anche se posso ottenere risultati in entrambi i modi, potresti voler aggiungere più logica nel codice per assicurarti che il pulsante “Verifica” sia inviato.

AGGIORNARE

In seguito, mentre riesco a replicare l’errore di tipo 91, non so ancora perché il tuo nome di class appaia diverso dal mio (forse una cosa di IE11, non lo so …) in ogni caso, sono in grado di risolvere il problema con forzare un ritardo più lungo, poiché in questo caso il ciclo DoEvents semplicemente non è adeguato (a volte questo è il caso in cui i dati sono serviti dynamicmente da funzioni esterne, il browser è ReadyState = 4 e .Busy = True, quindi il ciclo non lo fa nulla)

Uso la funzione WinAPI Sleep e imposto un ritardo di 1 secondo dopo che il pulsante “Click” è stato premuto, in loop su ReadyState = 4 e .Busy=True .

NOTA è necessario modificare il parametro classname in base a come viene visualizzato nel codice HTML.

 Option Explicit Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Sub finra() Dim IE As Object Dim doc As Object, element As Object, elements As Object, crd Set IE = CreateObject("InternetExplorer.Application") IE.Visible = True IE.Navigate ("http://brokercheck.finra.org") Call WaitIE(IE, 1000) 'Enter values from the corresponding sheet 'Set some generic typing for ease Set doc = IE.document doc.GetElementbyID("GenericSearch_IndividualSearchText").Value = "steve" doc.GetElementbyID("GenericSearch_EmploymingFirmSearchText").Value = "ed" Set elements = doc.getElementsByTagName("button") For Each element In elements If element.getAttribute("type") = "submit" Then If element.innerText = "Check " Then element.Click Exit For End If End If Next element Call WaitIE(IE, 1000) Dim itms As Object 'Set itms = doc.getElementsByClassName("displaycrd") crd = doc.getElementsByClassName("displaycrd")(0).innerText 'here is where the run time error occurs MsgBox crd End Sub Sub WaitIE(IE As Object, Optional time As Long = 250) Dim i As Long Do Sleep time Debug.Print CStr(i) & vbTab & "Ready: " & CStr(IE.ReadyState = 4) & _ vbCrLf & vbTab & "Busy: " & CStr(IE.Busy) i = i + 1 Loop Until IE.ReadyState = 4 And Not IE.Busy End Sub