Excel: collegamenti che cambiano percorso – soluzione definitiva per link interni ed esterni

In alcune cartelle di lavoro Excel i collegamenti ipertestuali a file nelle sottocartelle smettono di funzionare dopo il salvataggio: da percorsi relativi diventano assoluti nel profilo utente e puntano a AppData\Roaming\Microsoft\Excel. Ecco come impedire il problema e ripristinare sia i link esterni sia quelli interni ai fogli.

Indice

Panoramica del problema

Scenario tipico: il workbook contiene sia collegamenti interni (puntano a fogli/aree della stessa cartella di lavoro) sia collegamenti esterni (puntano a file in sottocartelle rispetto alla posizione del workbook, ad esempio Effects\Lovell\...). Dopo aver salvato e riaperto il file, i link esterni risultano “corrotti”: invece del percorso relativo restano memorizzati come percorso assoluto nel profilo utente, del tipo:

C:\Users<utente>\AppData\Roaming\Microsoft\Excel\Effects\Lovell\...

Contemporaneamente, se si prova a impostare la proprietà Base collegamento ipertestuale (File ▸ Informazioni ▸ Mostra tutte le proprietà) per far “tornare” i relativi, i collegamenti interni ai fogli vengono interpretati come link a file inesistenti e smettono di funzionare. Serve quindi una soluzione che preservi entrambi i tipi di collegamento.

Perché succede

Excel può aggiornare i collegamenti durante il salvataggio, con lo scopo di “fissare” percorsi per pubblicazioni web o per semplificare la risoluzione degli indirizzi. In presenza dell’opzione Aggiorna collegamenti al salvataggio abilitata (in File ▸ Opzioni ▸ Avanzate ▸ Generale ▸ Opzioni Web… ▸ scheda File), Excel tende a riscrivere i percorsi relativi in assoluti. In alcuni contesti Windows, la risoluzione può cadere su %APPDATA%\Microsoft\Excel, portando ai percorsi sbagliati sopra descritti.

La proprietà Base collegamento ipertestuale (Hyperlink Base) imposta una radice per i link esterni; tuttavia Excel non la distingue dai link interni: questi ultimi, se presenti, vengono trattati come se fossero link esterni verso file e finiscono per generare errori (ad esempio “Impossibile aprire il file specificato”).

Soluzione rapida e affidabile

  1. Disattivare l’aggiornamento dei collegamenti al salvataggio per evitare che Excel converta i percorsi relativi in assoluti.
  2. Riparare una tantum i collegamenti già corrotti eliminando dal loro indirizzo la parte indesiderata (...AppData\Roaming\Microsoft\Excel\) oppure riconvertendoli a interni quando necessario.

Come disattivare “Aggiorna collegamenti al salvataggio”

  1. Vai su File ▸ Opzioni ▸ Avanzate.
  2. Nella sezione Generale clicca su Opzioni Web….
  3. Apri la scheda File e deseleziona Aggiorna collegamenti al salvataggio.
  4. Conferma con OK e salva il file.

Questa impostazione impedisce a Excel di riscrivere i percorsi, mantenendo i collegamenti esterni in forma relativa e lasciando intatti i collegamenti interni ai fogli.

Come riparare i collegamenti già corrotti

Hai due strade, entrambe valide:

  • Trova/Sostituisci su tutta la cartella di lavoro: funziona se i percorsi hanno una parte indesiderata comune (es. C:\Users<utente>\AppData\Roaming\Microsoft\Excel\) che può essere rimossa in blocco.
  • Macro VBA per scorrere i collegamenti (Worksheet.Hyperlinks) e riscrivere Address e SubAddress. È la via più precisa, utile quando i collegamenti sono molti o distribuiti anche su forme e oggetti grafici.

Procedura con Trova/Sostituisci

  1. Premi Ctrl+F e apri la scheda Sostituisci.
  2. Clicca su Opzioni » e in All’interno di seleziona Cartella di lavoro.
  3. Nel campo Trova inserisci il prefisso da rimuovere, ad esempio:
    C:\Users<utente>\AppData\Roaming\Microsoft\Excel\
  4. Lascia vuoto il campo Sostituisci con (in modo da eliminare il prefisso) e premi Sostituisci tutto.

Consiglio: fai una copia del file prima di procedere, specialmente se i collegamenti sono numerosi.

Macro VBA “ripara tutto” con log delle modifiche

La macro seguente:

  • scansiona tutte le schede del workbook;
  • per ogni Hyperlink rimuove il prefisso di AppData (o un prefisso a scelta);
  • riconosce i collegamenti interni e forza Address = "" e SubAddress puntando alla destinazione del foglio;
  • crea un foglio log con prima/dopo per ogni link toccato.
Option Explicit

'== PARAMETRI DA PERSONALIZZARE ==
'Prefisso indesiderato da rimuovere (di default: %APPDATA%\Microsoft\Excel)
Private Function PrefissoDaRimuovere() As String
PrefissoDaRimuovere = Environ$("APPDATA") & "\Microsoft\Excel"
End Function

'== ENTRA QUI: macro principale ==
Public Sub RiparaCollegamenti()
Dim ws As Worksheet, hl As Hyperlink
Dim r As Long, oldA As String, oldS As String, newA As String, newS As String
Dim log As Worksheet, anch As String, pref As String
```
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

pref = PrefissoDaRimuovere()
Set log = Sheets.Add(After:=Sheets(Sheets.Count))
On Error Resume Next
log.Name = "Log_RiparaLink_" & Format(Now, "hhmmss")
On Error GoTo 0

With log
    .Range("A1:F1").Value = Array("Foglio", "Ancoraggio", "Address_prima", "SubAddress_prima", "Address_dopo", "SubAddress_dopo")
    .Rows(1).Font.Bold = True
End With

For Each ws In ActiveWorkbook.Worksheets
    For Each hl In ws.Hyperlinks
        oldA = Nz(hl.Address)
        oldS = Nz(hl.SubAddress)

        newA = oldA
        newS = oldS

        '1) Rimozione prefisso indesiderato (AppData o altro)
        If Len(pref) &gt; 0 Then
            If InStr(1, newA, pref, vbTextCompare) &gt; 0 Then
                newA = Replace(newA, pref, "", , , vbTextCompare)
            End If
        End If

        '2) Correzione dei link interni: devono avere Address = "" e solo SubAddress
        If IsCollegamentoInterno(newS) Then
            If PuntavaAQuestoWorkbook(oldA) Or oldA = "" Then
                newA = "" 'lascia solo il SubAddress
            End If
        End If

        'Applica le modifiche se cambiate
        If newA &lt;&gt; oldA Or newS &lt;&gt; oldS Then
            hl.Address = newA
            hl.SubAddress = newS

            r = r + 1
            log.Cells(r + 1, 1).Value = ws.Name
            log.Cells(r + 1, 2).Value = AnchorLabel(hl)
            log.Cells(r + 1, 3).Value = oldA
            log.Cells(r + 1, 4).Value = oldS
            log.Cells(r + 1, 5).Value = newA
            log.Cells(r + 1, 6).Value = newS
        End If
    Next hl
Next ws

Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True

MsgBox "Riparazione completata. Modifiche: " & r & vbCrLf & _
       "Controlla il foglio '" & log.Name & "' per il dettaglio.", vbInformation
```
End Sub

'== UTILITA' ==
Private Function Nz(ByVal s As Variant, Optional ByVal fallback As String = "") As String
If IsError(s) Then
Nz = fallback
ElseIf Len(s & "") = 0 Then
Nz = fallback
Else
Nz = CStr(s)
End If
End Function

Private Function AnchorLabel(ByVal h As Hyperlink) As String
On Error Resume Next
AnchorLabel = h.Range.Address(External:=True)
If Len(AnchorLabel) = 0 Then
AnchorLabel = TypeName(h.Parent)
End If
On Error GoTo 0
End Function

Private Function IsCollegamentoInterno(ByVal subAddr As String) As Boolean
'Heuristica: SubAddress di un link interno contiene "!"
IsCollegamentoInterno = (InStr(1, subAddr, "!", vbTextCompare) > 0)
End Function

Private Function PuntavaAQuestoWorkbook(ByVal addr As String) As Boolean
'Se Address e' vuoto o punta al nome del workbook, trattalo come interno
If Len(addr) = 0 Then
PuntavaAQuestoWorkbook = True
Else
PuntavaAQuestoWorkbook = (InStr(1, LCase$(addr), LCase$(ThisWorkbook.Name), vbTextCompare) > 0)
End If
End Function 

Suggerimento: puoi anche disattivare via macro l’opzione incriminata, in modo coerente tra postazioni:

Sub DisattivaAggiornaCollegamentiAlSalvataggio()
    'Richiede Excel per Windows. Non ha effetti in Excel per Mac.
    Application.DefaultWebOptions.UpdateLinksOnSave = False
    MsgBox "Opzione disattivata: Aggiorna collegamenti al salvataggio = False", vbInformation
End Sub

Perché non usare “Base collegamento ipertestuale”

Impostare Base collegamento ipertestuale può risolvere i link esterni se il file contiene solo link a file. In presenza di link interni (a fogli e intervalli), Excel tenta di interpretare anche questi ultimi come file “esterni” e fallisce. La soluzione più robusta è lasciare la base vuota, disattivare Aggiorna collegamenti al salvataggio, e riparare una volta i link già toccati.

Esempi pratici con la funzione HYPERLINK

La funzione =HYPERLINK() è molto utile per costruire indirizzi dinamici e ridurre la fragilità dei link. Ecco alcuni modelli.

Collegamento esterno relativo alla cartella del file

Il file di destinazione è nella sottocartella Effects\Lovell\report.xlsx rispetto al workbook corrente:

=HYPERLINK("Effects\Lovell\report.xlsx", "Apri report")

Collegamento esterno relativo costruito dal percorso corrente

Questo modello funziona anche quando cambia la posizione dell’intera cartella (il workbook deve essere salvato):

=LET(
  p;CELL("filename");
  rad;LEFT(p;TROVA("[";p)-1);
  HYPERLINK(rad&amp;"Effects\Lovell\report.xlsx";"Apri report")
)

Compatibilità: se non disponi di LET, usa la variante senza LET:

=HYPERLINK(LEFT(CELL("filename");TROVA("[";CELL("filename"))-1)&amp;"Effects\Lovell\report.xlsx";"Apri report")

Collegamento interno al foglio

Per un collegamento interno robusto (alla cella A1 di Foglio2):

=HYPERLINK("#'Foglio2'!A1"; "Vai a Foglio2")

Nota: il cancelletto # segnala ad Excel che si tratta di un SubAddress interno. In questo modo non dipendi da Hyperlink Base.

Tabella di comportamento

Tipo di collegamentoOpzione “Aggiorna collegamenti al salvataggio”Effetto tipico al salvataggioComportamento consigliato
Esterno con percorso relativoAttivaConvertito in assoluto (spesso su AppData) e rottoDisattivare l’opzione e mantenere relativo
Esterno con percorso relativoDisattivaResta relativo e funzionaSoluzione raccomandata
Interno al workbookHyperlink Base impostataInterpretato come link a file inesistenteLasciare Hyperlink Base vuota
Interno al workbookHyperlink Base vuotaFunziona (con SubAddress)Usare #'Foglio'!Cella in SubAddress

Buone pratiche che evitano rotture future

  • Mantenere una radice comune: tieni il workbook e i documenti collegati sotto la stessa cartella principale. Quando sposti, sposta tutto insieme.
  • Preferire i percorsi relativi: dove possibile scrivi percorsi senza drive letter o UNC assoluti, soprattutto per repository condivisi o versionati.
  • Usare formule dinamiche: costruisci i link con =HYPERLINK() partendo da CELL("filename") per adattarti al percorso effettivo.
  • Audit periodico: esporta un elenco dei collegamenti e verifica che il campo Address non contenga parti indesiderate (AppData, profili utente, vecchi percorsi di rete).
  • Backup prima delle sostituzioni massicce: prima di un Trova/Sostituisci globale, crea una copia del file.
  • Coerenza tra postazioni: assicurati che l’opzione Aggiorna collegamenti al salvataggio sia disattivata su tutte le macchine che modificano il file.
  • Attenzione a OneDrive/SharePoint: i file cloud possono introdurre URI (https, ms-office:). Mantieni comunque percorsi relative all’albero del progetto quando possibile.

Strumenti di auditing: macro “Elenca collegamenti”

Per fotografare l’esistente prima di intervenire, usa questa macro: crea una tabella con ogni collegamento trovato (foglio, ancoraggio, Address, SubAddress).

Sub ElencaCollegamenti()
    Dim ws As Worksheet, hl As Hyperlink, r As Long
    Dim rep As Worksheet
```
Set rep = Sheets.Add(After:=Sheets(Sheets.Count))
rep.Name = "Elenco_Link_" & Format(Now, "hhmmss")
With rep
    .Range("A1:D1").Value = Array("Foglio", "Ancoraggio", "Address", "SubAddress")
    .Rows(1).Font.Bold = True
End With

For Each ws In ActiveWorkbook.Worksheets
    For Each hl In ws.Hyperlinks
        r = r + 1
        rep.Cells(r + 1, 1).Value = ws.Name
        rep.Cells(r + 1, 2).Value = AnchorLabel(hl)
        rep.Cells(r + 1, 3).Value = hl.Address
        rep.Cells(r + 1, 4).Value = hl.SubAddress
    Next hl
Next ws

rep.Columns.AutoFit
MsgBox "Analisi completata: " & r & " collegamenti.", vbInformation
```
End Sub 

Domande frequenti

Questa impostazione influisce anche su Excel per Mac?
La voce “Opzioni Web ▸ File ▸ Aggiorna collegamenti al salvataggio” è tipicamente presente in Excel per Windows. Su Mac la gestione può differire; la buona pratica (percorsi relativi e formule HYPERLINK) resta comunque valida.

La proprietà Hyperlink Base è sempre da evitare?
No: è utile se il file contiene esclusivamente collegamenti esterni e sono richiesti percorsi coerenti a una radice comune. Se nel file esistono anche collegamenti interni, è più sicuro lasciarla vuota.

Che differenza c’è tra Address e SubAddress?
Address è il percorso al file (esterno). SubAddress è la destinazione interna (foglio/cella/definito). Per i collegamenti interni lo schema corretto è Address = "" e SubAddress = "#'Foglio'!Cella".

Le formule HYPERLINK vengono riscritte da Excel?
No, non allo stesso modo dei collegamenti “oggetto”. Tuttavia, se la stringa nel HYPERLINK è assoluta, la formula sarà fragile quando si sposta la cartella. Per questo conviene costruire l’indirizzo a partire da CELL("filename") o da parametri calcolati.

Checklist operativa

  • Disattiva Aggiorna collegamenti al salvataggio nelle Opzioni Web.
  • Lascia vuota la proprietà Base collegamento ipertestuale.
  • Ripara i link già corrotti (Trova/Sostituisci o macro RiparaCollegamenti).
  • Metti in sicurezza i futuri link: usa percorsi relativi e, dove possibile, formule HYPERLINK.
  • Esegui un audit periodico con ElencaCollegamenti.

Conclusioni

Con “Aggiorna collegamenti al salvataggio” disattivato e una riparazione una tantum dei collegamenti già alterati, il problema non si ripresenta: i link esterni restano relativi e funzionanti, e i link interni ai fogli non vengono più trattati come collegamenti a file. Questa configurazione è stata verificata con volumi importanti (oltre 1.900 collegamenti) senza ricadute.


Riepilogo della soluzione

  1. Impostazione: File ▸ Opzioni ▸ Avanzate ▸ Generale ▸ Opzioni Web… ▸ File ▸ disabilita “Aggiorna collegamenti al salvataggio”.
  2. Riparazione: rimuovi il prefisso indesiderato (...AppData\Roaming\Microsoft\Excel\) con Trova/Sostituisci su tutta la cartella di lavoro o con la macro RiparaCollegamenti.
  3. Hyperlink Base: lasciare vuota, per non compromettere i collegamenti interni.
  4. Prevenzione: struttura dei file coerente, percorsi relativi e, se opportuno, formule HYPERLINK dinamiche.
Indice