Ciao Andrea,
non riporti il messaggio dell'errore VBA ma probabilmente si tratta del fatto che non risulta "agganciata" la dll "Microsoft XML, V6.0.
Nella barra degli strumenti dell'editor VBA c'è la voce Strumenti e una sottovoce Riferimenti ...

Cliccando su Riferimenti ... si apre questa finestra:

Come vedi da me ho la spunta su Microsoft XML, v6.0.
Se non vedi anche da te allora devi cercare il componente.
In realtà postresti anche utilizzare quello che si vede il lista, ma non è selezionato, Microsoft XML, v3.0
Comunque ti metto il link ad una nuova versione: File esempio (2)
Oggi ho potuto provare il file con un numero maggiore di file xml e ho riscontrato un errore con la fuzione "Transpose" (che ho utilizzato prima di inserire i dati elaborati nella tabella).
Non sono riuscito a capire perché la funzione Transpose andasse in errore e allora ho provveduto ad effettuare una transposizione dalla matrice originaria ad una in maniera "manuale" (tramite un ciclo).
Forse i tempi si allungano di qualcosa ma provando non mi pare che sia percepibile dai "sensi umani".
Inoltre ho impostato tre diverse gestioni di eventuali errori (mi sono reso conto che così come avevo impostato prima un errore in fase successiva all'elaborazione dei file mandava in "loop" il messaggio di errore.
Riporto tutto il codice modificato a benificio di tutti:
Sub CaricaDatiFatture()
'''--- N.B. è stata caricata la dll msxml6.dll
'''--- Strumenti->Riferimenti...->Microsoft XML, V6.0
Dim sPath As String
Dim oFso As Object
Dim oFsoFolder As Object
Dim oFile As Object
Dim strFile As String
Dim sNomeFile As String
Dim vMatch As Variant
'---
Dim DomDoc As DOMDocument
Dim oChildNodeFatturaElettronicaBody As IXMLDOMElement
'---
Dim sNominativoFornitore As String
Dim sCodiceIva As String
Dim sTipoDocumento As String
Dim sDataFattura As Long
Dim sMeseFattura As Long
Dim sNumeroFattura As String
Dim bCaricaDatiFattura As Boolean
Dim cont As Long
Dim i As Long, j As Long
Dim arrDatiFattura() As Variant
Dim arrDatiFatturaTrasposti() As Variant
Dim nRighe As Long
'---
Dim oLoDataBase As ListObject
Const NumeroCampiDati As Long = 15
Const sNodoDatiAnagrafici As String = "FatturaElettronicaHeader/CedentePrestatore/DatiAnagrafici"
Const sNodoDenominazioneCedente As String = sNodoDatiAnagrafici & "/Anagrafica/Denominazione"
Const sNodoCognomeCedente As String = sNodoDatiAnagrafici & "/Anagrafica/Cognome"
Const sNodoNomeCedente As String = sNodoDatiAnagrafici & "/Anagrafica/Nome"
Const sNodoIdPaese As String = sNodoDatiAnagrafici & "/IdFiscaleIVA/IdPaese"
Const sNodoIdCodice As String = sNodoDatiAnagrafici & "/IdFiscaleIVA/IdCodice"
Const sDatoNonDisponibile As String = "N.D."
'''--- procedura per selezionare la cartella in cui sono presenti i file delle fatture elettroniche da caricare nel db
'With Application.FileDialog(msoFileDialogFolderPicker)
' .Title = "Seleziona il percorso contenente i file xml delle fatture di acquisto da cui importare i dati"
' If .Show = -1 Then
' sPath = .SelectedItems(1)
' Else
' Exit Sub
' End If
'End With
'''---in alternativa alla procedura di cui sopra indicazione del percorso "predeterminato" in cui sono presenti i file delle fatture elettroniche da caricare nel db
sPath = "C:\Test\xml"
On Error GoTo ErroreFaseIniziale
Set oFso = CreateObject("Scripting.FileSystemObject")
Set oFsoFolder = oFso.GetFolder(sPath)
Set DomDoc = New DOMDocument
With ThisWorkbook
With .Worksheets("DataBase")
Set oLoDataBase = .ListObjects("DataBase")
If oLoDataBase.DataBodyRange Is Nothing Then oLoDataBase.ListRows.Add AlwaysInsert:=True
End With
End With
On Error GoTo ErroreElaborazioneFile
For Each oFile In oFsoFolder.Files
strFile = oFile
sNomeFile = oFile.Name
vMatch = Application.Match(sNomeFile, oLoDataBase.ListColumns("Nome File").DataBodyRange, 0)
If IsError(vMatch) Then
bCaricaDatiFattura = True
Else
bCaricaDatiFattura = False
End If
If bCaricaDatiFattura Then
If LCase(oFso.getExtensionName(oFile)) = "xml" Then
With DomDoc
.async = False
.Load strFile
With .DocumentElement
If .BaseName = "FatturaElettronica" Then
If .SelectNodes(sNodoDenominazioneCedente).Length > 0 Then
sNominativoFornitore = .SelectNodes(sNodoDenominazioneCedente)(0).Text
Else
sNominativoFornitore = .SelectNodes(sNodoCognomeCedente)(0).Text & " " & _
.SelectNodes(sNodoNomeCedente)(0).Text
End If
sCodiceIva = .SelectNodes(sNodoIdPaese)(0).Text & _
.SelectNodes(sNodoIdCodice)(0).Text
'Dati per ciascuna fattura presente nel "lotto di fatture"
For Each oChildNodeFatturaElettronicaBody In .SelectNodes("FatturaElettronicaBody")
With oChildNodeFatturaElettronicaBody
'Dati Generali
With .getElementsByTagName("DatiGenerali")(0)
With .SelectNodes("DatiGeneraliDocumento")(0)
sTipoDocumento = .SelectNodes("TipoDocumento")(0).Text
sDataFattura = CLng(CDate(Format(.SelectNodes("Data")(0).Text, "dd/mm/yyyy")))
sMeseFattura = Month(sDataFattura)
sNumeroFattura = "'" & .SelectNodes("Numero")(0).Text
End With ' .SelectNodes("DatiGeneraliDocumento")(0)
End With ' .getElementsByTagName("DatiGenerali")(0)
'Dati Beni Servizi con riporto dati comuni della fattura per ciacuna riga di dettaglio
With .getElementsByTagName("DatiBeniServizi")(0)
For i = 1 To .SelectNodes("DettaglioLinee").Length
cont = cont + 1
ReDim Preserve arrDatiFattura(1 To NumeroCampiDati, 1 To cont)
arrDatiFattura(1, cont) = sNomeFile
arrDatiFattura(2, cont) = sNominativoFornitore
arrDatiFattura(3, cont) = sCodiceIva
arrDatiFattura(4, cont) = sTipoDocumento
arrDatiFattura(5, cont) = sDataFattura
arrDatiFattura(6, cont) = sMeseFattura
arrDatiFattura(7, cont) = sNumeroFattura
'dati per ciascuna linea di dettaglio con riporto dati solo dell'eventuale prima istanza del codice articolo
With .SelectNodes("DettaglioLinee")(i - 1)
'Codice Articolo
If .SelectNodes("CodiceArticolo").Length > 0 Then
arrDatiFattura(8, cont) = .SelectNodes("CodiceArticolo")(0).SelectNodes("CodiceTipo")(0).Text
arrDatiFattura(9, cont) = .SelectNodes("CodiceArticolo")(0).SelectNodes("CodiceValore")(0).Text
Else
arrDatiFattura(8, cont) = sDatoNonDisponibile
arrDatiFattura(9, cont) = sDatoNonDisponibile
End If
'Descrizione
arrDatiFattura(10, cont) = .SelectNodes("Descrizione")(0).Text
'Unità di misura, Prezzo Unitario e Quantità
'Se il tipo documento è una nota di credito i valori vengono resi "assoluti" e poi negativi
If sTipoDocumento = "TD04" Then
If .SelectNodes("Quantita").Length > 0 Then
arrDatiFattura(11, cont) = Abs(CDec(Replace(.SelectNodes("Quantita")(0).Text, ".", ","))) * -1
Else
arrDatiFattura(11, cont) = -1
End If
arrDatiFattura(13, cont) = Abs(CDec(Replace(.SelectNodes("PrezzoUnitario")(0).Text, ".", ","))) * -1
arrDatiFattura(14, cont) = Abs(CDec(Replace(.SelectNodes("PrezzoTotale")(0).Text, ".", ","))) * -1
Else
If .SelectNodes("Quantita").Length > 0 Then
arrDatiFattura(11, cont) = CDec(Replace(.SelectNodes("Quantita")(0).Text, ".", ","))
Else
arrDatiFattura(11, cont) = 1
End If
arrDatiFattura(13, cont) = CDec(Replace(.SelectNodes("PrezzoUnitario")(0).Text, ".", ","))
arrDatiFattura(14, cont) = CDec(Replace(.SelectNodes("PrezzoTotale")(0).Text, ".", ","))
End If
'Unità di misura
If .SelectNodes("UnitaMisura").Length > 0 Then
arrDatiFattura(12, cont) = .SelectNodes("UnitaMisura")(0).Text
Else
arrDatiFattura(12, cont) = sDatoNonDisponibile
End If
'Aliquota IVA
arrDatiFattura(15, cont) = CDec(Replace(.SelectNodes("AliquotaIVA")(0).Text, ".", ",")) / 100
End With
Next i
End With ' .getElementsByTagName("DatiBeniServizi")(0)
End With ' oChildNodeFatturaElettronicaBody
Next oChildNodeFatturaElettronicaBody
End If ' .BaseName = "FatturaElettronica"
End With ' .DocumentElement
End With ' DomDoc
End If ' LCase(oFso.getExtensionName(oFile)) = "xml"
End If ' bCaricaDatiFattura
RiprendiErroreElaborazioneFile:
Next oFile
On Error GoTo ErroreInserimentoDati
With Application
.Calculation = xlCalculationManual
.ScreenUpdating = False
.EnableEvents = False
End With
If cont > 0 Then
'trasposizone dei dati in una nuova matrice
'procedura per non utilizzare la funzione Transpose che ha portato ad un errore
'di cui non ho ancora compreso l'origine
ReDim arrDatiFatturaTrasposti(1 To cont, 1 To NumeroCampiDati)
For i = 1 To cont
For j = 1 To NumeroCampiDati
arrDatiFatturaTrasposti(i, j) = arrDatiFattura(j, i)
Next j
Next i
With oLoDataBase
With .DataBodyRange
If .Cells(1).Value = "" Then
.Resize(cont, NumeroCampiDati).Value = arrDatiFatturaTrasposti
Else
oLoDataBase.ListRows.Add AlwaysInsert:=True
nRighe = .Rows.Count + 1
Debug.Print UBound(arrDatiFattura, 1), UBound(arrDatiFattura, 2)
Dim arr As Variant
.Cells(nRighe, 1).Resize(cont, NumeroCampiDati).Value = arrDatiFatturaTrasposti
End If
End With
End With
End If
RiprendiErroreUscitaDefinitiva:
With Application
.Calculation = xlCalculationAutomatic
.ScreenUpdating = True
.EnableEvents = True
End With
Set oFso = Nothing
Set oFsoFolder = Nothing
Set DomDoc = Nothing
Exit Sub
ErroreFaseIniziale:
Select Case Err.Number
Case 76
MsgBox "Il percorso dei file xml non è stato trovato!" & vbNewLine & _
"Verificare le impostazioni del percorso della variabile sPath.", vbExclamation, "Errore Percorso File Xml"
Case Else
MsgBox "Si è verificato un errore imprevisto in fase iniziale!" & vbNewLine & _
"La procedura verrà interrotta.", vbExclamation, "Errore Fase Iniziale"
End Select
Resume RiprendiErroreUscitaDefinitiva
ErroreElaborazioneFile:
MsgBox "Si è verificato un errore per il file " & sNomeFile & vbNewLine & _
"I dati di questo file non verranno importati", vbExclamation, "Errore Elaborazione File"
Resume RiprendiErroreElaborazioneFile
ErroreInserimentoDati:
MsgBox "Si è verificato un errore in fase di inserimento dati nel db!", vbExclamation, "Errore Inserimento Dati"
Resume RiprendiErroreUscitaDefinitiva
End Sub