Per accedere alle informazioni contenute nelle pagine web abbiamo spesso usato InternetExplorer (IE), a cui il vba accede tramite una librera specifica, mshtml.tlb
Tramite i comandi resi disponibili da mshtml.tlb e' possibile aprire una pagina web, leggerne il contenuto, interagire con la pagina, salvare informazioni lette nella pagina, e molto altro.
Lo abbiamo fatto spesso; alcune discussioni a caso:
http://www.pc-facile.com/forum/viewtopi ... 84#p654158
http://www.pc-facile.com/forum/viewtopi ... 28#p654429
http://www.pc-facile.com/forum/viewtopi ... 70#p655197
http://www.pc-facile.com/forum/viewtopi ... 10#p654369
http://www.pc-facile.com/forum/viewtopi ... 86#p642035
http://www.pc-facile.com/forum/viewtopi ... 34#p636420
http://www.pc-facile.com/forum/viewtopi ... 56#p658466
http://www.pc-facile.com/forum/viewtopi ... 53#p658366
Nel tempo IE e' stato superato da nuovi browser (Chrome, Firefox, Opera, Edge, ??) e numerosi siti non lo supportano piu', sia per problemi di sicurezza che di prestazioni. Infine, il nuovo sistema operativo Windows 11 non supporta piu' IE.
Tutto questo significa che le macro basate su IE sono destinate a diventare inutilizzabili.
Possibile evoluzione
Una alternativa meno flessibile e' l'ambiente "Selenium": nato per creare ambienti di test automatizzati, puo' essere benissimo utilizzato per interagire con le pagine web per scopi non di test, ad esempio navigare, inserire parametri, leggere dati, esattamente come si faceva con IE.
L'ambiente Selenium comprende un "incapsulatore" che si chiama Selenium Basic e un driver specifico per il browser che si vuole utilizzare.
1) Per prima cosa e' necessario scaricare quindi Selenium Basic; lo trovate qui:
https://github.com/florentbr/SeleniumBasic/releases
La versione corrente e' la SeleniumBasic v2.0.9.0; e' del 2016, quindi dovrebbe essere abbastanza stabile
Cliccate sul link SeleniumBasic-2.0.9.0.exe per scaricarlo sul vostro pc
Completato il download, fate doppioclick sul file scaricato per installare SeleniumBasic (come in tutte le installazioni, e' suggerito di chiudere altre applicazioni prima di procedere).
Durante l'installazione vi verra chiesto, in step successivi:
-di accettare i termini della licenza
-di specificare quali moduli installare; il mio suggerimento e' di installare solo Template and example e i driver per i browser che intendete usare (io mi limitero' a usare Chrome; oppure Edge in situazioni in cui Chrome non possa funzionare)
-di confermare l'installazione nella directory standard (C:\Users\NomeUtente\AppData\Local\SeleniumBasic; per sicurezza prendete nota della directory di installazione, vi servira' tra poco)
Completata l'installazione di SeleniumBasic, aprite la directory di installazione (nel mio caso C:\Users\NomeUtente\AppData\Local\SeleniumBasic)
-cancellate i file chromedriver.exe e edgedriver.exe perche' certamente NON SONO allineati ai vostri browser (immagino che non siano allineati nemmeno i driver per Firefox e per Opera, ma io non usero' mai questi driver)
2) Installiamo quindi i driver giusti...
...che purtroppo cambiano con la versione del browser
2a) per Chrome (fino a Vers 114)
-Aprite Chrome, e nella barra dell'indirizzo scrivete chrome://settings/help
-Prendete nota della versione installata; io (oggi) ho la Versione 95.0.4638.69 (Build ufficiale) (a 64 bit)
-andare su https://sites.google.com/chromium.org/driver/downloads
-cercate una versione di ChromeDriver compatibile col vostro browser; cliccateci sopra per andare alla pagina da cui scaricare il driver; scaricate il driver compatibile con la vostra piattaforma. Io ho scaricato chromedriver_win32.zip (non esiste una versione a 64 bit)
-completato il download, aprite il file .zip ed "estraete" il driver chromedriver.exe posizionandolo nella directory di installazione di SeleniumBasic
Per Chrome Vers-115 e superiori, vedere https://www.pc-facile.com/forum/viewtopic.php?f=26&t=112225#p664966
2b) per Edge
-aprite Edge, e nella barra dell'indirizzo scrivere edge://settings/help
- Prendete nota della versione installata; io (oggi) ho la Versione 95.0.1020.53 (Build ufficiale) (64 bit)
-i driver per Edge sono disponibili qui: https://developer.microsoft.com/en-us/m ... webdriver/
-cercate una versione di driver compatibile col vostro browser; io ho scaricato Version: 95.0.1020.44 per X64
-completato il download, aprite il file .zip ed "estraete" il driver msedgedriver.exe posizionandolo nella directory di installazione di SeleniumBasic
-RINOMINARE il file come edgedriver.exe
L'AMBIENTE SeleniumBasic e' ora installato
NB: Eventuali aggiornamenti a Chrome oppure Edge potrebbero richiedere la installazione di nuovi Driver Selenium. Suggerisco quindi di disabilitare l'aggiornamento automatico di questi programmi.
Se aprite Excel e da qui aprite il vba, tra le librerie disponibili dovreste ora trovare la "Selenium Type Library" (Menu /Strumenti /Riferimenti; scorrete l'elenco e cercatela)
Il riferimento a questa libreria puo' essere impostato manualmente, quando sappiamo di doverla usare (cercare la libreria, spuntarla, premere Ok); oppure puo' essere impostato all'esecuzione della macro tramite la funzione CreateObject. Queste due modalita' in vba sono chiamate rispettivamente Early binding e Late binding (Associazione anticipata o Associazione tardiva)
La prima modalita' consente di usare i tipi dati e di ricevere suggerimenti durante la scrittura del codice; la seconda teoricamente e' vantaggiosa da usare quando non si conosce esattamente la versione dell'ambiente da creare. Nel caso Selenium quindi il metodo della "spunta" e' quello preferibile.
3) Prova dell'ambiente
Dopo aver installato l'ambiente di prova (come descritto sopra) possiamo controllare se tutto funziona.
Allo scopo, scaricate questo file:
https://www.dropbox.com/s/jcjbfw4bu6avh ... .xlsm?dl=0
Il file ha come obiettivo di raccogliere tramite Chrome l'elenco delle discussioni attualmente in prima pagina del nostro forum, organizzanole secondo le colonne che vedete nel foglio.
Questo viene ottenuto tramite la seguente macro, agganciata al pulsante presente nel foglio:
- Codice: Seleziona tutto
Sub SeleniumDemo()
Dim PColl As WebElements, myItm As Object, ItColl As Object, pCount As Long
Dim I As Long, J As Long, mySplit, myTim As Single
Dim WPage As New WebDriver
'
WPage.Start "Chrome", "http://www.pc-facile.com/forum/viewforum.php?f=26/" ' <11
'WPage.Start "edge", "http://www.pc-facile.com/forum/viewforum.php?f=26/" ' <22
WPage.Get "/"
'
myTim = Timer
Range("A:J").ClearContents
Range("A1").Resize(1, 7).Value = Array("Discussione", "Autore", "Aperta il", "Risposte", "Visite", "Ult Autore", "Data")
'
Debug.Print vbCrLf & "Start", WPage.Url, Format(Timer - myTim, "0.00")
J = 2
pCount = 0
Do
pCount = pCount + 1
Sleep 200
Set PColl = WPage.FindElementsByTag("dl")
If PColl.Count > 20 Then Exit Do
If pCount > 50 Then Exit Do
Loop
Debug.Print "B", pCount, PColl.Count, Format(Timer - myTim, "0.00")
For I = 1 To (PColl.Count)
DoEvents
If I < 10 Then Debug.Print I, J, Format(Timer - myTim, "0.00")
If Len(PColl(I).Text) > 40 Then
mySplit = Split(Replace(PColl(I).FindElementsByTag("dt")(1).Text & " ", "»", Chr(10), , , vbTextCompare), Chr(10), , vbTextCompare)
Cells(J, 1).Resize(1, 1 + UBound(mySplit)).Value = mySplit
Cells(J, 4).Value = PColl(I).FindElementsByTag("dd")(1).Text
Cells(J, 5).Value = PColl(I).FindElementsByTag("dd")(2).Text
mySplit = Split(PColl(I).FindElementsByTag("dd")(3).Text & " ", Chr(10), , vbTextCompare)
Cells(J, 6).Resize(1, 1 + UBound(mySplit)).Value = mySplit
J = J + 1
End If
Next I
Debug.Print "FINE", I, J, Format(Timer - myTim, "0.00")
Call ShFormat
MsgBox ("Informazioni raccolte...")
WPage.Quit
End Sub
Se l'ambiente Selenium e' stato predisposto correttamente dovreste trovarvi col riepilogo delle discussioni come la vedete nella home page della sezione Applicativi Office.
Se volete usare Edge, commentate l'istruzione marcata <11 e "scommentate" quella marcata <22
In caso di errori o di risultati inconsistenti allora documentate quali errori vengono segnalati; poi aprite la "finestra Immediata" del vba e copiate le informazioni che vi trovate scritte.
Allegate poi tutto al vostro eventuale messaggio di richiesta di aiuto qui sul forum
Per aprire la finestra Immediata, dall'editor delle macro: premere Contr-g, oppure Menu /Visualizza /Finestra Immediata
Ciao a tutti