VBA per navigare su internet
Hai un problema con Excel? 
VBA per navigare su internet
di Mohican1989 data: 06/02/2016 00:08:45
Uso IE 11 per testare il codice.
Scopo: Riuscire a navigare su un sito, inserire username e password per accedervi, cliccare su un pulsante inserire dati e selezionare campi da una combobox per scaricare dei file in modo automatico per tanti portali uno dietro l' altro.
Conoscenze: Non ho conoscenze HTML se non di tipo "ridicolo" non ho mai scritto una riga di codice html.
Domande 1: Prima del risultato ottenuto nel codice che scrivo dopo, leggendo su internet pensavo vi fosse la necessità di flaggare i riferimenti alla libreria Microsoft Internet Controls e Microsoft HTML object Library.
Nel mio codice però ho utilizzato tutti i comandi che dovrebbero far parte di queste librerie, senza dover flaggare i riferimenti. Io pensavo che avere flaggate queste librerie servisse per averne il corretto utilizzo dei metodi e delle proprietà degli oggetti delle librerie. Invece sembra di no, è corretto o è stata solo fortuna ? MI potete spiegare questo punto ?
Domanda 2: Ho capito sempre da internet che la compilazione fatta in debug e quella in run time sono diverse. Bene se uso il codice step by step con f8 riesco a loggarmi all' interno del sito ma se la eseguo mi viene restituito l' errore Runtime 438 proprietà o metodo non supportati dall' oggetto.Se però schiaccio f8 in debug tutto continua liscio come se niente fosse.Potete approfondire questa differenza di compilazione tra run time e debugging ? Inoltre come posso aggirare questo problema e permettermi di inserire i miei dati e loggarmi anche senza eseguire il codice step by step ma solo lanciando la macro ? Grazie
Sub NavigazioneNet()
Dim WEBSITE As String
Dim USERNAME As String
Dim PSW As String
Dim IE As Object
Dim ELEMENTO As Object
WEBSITE = "h t tp://ww w.e xcelvb a.it/"
USERNAME = "tuousername"
PSW = "tuapsw"
Set IE = CreateObject("internetexplorer.application")
With IE
.Visible = True
.navigate WEBSITE
Do Until Not .busy Or readystate = 4
DoEvents
Loop
Set array1 = .document.getelementsbytagname("a")
For Each ELEMENTO In array1
Debug.Print ELEMENTO.innertext
If ELEMENTO.innertext = "Login" Then
Set bottonelogin = ELEMENTO
Exit For
End If
Next
bottonelogin.Click
Set userbar = .document.modulo.UserId
Set passbar = .document.modulo.pass
userbar.Value = USERNAME
passbar.Value = PSW
Set array2 = .document.getelementsbyclassname("pulsante")
For Each ELEMENTO In array2
Debug.Print ELEMENTO.Type
If ELEMENTO.Type = "button" Then
Set bottoneinvia = ELEMENTO
Exit For
End If
Next
bottoneinvia.Click
End With
End Sub |
di Mohican1989 data: 07/02/2016 04:18:27
Ciao, mi rispondo da solo e capisco che vba non sia molto utilizzato per fare azione sul web e la conoscenza dell' argomento sarà più ristretta rispetto ad altre.
Non mi piace per niente come soluzione in quanto preferisco sempre che le macro siano il più elastiche e dinamiche possibili.
Di fatto non capisco bene perché il do until not .busy and .readystate=4 non funzionino o meglio, se funzionino il codice sembra andare più veloce e che non tutta la pagina sia effettivamente caricata.
Ho risolto così ma non chiudo ancora il post sperando in qualcuno di più esperto ne campo
Sub NavigazioneNet()
Dim WEBSITE As String
Dim USERNAME As String
Dim PSW As String
Dim IE As Object
Dim ELEMENTO As Object
WEBSITE = "h t tp://ww w.e xcelvb a.it/"
USERNAME = "tuousername"
PSW = "tuapsw"
Set IE = CreateObject("internetexplorer.application")
With IE
.Visible = True
.navigate WEBSITE
Do Until Not .busy
application.wait now+ timevalue("00:00:02")
loop
Set array1 = .document.getelementsbytagname("a")
For Each ELEMENTO In array1
Debug.Print ELEMENTO.innertext
If ELEMENTO.innertext = "Login" Then
Set bottonelogin = ELEMENTO
Exit For
End If
Next
bottonelogin.Click
Do Until Not .busy
application.wait now+ timevalue("00:00:02")
loop
Set userbar = .document.modulo.UserId
Set passbar = .document.modulo.pass
userbar.Value = USERNAME
passbar.Value = PSW
Set array2 = .document.getelementsbyclassname("pulsante")
For Each ELEMENTO In array2
Debug.Print ELEMENTO.Type
If ELEMENTO.Type = "button" Then
Set bottoneinvia = ELEMENTO
Exit For
End If
Next
bottoneinvia.Click
End With
End Sub |
Vuoi Approfondire?