Salvare un file Excel su un’altra cartella SharePoint con VBA (SaveAs/SaveCopyAs)

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).

Indice

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 .xlsx le macro non sono consentite; se il workbook contiene macro, usa xlOpenXMLWorkbookMacroEnabled (.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. abc in abc.sharepoint.com).
  • NOME_SITO: lo slug del sito (es. abcShared).
  • NOME_LIBRERIA: tipicamente Shared Documents, Documenti condivisi o 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

FileFormatEstensioneMacroQuando usarlo
xlOpenXMLWorkbook (51).xlsxNoReport senza macro da condividere liberamente.
xlOpenXMLWorkbookMacroEnabled (52).xlsmWorkbook con macro da mantenere operative.
xlExcel12 (50).xlsbFile 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

TemaSuggerimenti
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 specialiNon servono escape manuali; SaveAs gestisce correttamente spazi e parentesi in un URL HTTPS.
FileFormatxlOpenXMLWorkbook.xlsx (senza macro).
xlOpenXMLWorkbookMacroEnabled.xlsm (con macro).
Errore 0A volte Err.Number rimane 0 anche quando il GoTo avvia il gestore errori: controllare il valore prima di mostrare il MsgBox.
Percorsi offlineSe la sincronizzazione è disattivata, mappa la raccolta SharePoint come unità di rete WebDAV o usa la cartella locale di OneDrive.
Alternative avanzatePer upload robusti (versioning, grandi file) considera Microsoft Graph o SharePoint REST API con token OAuth.

Errori frequenti e come risolverli

ErrorePossibile causaSoluzione pratica
1004 – SaveAs method of Workbook class failedURL 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 foundCartella inesistente o percorso non sincronizzato.Controlla la gerarchia cartelle; per OneDrive attendi il sync o crea prima la cartella.
70 – Permission deniedAccesso 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 errorFile 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-hhmmss al 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

  1. Individua l’URL completo della cartella di destinazione in SharePoint.
  2. Conferma i permessi di scrittura e, se necessario, le regole di check-in/out.
  3. Decidi il formato di destinazione (.xlsx, .xlsm, .xlsb).
  4. Implementa un backup (SaveCopyAs) prima dell’overwrite.
  5. Gestisci accuratamente gli errori (evita MsgBox su “Errore 0”).
  6. 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

  1. Costruisci il percorso di destinazione come URL HTTPS completo.
  2. Usa SaveCopyAs per creare copie di backup prima di sovrascrivere il file originale.
  3. Gestisci attentamente gli errori per avere feedback chiari e per evitare falsi “Errore 0”.
  4. 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.

Indice