Trattandosi di applicazione per uso business, non sarebbe sbagliato chiedere l' aiuto di un Analista /Programmatore, cosi' facciamo girare anche l' economia del Paese.
Come ultimi contributi, propongo un paio di ipotesi...
La prima basata su CreateObject("InternetExplorer.APPLICATION") (che consente di gestire l' attesa per il caricamento della pagina) piu' SendKeys per l' invio di ulteriori comandi; con l' avvertenza che SendKeys fa un po' un lavoro alla cieca, che in piu' ha richiesto l' inserimento di una serie di wait per avere la confidenza che il comando sia stato completamente eseguito e si puo' passare al comando successivo, e che i tempi sufficienti sul mio pc possano essere esagerati o insufficienti su un altro pc. Inoltre il codice
deve essere eseguito su un pc dedicato (perche' la macro invia i comandi all' applicazione attiva; se non e' IE va tutto all' aria).
Corrisponde al seguente codice, da inserire tutto in un "Modulo vba" dedicato.
- Codice: Seleziona tutto
Dim IE As Object
Option Base 0
Sub Test11()
Dim rCell As Range, myRan As Range
'
If IE Is Nothing Then Set IE = CreateObject("InternetExplorer.APPLICATION")
Set myRan = ThisWorkbook.Sheets("Foglio1").Range("A2:A100") '<<< Il foglio nel file che contiene le macro con l' elenco url
'
For Each rCell In myRan
If rCell <> "" Then
GetTabbb (rCell.Value)
'Personalizzare la prossima con Path e nome file (1) >>>
mykeys = Array("^s", "C:\Users\UTENTE\Documents\zczcpippo", "{TAB}", "{TAB}", "{TAB}", "{TAB}", "{ENTER}")
DoEvents
For J = LBound(mykeys) To UBound(mykeys)
SendKeys mykeys(J), True
If J < 2 Then myWait (1) Else myWait (0.2)
Debug.Print mykeys(J)
Next J
myWait (0.5)
Debug.Print " "
Debug.Print "Next link>>>>>>>"
On Error Resume Next
'Personalizzare le prossime due con Path e nome file (2) >>>
Name "C:\Users\UTENTE \Documents\zczcpippo.mht" As "C:\Users\UTENTE \Documents\zczc" & Format(Now(), "yyyy-mm-dd-hh-mm-ss") & ".mht"
Name "C:\Users\UTENTE \Documents\zczcpippo.htm" As "C:\Users\ UTENTE \Documents\zczc" & Format(Now(), "yyyy-mm-dd-hh-mm-ss") & ".htm"
On Error GoTo 0
End If
Next rCell
myWait (5)
Debug.Print "Kill IE"
IE.Quit
Set IE = Nothing
'
End Sub
Sub GetTabbb(myUrl)
'
With IE
ReNav:
On Error GoTo NoNav
Debug.Print ">"
myWait (0.2)
.navigate myUrl
.Visible = True
myWait (0.2)
Do While .Busy: DoEvents: Loop 'Attesa not busy
Do While .readyState <> 4: DoEvents: Loop 'Attesa documento
End With
'
'attesa addizionale
myWait (1)
Exit Sub
NoNav:
Debug.Print ("NoNav")
myWait (0.5)
On Error GoTo 0
Resume ReNav
'
End Sub
'
Sub myWait(myStab As Single)
Dim myStTiM As Single
'
myStTiM = Timer
Do 'wait myStab
DoEvents
If Timer > myStTiM + myStab Or Timer < myStTiM Then Exit Do
Loop
End Sub
La macro da lanciare e' la Test11
Le istruzioni marcate <<< oppure >>> sono da personalizzare.
La macro crea una sessione InternetExplorer; all' interno di questa apre una dopo l' altra le pagine web elencate; successivamente invia con SendKeys un elenco di comandi (vedi (1) <<<) alla sessione IE con l' obiettivo di salvare in locale la pagina; infine il file salvato viene rinominato.
A tal proposito, come noterai (vedi (1) >>> e (2) >>>), quando salvo una pagina web assegno un nome specifico (vedi (1) >>>) e successivamente rinomino questo file assegnado un nome univoco (desinenza data/ora); mi immagino che tu vorrai rinominare il file in modo piu' creativo, pensando soprattutto a come poi dovranno essere utilizzati, e lo farai modificando le istruzioni (2) >>>
Una seconda possibilita' consiste nell' uso della funzione URLDownloadToFile (una Api di sistema) che abbiamo usato ad esempio qui:
viewtopic.php?p=561166#p561186Con questa funzione si copia in locale il solo codice html, quindi mancheranno ad esempio immagini e altre informazioni linkate dal codice; la cosa potrebbe pero' essere ancora utile se il file viene aperto su un pc connesso a Internet e se le immagini e le altre informazioni linkate sono sempre disponibili sul sito linkato, e se il sorgente non lavora con un foglio di stile css molto sofisticato; cose che devi controllare tu.
Il codice concettuale per questa seconda opzione, da inserire in un "Modulo vba" dedicato, e' del tipo:
- Codice: Seleziona tutto
Private Declare Function URLDownloadToFile Lib "urlmon" Alias _
"URLDownloadToFileA" (ByVal pCaller As Long, ByVal szURL As String, ByVal _
szFileName As String, ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long
'
Sub Test22()
Dim myRan As Range, rCell As Range, Resp As Long, dLock As Long
Dim myUrl As String, myFFName As String, myPath As String
Set myRan = ThisWorkbook.Sheets("Foglio1").Range("A2:A100") '<<< Il foglio nel file che contiene le macro con l' elenco url
myPath = "C:\UTENTE\Documents\FILE_" '<<< Il path dove saranno salvati i file
'
For Each rCell In myRan
If rCell <> "" Then
dLock = 0
myUrl = rCell.Value
'La prossima andra' ovviamente personalizzata per salvare con un nome file significativo...
myFFName = myPath & Format(Now(), "yyyy-mm-dd-hh-mm-ss") & ".htm" '<<<
ReDown:
dLock = dLock + 1
Resp = URLDownloadToFile(0, myUrl, myFFName, 0, 0)
If Resp = 0 Then
'eventuali azioni quando il file e' stato salvato '<<<<
Else
If dLock < 10 Then
GoTo ReDown
Else
'Scaricamento non riuscito...
'...Istruzioni da eseguire nella circostanza '<<<
MsgBox ("Fallito: " & myUrl)
End If
myWait (1) '!!! Usa la myWait della soluzione precedente
End If
End If
Next rCell
'
End Sub
Le istruzioni marcate <<< sono da personalizzare
Nota che anche questa soluzione usa la Sub myWait, assicurati che sia gia' presente.
E' evidente la maggiore semplicita' della soluzione, che nasconde anche una stabilita' impensabile con SendKeys; questo a fronte delle limitazione sul tipo di salvataggio effettuato.
Se questa seconda soluzione non e' sufficiente, l' ipotesi principe per me e' sempre quella di creare in modo programmatico la sessione IE, aprire le pagine web, estrarre dalle pagine le informazioni che servono e usarle per crearsi pagine in un formato proprio.
Ciao