Ritorno in argomento.
Un modo per "superare" l'ostacolo lo avrei trovato utilizzando "Application.SendKeys" eseguendo in pratica il "Salva".
Con il mio IE i file vengono salvati nella cartella "Download" dell'utente windows attivo.
Questo è un file dove in Foglio1 ho solo un pulsante.
Nel Modulo1 è presente il codice vba dove la routine "Accedi" serve per lanciare la routine principale di accesso "AccessoPortaleFattureCorrispettivi" a cui assegnare i parametri per accesso (utente, password, pin, utenza di lavoro in caso di accesso per un ente, eventuale partita iva principale in caso di soggetto con più partite iva possedute nel tempo).
Una terza routine è quella che esegue il download ed è nominata "DownloadFattureRicevute".
A questa routine vanno passati tre parametri (presi dalla precedente routine in cui viene richiamata). Va assegnato l'oggetto "Interenet", l'oggetto "Document", e la variabile del tempo di ritardo.
Nella routine di accesso troverai ad un certo punto queste righe di istruzione:
' accesso alla consultazione Fatture elettroniche e altri dati IVA
Call DownloadFattureRicevute(IEApp, IEApp.Document, iDelay)
'\ accesso alla consultazione Fatture elettroniche e altri dati IVA
che richiamano appunto la procedura di download assegnandogli i parametri necessari all'elaborazione.
La cosa funziona per la sola prima pagina dell'elenco delle fatture.
Non ho avuto modo di vedere il caso di più pagine e quindi non ho avuto modo di "analizzare" come intercettare questa eventualità.
Magari in studio, dove posso accedere a qualche cliente che ha un elevato numero di fatture posso provare a vedere se un modo c'è per passare tutte le pagine eventualmente presenti.
Non escludo che ogni tanto ti compaia un avviso di errore (che viene gestito) perché a volte, benché alla fine dal mio pc ho impostato almeno due secondi di ritardo, l'elaborazione è troppo veloce rispetto all'aggiornamento delle pagine.
Qui trovi il link al file:
https://www.dropbox.com/s/q1w2akjia4o4un8/Download%20FE%20ricevute%20da%20ADE.xlsm?dl=0
Questo il codice vba presente nel modulo1:
Option Explicit
#If VBA7 And Win64 Then
Public Declare PtrSafe Function ShowWindow Lib "user32.dll" (ByVal hwnd As LongPtr, ByVal nCmdShow As LongPtr) As LongPtr
#Else
Public Declare Function ShowWindow Lib "user32.dll" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
#End If
Sub Accedi()
Const sNominativoUtente As String = ""
Const sUtenteFisconline As String = "" 'Codice fiscale o utenza Entratel
Const sPassword As String = "" 'Password di accesso della persona fisica
Const sPin As String = "" 'Pin di accesso della persona fisica
Const sSoggettoIncaricante = "" 'Codice fiscale ente giuridico se accesso per conto dello stesso
Const sPIva As String = "" 'Partita iva del soggetto per cui si accede (persona fisica o ente incaricante)
Call AccessoPortaleFattureCorrispettivi(sNominativoUtente, _
sUtenteFisconline, _
sPassword, _
sPin, _
sPIva, _
sSoggettoIncaricante)
End Sub
Sub AccessoPortaleFattureCorrispettivi(Nominativo As String, _
Utente As String, _
Password As String, _
Pin As String, _
PARTITA_IVA As String, _
SOGGETTO_INCARICANTE As String)
'Dim iTimer: iTimer = Timer
Dim IEApp As Object 'InternetExplorer ' Object
Dim but As Object
Dim bLoginOK As Boolean
Dim Window As Object
Const iDelay As Double = 1 '1.5
Const URL As String = "
https://ivaservizi.agenziaentrate.gov.it/portale/"
Application.StatusBar = Nominativo & ": Accesso Fatture & Corrispettivi in corso. Attendere ..."
'<--- verifico se è già aperta una sessione di internet explorer e nel caso chiudo la finestra --->
On Error Resume Next
For Each Window In CreateObject("shell.application").Windows
If Window.Name = "Internet Explorer" Then Window.Quit
Next Window
On Error GoTo Errore
Call TimerDelay(iDelay * 2)
'<--- creo una nuova sessione di internet explorer e carico i dati per accedere a Fatture e corrispettivi --->
Set IEApp = CreateObject("InternetExplorer.Application") 'New InternetExplorer '
On Error Resume Next
With IEApp
.Silent = True
'ShowWindow .hwnd, 3 'Finestra massimizzata
.navigate URL
Do Until .ReadyState = 4: TimerDelay iDelay: Loop
With .Document
.all("username").Value = Utente
.all("password").Value = Password
.all("pin").Value = Pin
Do Until .ReadyState = "complete": TimerDelay iDelay: Loop
.all("login-form").submit
Do Until .ReadyState = "complete": TimerDelay iDelay: Loop
For Each but In .GetElementsByClassName("btn btn-primary")
If Trim(but.InnerText) = "Esci" Then
bLoginOK = True
Exit For
End If
Next but
If bLoginOK Then
Do Until .ReadyState = "complete": TimerDelay iDelay: Loop
Select Case SOGGETTO_INCARICANTE
Case ""
.all("fm_mestesso").submit
Do Until .ReadyState = "complete": TimerDelay iDelay: Loop
.all("sceltapiva").Value = PARTITA_IVA
Do Until .ReadyState = "complete": TimerDelay iDelay: Loop
.all("fm_scelta_piva").submit
Do Until .ReadyState = "complete": TimerDelay iDelay: Loop
Case Else
.all("fm_incarichi").submit ' <--- seleziono l'opzione Incaricato
Do Until .ReadyState = "complete": TimerDelay iDelay: Loop
If InStr(SOGGETTO_INCARICANTE, "-") = 0 Then
SOGGETTO_INCARICANTE = SOGGETTO_INCARICANTE & "-FOL"
End If
.all("sceltaincarico").Value = SOGGETTO_INCARICANTE ' <--- inserisco l'incaricante
Do Until .ReadyState = "complete": TimerDelay iDelay: Loop
.all("incaricodirettoradio").Click
Do Until .ReadyState = "complete": TimerDelay iDelay: Loop
.all("fm_scelta_tipo_incarico").submit ' do Ok al pulsante della partita iva del cliente
Do Until .ReadyState = "complete": TimerDelay iDelay: Loop
.all("sceltapiva").Value = PARTITA_IVA
Do Until .ReadyState = "complete": TimerDelay iDelay: Loop
.all("fm_scelta_tipo_incarico_piva").submit
Do Until .ReadyState = "complete": TimerDelay iDelay: Loop
End Select
Do Until .ReadyState = "complete": TimerDelay iDelay: Loop
End If
End With '.Document
If bLoginOK Then
Do Until .ReadyState = 4: TimerDelay iDelay: Loop
On Error GoTo Errore
'=============
.navigate URL & "home"
Do Until .ReadyState = 4: TimerDelay iDelay: Loop
' accesso alla consultazione Fatture elettroniche e altri dati IVA
Call DownloadFattureRicevute(IEApp, IEApp.Document, iDelay)
'\ accesso alla consultazione Fatture elettroniche e altri dati IVA
Call TimerDelay(iDelay)
Else
.Quit
MsgBox "Login non riuscito. Verificare i dati di accesso.", vbExclamation, "Login non riuscito"
End If
End With 'IEApp
RiprendiErrore:
Application.StatusBar = False
Set Window = Nothing
Set IEApp = Nothing
Exit Sub
Errore:
Select Case Err.Number
Case -
2147023706
MsgBox "Errore n. " & Err.Number & vbNewLine & _
Err.Description & vbNewLine & _
"L'applicazione Internet Explorer non ha completato la chisura definitiva." & vbNewLine & _
"Attendere qualche secondo e riprovare l'accesso!", _
vbCritical, "Errore Accesso"
Case Else
MsgBox "Si è verificato un errore imprevisto!" & vbNewLine & _
"Errore n. " & Err.Number & vbNewLine & _
Err.Description, vbCritical, "Errore VBA imprevisto"
End Select
Resume RiprendiErrore
End Sub
Sub DownloadFattureRicevute(oIE As Object, oDoc As Object, iDelay As Double)
Dim oLinkSpa As Object, obj As Object
Dim str As String, cont As Long
Dim oTable As Object, oRows As Object, oCol As Object
iDelay = iDelay + 1
With oIE
ShowWindow .hwnd, 3 'Finestra massimizzata
With .Document
Set oLinkSpa = .GetElementsByClassName("link_spa")
str = oLinkSpa(4).href
End With
.navigate str & "#/fatture/ricevute"
Do Until .ReadyState = 4: TimerDelay iDelay: Loop
With .Document
Do Until .ReadyState = "complete": TimerDelay iDelay: Loop
For Each obj In .GetElementsByTagName("a")
obj.onclick
Next obj
Do Until .ReadyState = "complete": TimerDelay iDelay: Loop
TimerDelay iDelay
For Each obj In .GetElementsByTagName("button")
If obj.InnerText = "Accetta e prosegui" Then
obj.Click
End If
Next obj
Do Until .ReadyState = "complete": TimerDelay iDelay: Loop
End With
.navigate str & "#/fatture/ricevute"
Do Until .ReadyState = 4: TimerDelay iDelay: Loop
With .Document
Do Until .ReadyState = "complete": TimerDelay iDelay: Loop
Set oTable = .GetElementsByTagName("Table")(0)
End With
Set oRows = oTable.GetElementsByTagName("tr")
For Each obj In oRows
If cont > 0 Then
Set oCol = obj.GetElementsByTagName("td")(11).GetElementsByTagName("a")(0)
.navigate oCol.href
Do Until .ReadyState = 4: TimerDelay iDelay: Loop
TimerDelay iDelay
With .Document
Do Until .ReadyState = "complete": TimerDelay iDelay: Loop
.GetElementsByClassName("btn btn-primary")(1).Click
Do Until .ReadyState = "complete": TimerDelay iDelay: Loop
TimerDelay iDelay
Application.SendKeys "%S"
TimerDelay iDelay
.GetElementsByClassName("btn btn-primary")(2).Click
Do Until .ReadyState = "complete": TimerDelay iDelay: Loop
TimerDelay iDelay
Application.SendKeys "%S"
End With
End If
cont = cont + 1
Next obj
.Quit
End With
MsgBox "Download terminato"
End Sub
Sub TimerDelay(Optional Delay As Double)
Const vDelay As Double = 0.25
Dim vTimer As Double
If Delay = 0 Then Delay = vDelay
vTimer = Timer
Do While Timer < vTimer + Delay: Loop
End Sub