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.
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
- Disattivare l’aggiornamento dei collegamenti al salvataggio per evitare che Excel converta i percorsi relativi in assoluti.
- 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”
- Vai su File ▸ Opzioni ▸ Avanzate.
- Nella sezione Generale clicca su Opzioni Web….
- Apri la scheda File e deseleziona Aggiorna collegamenti al salvataggio.
- 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 riscrivereAddress
eSubAddress
. È la via più precisa, utile quando i collegamenti sono molti o distribuiti anche su forme e oggetti grafici.
Procedura con Trova/Sostituisci
- Premi Ctrl+F e apri la scheda Sostituisci.
- Clicca su Opzioni » e in All’interno di seleziona Cartella di lavoro.
- Nel campo Trova inserisci il prefisso da rimuovere, ad esempio:
C:\Users<utente>\AppData\Roaming\Microsoft\Excel\
- 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 = ""
eSubAddress
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) > 0 Then
If InStr(1, newA, pref, vbTextCompare) > 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 <> oldA Or newS <> 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&"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)&"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 collegamento | Opzione “Aggiorna collegamenti al salvataggio” | Effetto tipico al salvataggio | Comportamento consigliato |
---|---|---|---|
Esterno con percorso relativo | Attiva | Convertito in assoluto (spesso su AppData) e rotto | Disattivare l’opzione e mantenere relativo |
Esterno con percorso relativo | Disattiva | Resta relativo e funziona | Soluzione raccomandata |
Interno al workbook | Hyperlink Base impostata | Interpretato come link a file inesistente | Lasciare Hyperlink Base vuota |
Interno al workbook | Hyperlink Base vuota | Funziona (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 daCELL("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
- Impostazione: File ▸ Opzioni ▸ Avanzate ▸ Generale ▸ Opzioni Web… ▸ File ▸ disabilita “Aggiorna collegamenti al salvataggio”.
- Riparazione: rimuovi il prefisso indesiderato (
...AppData\Roaming\Microsoft\Excel\
) con Trova/Sostituisci su tutta la cartella di lavoro o con la macro RiparaCollegamenti. - Hyperlink Base: lasciare vuota, per non compromettere i collegamenti interni.
- Prevenzione: struttura dei file coerente, percorsi relativi e, se opportuno, formule
HYPERLINK
dinamiche.