Vuoi salvare, al termine di una macro, un file Excel archiviato in SharePoint in un’altra cartella della stessa intranet, senza errori di “cartella non trovata”? In questa guida trovi codice pronto, best practice e soluzioni ai problemi più comuni (SaveAs/SaveCopyAs).
Panoramica e obiettivo
Scenario tipico: un file .xlsm è archiviato in una cartella di SharePoint. Alla fine dell’elaborazione, la macro deve:
- salvare il file aggiornato in un’altra cartella SharePoint (anche su un altro sito o library);
- oppure creare una copia di backup prima di sovrascrivere l’originale.
La difficoltà più comune è individuare un percorso valido che i metodi SaveAs o SaveCopyAs riconoscano come raggiungibile (evitando l’errore “cartella non trovata”).
Soluzione essenziale: salvataggio diretto verso URL SharePoint
Quando la libreria è accessibile e l’utente è autenticato, ActiveWorkbook.SaveAs accetta anche URL HTTPS. Usa sempre gli slash (/) e non i backslash (\) nelle URL.
' Schema di base: salvataggio su URL SharePoint
Sub SalvaSuSharePoint()
Dim nuovoPercorso As String
' Percorso completo al file di destinazione su SharePoint
nuovoPercorso = "https://abc.sharepoint.com/sites/abcShared/" & _
"Company Shared Directory/Users/Sam (aka EA)/Bob Automate/" & _
"new_file.xlsx"
' Salvataggio del file in formato xlsx
ActiveWorkbook.SaveAs Filename:=nuovoPercorso, _
FileFormat:=xlOpenXMLWorkbook ' .xlsx
End Sub
Note operative:
- Con
.xlsxle macro non sono consentite; se il workbook contiene macro, usaxlOpenXMLWorkbookMacroEnabled(.xlsm) o scegli un altro formato adeguato. - Assicurati che l’utente abbia i permessi di scrittura nella cartella di destinazione.
- Attendi l’eventuale sync di OneDrive se stai lavorando su file “solo cloud”.
Variante con copia di backup + gestione errori
Questa versione crea una copia di sicurezza, poi salva/aggiorna il file principale. La gestione errori evita falsi positivi con “Errore 0”.
' Copia di backup e salvataggio principale
Sub MakeBackup()
Dim Home As String, HomePath As String, BackupPath As String
Home = ThisWorkbook.Path ' cartella del file corrente
HomePath = Home & "/BOB_Finalv5a.xlsm" ' riscrive il file originale
BackupPath = Home & "/Copies/BOBFinalv5abackup.xlsm" ' copia di backup
On Error GoTo GestErrori
' 1. Copia di backup nella sottocartella “Copies”
ThisWorkbook.SaveCopyAs Filename:=BackupPath
' 2. Salvataggio/aggiornamento del file principale
ActiveWorkbook.SaveAs Filename:=HomePath, _
FileFormat:=xlOpenXMLWorkbookMacroEnabled ' .xlsm
Fine:
Exit Sub
GestErrori:
If Err.Number <> 0 Then ' evita il falso “Errore 0”
MsgBox "Errore " & Err.Number & ": " & Err.Description, vbCritical, "Salvataggio"
End If
Resume Fine
End Sub
Consiglio: per percorsi locali/UNC (non URL), usa preferibilmente i backslash \. Per percorsi HTTPS (SharePoint online), mantieni gli slash /.
Come costruire correttamente l’URL di SharePoint
Un URL di file in una document library segue in genere questa struttura:
https://TENANT.sharepoint.com/sites/NOMESITO/NOMELIBRERIA/CARTELLA1/CARTELLA2/NomeFile.xlsx
- TENANT: il dominio della tua organizzazione (es.
abcinabc.sharepoint.com). - NOME_SITO: lo slug del sito (es.
abcShared). - NOME_LIBRERIA: tipicamente
Shared Documents,Documenti condivisio una library personalizzata. - Sottocartelle: scritte in chiaro con
/tra i segmenti.
Spazi e caratteri: non è necessario fare escape manuale. SaveAs gestisce correttamente spazi e parentesi in URL HTTPS. Evita di inserire backslash \ nelle URL. Per affidabilità, preferisci nomi file/cartele semplici e non eccessivamente lunghi.
Alternative di percorso: OneDrive sincronizzato o WebDAV
Se l’URL diretto non è praticabile o vuoi massima resilienza offline, usa uno di questi approcci.
Percorso locale sincronizzato con OneDrive
Se la library è sincronizzata, il percorso locale appare nel profilo utente, ad esempio:
C:\Users\%USERNAME%\NomeAzienda\Documenti condivisi - NomeSito\Cartella\file.xlsx
In VBA puoi recuperare la base di OneDrive con Environ("OneDriveCommercial") (tenant aziendale) o Environ("OneDrive") (personale). Esempio:
Function OneDriveBase() As String
Dim p As String
p = Environ$("OneDriveCommercial")
If Len(p) = 0 Then p = Environ$("OneDrive")
OneDriveBase = p
End Function
Puoi comporre il percorso locale sincronizzato e invocare SaveAs con backslash. Il sync penserà a propagare la modifica su SharePoint.
Percorso UNC WebDAV (mappatura di rete)
In alternativa mappa la library via WebDAV e usa un UNC in stile:
\\TENANT.sharepoint.com@SSL\DavWWWRoot\sites\NOME_SITO\Shared Documents\Cartella\File.xlsx
Questo approccio è utile quando le policy aziendali impediscono l’uso di URL HTTPS diretti in applicazioni legacy o quando preferisci un percorso “di rete” tradizionale.
Modulo riutilizzabile: salvataggio robusto con backup, timestamp e controlli
Il modulo seguente centralizza le operazioni comuni: creazione backup, salvataggio in vari formati, creazione di cartelle locali, check-in/out per SharePoint e messaggistica chiara in caso d’errore.
' ===== ModSharePointSave.bas =====
Option Explicit
Public Enum WbFmt
wbXlsx = 51 ' xlOpenXMLWorkbook (.xlsx)
wbXlsm = 52 ' xlOpenXMLWorkbookMacroEnabled (.xlsm)
wbXlsb = 50 ' xlExcel12 (.xlsb)
End Enum
' Restituisce data/ora come suffisso per backup
Public Function TimeStamp(Optional ByVal sep As String = "_") As String
TimeStamp = Format(Now, "yyyymmdd-hhnnss")
End Function
' Crea una cartella locale se assente (non per URL)
Private Sub EnsureLocalFolder(ByVal folderPath As String)
Dim fso As Object
If InStr(1, folderPath, "://", vbTextCompare) > 0 Then Exit Sub ' URL: ignora
Set fso = CreateObject("Scripting.FileSystemObject")
If Not fso.FolderExists(folderPath) Then fso.CreateFolder folderPath
End Sub
' Verifica se stringa è un URL HTTPS (SharePoint)
Private Function IsUrl(ByVal pathOrUrl As String) As Boolean
IsUrl = (LCase$(Left$(Trim$(pathOrUrl), 8)) = "https://" Or _
LCase$(Left$(Trim$(pathOrUrl), 7)) = "http://")
End Function
' Salva il workbook corrente verso destinazione (URL HTTPS, UNC o locale).
' Opzioni:
' - makeBackup: crea una SaveCopyAs in "Copies" accanto al file corrente
' - addStamp: aggiunge timestamp al nome backup
' - fmt: formato di destinazione (vedi Enum WbFmt)
' - doCheckIn: esegue il CheckIn se il file è in CheckOut su SharePoint
Public Sub SaveWorkbookTo(ByVal destination As String, _
Optional ByVal makeBackup As Boolean = True, _
Optional ByVal addStamp As Boolean = True, _
Optional ByVal fmt As WbFmt = wbXlsm, _
Optional ByVal doCheckIn As Boolean = False)
Dim bkFolder As String, bkName As String, srcFolder As String
Dim oldDisp As Boolean, oldCal As XlCalculation
Dim dst As String
On Error GoTo FailFast
oldDisp = Application.DisplayAlerts
oldCal = Application.Calculation
Application.DisplayAlerts = False
Application.Calculation = xlCalculationManual
' 1) Backup locale (accanto al file corrente)
If makeBackup Then
srcFolder = ThisWorkbook.Path
If Len(srcFolder) > 0 Then
bkFolder = srcFolder & IIf(Right$(srcFolder, 1) = "\" Or Right$(srcFolder, 1) = "/", "", Application.PathSeparator) & "Copies"
EnsureLocalFolder bkFolder
bkName = Replace$(ThisWorkbook.Name, ".", "backup" & IIf(addStamp, "" & TimeStamp, "") & ".")
ThisWorkbook.SaveCopyAs bkFolder & Application.PathSeparator & bkName
End If
End If
' 2) Salvataggio principale
dst = destination
' se URL: usa slash; se locale/UNC: lascia così
If IsUrl(dst) Then
' Normalizza eventuali backslash
dst = Replace$(dst, "\", "/")
End If
ActiveWorkbook.SaveAs Filename:=dst, FileFormat:=fmt
' 3) Check-in opzionale (se supportato)
If doCheckIn Then
If ThisWorkbook.CanCheckIn Then
ThisWorkbook.CheckIn SaveChanges:=True
End If
End If
Cleanup:
Application.DisplayAlerts = oldDisp
Application.Calculation = oldCal
Exit Sub
FailFast:
' Evita falso Err 0
If Err.Number <> 0 Then
MsgBox "Salvataggio non riuscito." & vbCrLf & _
"Destinazione: " & destination & vbCrLf & _
"Errore " & Err.Number & ": " & Err.Description, _
vbCritical + vbOKOnly, "SaveWorkbookTo"
End If
Resume Cleanup
End Sub
Esempi di utilizzo
' 1) Salva come XLSM su un URL SharePoint (senza rinominare)
Sub Demo_SaveToUrl()
Dim url As String
url = "https://abc.sharepoint.com/sites/Finance/Shared Documents/Reports/ReportMensile.xlsm"
SaveWorkbookTo destination:=url, makeBackup:=True, addStamp:=True, fmt:=wbXlsm
End Sub
' 2) Salva come XLSX su percorso locale sincronizzato OneDrive
Sub Demo_SaveToLocalSync()
Dim base As String, dst As String
base = OneDriveBase()
dst = base & "\Documenti condivisi - Finance\Reports\ReportMensile.xlsx"
SaveWorkbookTo destination:=dst, makeBackup:=True, fmt:=wbXlsx
End Sub
' 3) Salva come XLSB su UNC WebDAV mappato
Sub Demo_SaveToUNC()
Dim unc As String
unc = "\abc.sharepoint.com@SSL\DavWWWRoot\sites\Finance\Shared Documents\Reports\ReportMensile.xlsb"
SaveWorkbookTo destination:=unc, makeBackup:=False, fmt:=wbXlsb
End Sub
Gestione dei formati di file
| FileFormat | Estensione | Macro | Quando usarlo |
|---|---|---|---|
xlOpenXMLWorkbook (51) | .xlsx | No | Report senza macro da condividere liberamente. |
xlOpenXMLWorkbookMacroEnabled (52) | .xlsm | Sì | Workbook con macro da mantenere operative. |
xlExcel12 (50) | .xlsb | Sì | File grandi: formato binario più compatto/veloce. |
Verifiche rapide prima di salvare
- Autenticazione: accedi al sito SharePoint in un browser con lo stesso utente di Office.
- Percorso: apri il file target in lettura via browser per confermare l’URL della library e delle cartelle.
- Permessi: crea/rinomina manualmente un file nella cartella, così verifichi scrittura e versioning.
- Sync: se usi OneDrive, controlla che l’icona del cloud non segnali errori o stato “in pausa”.
Buone pratiche e accorgimenti
| Tema | Suggerimenti |
|---|---|
| Percorso SharePoint | • Usa sempre la URL completa HTTPS con slash (/).• Evita backslash ( \) nelle URL.• Attendi la sincronizzazione OneDrive se la cartella è “solo cloud”. • Per librerie con nomi localizzati (es. Documenti condivisi), copia l’URL dalla barra del browser. |
| Spazi e caratteri speciali | Non servono escape manuali; SaveAs gestisce correttamente spazi e parentesi in un URL HTTPS. |
| FileFormat | • xlOpenXMLWorkbook ⇒ .xlsx (senza macro).• xlOpenXMLWorkbookMacroEnabled ⇒ .xlsm (con macro). |
| Errore 0 | A volte Err.Number rimane 0 anche quando il GoTo avvia il gestore errori: controllare il valore prima di mostrare il MsgBox. |
| Percorsi offline | Se la sincronizzazione è disattivata, mappa la raccolta SharePoint come unità di rete WebDAV o usa la cartella locale di OneDrive. |
| Alternative avanzate | Per upload robusti (versioning, grandi file) considera Microsoft Graph o SharePoint REST API con token OAuth. |
Errori frequenti e come risolverli
| Errore | Possibile causa | Soluzione pratica |
|---|---|---|
1004 – SaveAs method of Workbook class failed | URL errato, permessi insufficienti o formato non coerente con l’estensione. | Verifica l’URL; prova a salvare manualmente nella stessa cartella; allinea estensione e FileFormat. |
76 – Path not found | Cartella inesistente o percorso non sincronizzato. | Controlla la gerarchia cartelle; per OneDrive attendi il sync o crea prima la cartella. |
70 – Permission denied | Accesso in sola lettura o blocco da check-out/versioning. | Chiedi i permessi di scrittura; se la library richiede check-out, usa CanCheckIn/CheckIn. |
75 – Path/File access error | File bloccato da un altro utente o da un processo di sincronizzazione. | Chiudi istanze aperte; attendi librazione del lock; riprova con un backoff (Sleep/DoEvents). |
Strategie di denominazione e versioning
- Backup con timestamp: aggiungi
_yyyyMMdd-hhmmssal nome per distinguere le versioni. - Prefissi per ambiente:
DEV,UAT,PROD_. - Nomi brevi: riduci il rischio di superare i limiti di lunghezza di path.
- Coerenza estensioni: fai corrispondere sempre estensione e
FileFormat.
Integrazione nel ciclo di vita del workbook
Per salvare automaticamente a fine macro o prima della chiusura:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
On Error Resume Next
' Esempio: salvataggio rapido su SharePoint prima di chiudere
SaveWorkbookTo "https://abc.sharepoint.com/sites/Finance/Shared Documents/Archive/Report" & TimeStamp & ".xlsx",
makeBackup:=True, fmt:=wbXlsx
End Sub
Checklist operativa
- Individua l’URL completo della cartella di destinazione in SharePoint.
- Conferma i permessi di scrittura e, se necessario, le regole di check-in/out.
- Decidi il formato di destinazione (
.xlsx,.xlsm,.xlsb). - Implementa un backup (
SaveCopyAs) prima dell’overwrite. - Gestisci accuratamente gli errori (evita MsgBox su “Errore 0”).
- Se lavori offline o con restrizioni, usa sync OneDrive o mappa WebDAV (UNC).
Esempi pratici aggiuntivi
Salvare una copia solo backup in una seconda library
Sub BackupSoloCopia()
Dim urlBackup As String
urlBackup = "https://abc.sharepoint.com/sites/Finance/Shared Documents/Backups/Report_" & TimeStamp & ".xlsm"
ThisWorkbook.SaveCopyAs urlBackup
End Sub
Rinomina e salva in una cartella “Archivio” mantenendo l’originale
Sub ArchiviaConRinomina()
Dim urlArchivio As String
urlArchivio = "https://abc.sharepoint.com/sites/Operations/Shared Documents/Archivio/LogOperazioni_" & TimeStamp & ".xlsx"
ActiveWorkbook.SaveAs Filename:=urlArchivio, FileFormat:=xlOpenXMLWorkbook
End Sub
Creare la sottocartella “Copies” se assente (locale o UNC)
Sub EnsureCopiesAndBackup()
Dim copiesPath As String
copiesPath = ThisWorkbook.Path & Application.PathSeparator & "Copies"
EnsureLocalFolder copiesPath
ThisWorkbook.SaveCopyAs copiesPath & Application.PathSeparator & "backup_" & TimeStamp & ".xlsm"
End Sub
Domande frequenti
Posso usare caratteri speciali nel nome file?
Sì per spazi e parentesi. Evita sequenze troppo complesse e mantieni nomi/percorsi concisi per ridurre le possibilità di errore.
Serve per forza OneDrive?
No. Puoi salvare via URL HTTPS direttamente su SharePoint. OneDrive è utile per lavorare con una copia sincronizzata in locale.
Il salvataggio fallisce solo in alcuni pc
Spesso è un problema di permessi o di profilo non autenticato in Office/SharePoint. Verifica la sessione utente aziendale e le policy.
Quando usare SaveCopyAs?
Sempre quando vuoi preservare lo stato corrente del file prima di un’operazione potenzialmente distruttiva (overwrite, conversione formato, rinomina).
Punti chiave da ricordare
- Costruisci il percorso di destinazione come URL HTTPS completo.
- Usa
SaveCopyAsper creare copie di backup prima di sovrascrivere il file originale. - Gestisci attentamente gli errori per avere feedback chiari e per evitare falsi “Errore 0”.
- Verifica che la cartella SharePoint sia accessibile (sincronizzata o mappata) prima di eseguire il codice.
Snippet “pronti all’uso” (riassunto)
' 1) Salvataggio diretto su SharePoint (URL)
ActiveWorkbook.SaveAs "https://TENANT.sharepoint.com/sites/SITO/Shared Documents/Cartella/Nuovo.xlsx", _
FileFormat:=xlOpenXMLWorkbook
' 2) Backup + salvataggio principale
ThisWorkbook.SaveCopyAs ThisWorkbook.Path & Application.PathSeparator & "Copies\Nomebackup" & TimeStamp & ".xlsm"
ActiveWorkbook.SaveAs ThisWorkbook.Path & Application.PathSeparator & "NomePrincipale.xlsm", _
FileFormat:=xlOpenXMLWorkbookMacroEnabled
' 3) Funzione riutilizzabile
SaveWorkbookTo "[https://TENANT.sharepoint.com/sites/SITO/Shared](https://TENANT.sharepoint.com/sites/SITO/Shared) Documents/Dest/Finale.xlsm", _
makeBackup:=True, fmt:=wbXlsm
Con questi accorgimenti puoi salvare affidabilmente un file Excel da una cartella SharePoint a un’altra direttamente da VBA, con la sicurezza di un backup automatico e una gestione degli errori chiara. Adatta gli esempi al tuo tenant e alla struttura delle tue library, e integra il modulo riutilizzabile nei tuoi progetti.
