VBA per navigare su internet



  • 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