Liaison introuvable
Bonjour,
Je travaille actuellement sur un gros fichier dont la fonction n'a pas d'importance ici, et lorsque je l'ouvre, il m'indique qu'il y a une liaison (vers une version précédente du même doc) qu'excel ne peut pas reconstituer. Je sais pourquoi (l'ancienne version a été déplacée dans un dossier "old"), et comme je ne veux pas la conserver je voudrais la localiser pour mettre à jour la cellule.
Problème, impossible de trouver la liaison. J'ai essayé plusieurs méthodes :
1. ctrl+F dans l'ensemble du workbook en cherchant une séquence de caractère improbable issue du nom du fichier vers lequel renvoie la liaison
2. ctrl+F avec l'ensemble du nom du fichier
3. crtl+F avec le nom et l'adresse du fichier
4. Ctrl+H pour remplacer tous les "=" par rien pour faire sauter toutes les formules et refaire une recherche (même si avec les options avancées du ctrl+F j'aurais dû tomber dessus...)
5. Macro pour remonter les liaisons (j'ai utilisé deux macros, je les mets-ci dessous).
6. Balayer manuellement toutes les cellules des sections dans lesquelles j'ai avancé pour voir si je tombe sur la liaison
J'ai malheureusement beaucoup trop avancé pour pouvoir recommencer sur une version antérieure, et le fichier est bien trop complexe pour faire des copier-coller sauvage afin de trouver la liaison...
Si quelqu'un ici a un conseil ou une solution, j'offre mon éternelle reconnaissance, parce que je suis à deux doigts de brûler tout l'étage...
Ah, et je ne partage pas le fichier car c'est du confidentiel
Macro 1 : pour trouver les liens dans le workbook et les afficher dans une feuille créée à cet effet. Cette macro trouve effectivement un lien.
Sub links()
'Updateby20140529
Dim wb As Workbook
Set wb = Application.ActiveWorkbook
If Not IsEmpty(wb.LinkSources(xlExcelLinks)) Then
wb.Sheets.Add
xIndex = 1
For Each Link In wb.LinkSources(xlExcelLinks)
Application.ActiveSheet.Cells(xIndex, 1).Value = Link
'Application.ActiveSheet.Cells(xIndex, 2).Value = link.Address
Debug.Print Link
xIndex = xIndex + 1
Next Link
End If
End Sub
Macro 2 qui devrait me donner l'adresse de la cellule qui contient la liaison. Mais elle ne me retourne rien...
Sub listLinks()
alinks = ActiveWorkbook.LinkSources(xlExcelLinks)
If Not IsEmpty(alinks) Then
Sheets.Add
shtName = ActiveSheet.Name
Set summaryWS = ActiveWorkbook.Worksheets(shtName)
summaryWS.Range("A1") = "Worksheet"
summaryWS.Range("B1") = "Cell"
summaryWS.Range("C1") = "Formula"
summaryWS.Range("D1") = "Workbook"
summaryWS.Range("E1") = "Link Status"
For Each ws In ActiveWorkbook.Worksheets
If ws.Name <> summaryWS.Name Then
For Each rng In ws.UsedRange
If rng.HasFormula Then
For j = LBound(alinks) To UBound(alinks)
filePath = alinks(j) 'LinkSrouces returns full file path with file name
Filename = Right(filePath, Len(filePath) - InStrRev(filePath, "\")) 'extract just the file name
filePath2 = Left(alinks(j), InStrRev(alinks(j), "\")) & "[" & Filename & "]" 'file path with brackets
If InStr(rng.Formula, filePath) Or InStr(rng.Formula, filePath2) Then
nextrow = summaryWS.Range("A" & Rows.count).End(xlUp).Row + 1
summaryWS.Range("A" & nextrow) = ws.Name
summaryWS.Range("B" & nextrow) = Replace(rng.Address, "$", "")
summaryWS.Hyperlinks.Add Anchor:=summaryWS.Range("B" & nextrow), Address:="", SubAddress:="'" & ws.Name & "'!" & rng.Address
summaryWS.Range("C" & nextrow) = "'" & rng.Formula
summaryWS.Range("D" & nextrow) = filePath
summaryWS.Range("E" & nextrow) = linkStatusDescr(ActiveWorkbook.LinkInfo(CStr(filePath), xlLinkInfoStatus))
Exit For
End If
Next j
For Each namedRng In Names
If InStr(rng.Formula, namedRng.Name) Then
filePath = Replace(Split(Right(namedRng.RefersTo, Len(namedRng.RefersTo) - 2), "]")(0), "[", "") 'remove =' and range in the file path
nextrow = summaryWS.Range("A" & Rows.count).End(xlUp).Row + 1
summaryWS.Range("A" & nextrow) = ws.Name
summaryWS.Range("B" & nextrow) = Replace(rng.Address, "$", "")
summaryWS.Hyperlinks.Add Anchor:=summaryWS.Range("B" & nextrow), Address:="", SubAddress:="'" & ws.Name & "'!" & rng.Address
summaryWS.Range("C" & nextrow) = "'" & rng.Formula
summaryWS.Range("D" & nextrow) = filePath
summaryWS.Range("E" & nextrow) = linkStatusDescr(ActiveWorkbook.LinkInfo(CStr(filePath), xlLinkInfoStatus))
Exit For
End If
Next namedRng
End If
Next rng
End If
Next
Columns("A:E").EntireColumn.AutoFit
lastrow = summaryWS.Range("A" & Rows.count).End(xlUp).Row
For r = 2 To lastrow
If ActiveSheet.Range("E" & r).Value = "File missing" Then
countBroken = countBroken + 1
End If
Next
If countBroken > 0 Then
sInput = MsgBox("Do you want to remove broken links of status 'File missing'?", vbOKCancel + vbExclamation, "Warning")
If sInput = vbOK Then
For r = 2 To lastrow
If ActiveSheet.Range("E" & r).Value = "File missing" Then
Sheets(Range("A" & r).Value).Range(Range("B" & r).Value).ClearContents
dummy = MsgBox(countBroken & " broken links removed", vbInformation)
End If
Next
End If
End If
Else
MsgBox "No external links"
End If
End Sub
Public Function linkStatusDescr(statusCode)
Select Case statusCode
Case xlLinkStatusCopiedValues
linkStatusDescr = "Copied values"
Case xlLinkStatusIndeterminate
linkStatusDescr = "Unable to determine status"
Case xlLinkStatusInvalidName
linkStatusDescr = "Invalid name"
Case xlLinkStatusMissingFile
linkStatusDescr = "File missing"
Case xlLinkStatusMissingSheet
linkStatusDescr = "Sheet missing"
Case xlLinkStatusNotStarted
linkStatusDescr = "Not started"
Case xlLinkStatusOK
linkStatusDescr = "No errors"
Case xlLinkStatusOld
linkStatusDescr = "Status may be out of date"
Case xlLinkStatusSourceNotCalculated
linkStatusDescr = "Source not calculated yet"
Case xlLinkStatusSourceNotOpen
linkStatusDescr = "Source not open"
Case xlLinkStatusSourceOpen
linkStatusDescr = "Source open"
Case Else
linkStatusDescr = "Unknown status"
End Select
End Function
Bonjour
as tu regarder dans le gestionnaire de nom ???
fred
Bonjour et merci pour l'accueil
Je n'avais pas regardé et c'est chose faire, je n'ai pas de référence dans le naming, juste mes print_area
parfois excel garde en mémoire des liaisons... as tu essayé de rompre les liaisons ??
car normalement quand il y a liaison d'une cellule vers un autre fichier le debut de la formule doit commencé par :
='[
si tu n'as rien trouvé, et le code des liaisons n'a rien trouvé je ferais une tentative de suppression des liaisons
fred
sinon autre piste de recherche as tu des liste de validation de données ?? des mises en formes conditionnelles ?? des formes avec lien hypertexte vers autre feuille ou autre ???
fred
C'est également ce que je me suis dit, j'ai donc voulu faire ça, je suis allé dans "données" > "Editer les liens" et j'ai voulu breaker la liaison. Mais quand je clique sur "break link" j'ai une fenêtre qui me prévient des conséquences et me demande si je suis sûr de vouloir briser le lien. Je valide en cliquant sur l'option "break" et rien ne se passe, la liaison apparaît toujours dans la liste des liens. J'ai recommencé une quinzaine de fois en me demandant si le lien n'était pas répété, mais non, rien à faire ça ne bouge pas.
Je deviens fou ^^
Bonne idée, je viens de vérifier toutes les formes auxquelles j'ai affecté une macro, et je suis bon. Par contre la mise en forme conditionnelle, j'en ai absolument partout, ça va être coton à éplucher.
et au fait juste comme ca... par hasard, les feuilles de ton fichier ne sont pas vérouillées ??? si c'est le cas deprotège et essai la suppression de la liaison je me suis déjà retrouvé dans ce genre de cas...
fred
Merci pour ton aide, j'ai fini par m'en sortir. Mes feuilles ne sont pas (encore) protégées.
Je mets ci-dessous ma solution, parce que vu la galère que c'était, ça vaut le coup :
1. j'ai changé l'extension en .zip et je l'ai ouvert avec 7zip (winrar fonctionnera aussi bien j'imagine), et j'ai trouvé la xl/worksheet dans le zip
2. j'ai extrait le fichier xlm que j'ai drag&droppé sur IE (chrome m'ayant lâché...).
3. Ctrl+F pour trouver une séquence de caractère peu commune
La séquence était dans les "sheet6" et "sheet7", avec une règle "cellIS" qui correspond effectivement à une mise en forme conditionnelle. Donc j'ai pu localiser les cellules concernées un peu plus facilement comme ça.
Presque une journée de boulot cramée là dessus, mais au moins le fichier est fini et tout propre
Encore merci !
Tant mieux que cela soit résolu.
a+
Fred