FAQ Excel

FAQ ExcelConsultez toutes les FAQ
Nombre d'auteurs : 46, nombre de questions : 845, dernière mise à jour : 30 mars 2022
Sommaire→Les liens et liaisons→Les liaisonsIl est possible d'utiliser :
Application.AskToUpdateLinks = TrueNéanmoins cela ne supprime que la boîte de dialogue et les liaisons sont mises à jour. Pour empêcher la mise à jour des liaisons sans boîte de dialogue, il faut mettre le paramètre UpdateLinks de la méthode Open de l'objet Workbook à False.
Vous pouvez obtenir une vue des liaisons en utilisant le menu Edition/Liaisons.
La boîte de dialogue qui s'affiche permet de gérer ces liaisons.
La macro ci dessous extrait les fichiers liés au classeur. Une option permet de vérifier si le chemin du fichier lié existe toujours sur le disque dur.
Sub ExtraitDocumentLies()
Dim TabLiaisons As Variant
Dim x As Integer
'Renvoie un tableau de TabLiaisons
TabLiaisons = ThisWorkbook.LinkSources
'Vérifie si le tableau est vide
If Not IsEmpty(TabLiaisons) Then
'Boucle sur le tableau
For x = 1 To UBound(TabLiaisons)
Debug.Print TabLiaisons(x)
If Dir(TabLiaisons(x)) = "" Then _
MsgBox "La liaison est erronée:" & vbCrLf & _
"'" & TabLiaisons(x) & "'"
Next x
End If
End SubCe n'est pas toujours évident. Pour supprimer les liaisons il y a globalement deux méthodes. Une recherche complète permettant la récupération de ce qui est récupérable
Sub ChercheLiaison()
Dim NomFichier As String, MonClasseur As Workbook, Liaisons As Variant
Dim compteur As Long, comptCar As Long, Cible As Range
Dim FirstAddress As String, PlageLiee As Range, comptFeuille As Long, Reponse As Integer
Dim MaFeuille As Worksheet, MonGraphe As Chart, MonGraphe1 As ChartObject, MaSerie As Series
NomFichier = Application.GetOpenFilename
Workbooks.Open NomFichier, False
Set MonClasseur = ActiveWorkbook
Liaisons = MonClasseur.LinkSources
If IsEmpty(Liaisons) Then Exit Sub
'parcours les feuilles
For Each MaFeuille In MonClasseur.Worksheets
MaFeuille.Activate
MaFeuille.Cells.Select
For compteur = 1 To UBound(Liaisons)
For comptCar = Len(Liaisons(compteur)) To 1 Step -1
If Mid(Liaisons(compteur), comptCar, 1) = "\" Then
Liaisons(compteur) = Mid(Liaisons(compteur), comptCar + 1)
Exit For
End If
Next comptCar
Set Cible = Selection.Find(What:=Liaisons(compteur), After:=ActiveCell, LookIn:=xlFormulas, _
LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
MatchCase:=False)
If Not Cible Is Nothing Then
FirstAddress = Cible.Address
Do
If PlageLiee Is Nothing Then Set PlageLiee = Cible Else Set PlageLiee = Union(PlageLiee, Cible)
Set Cible = Selection.FindNext(After:=Cible)
Loop While Not Cible Is Nothing And Cible.Address <> FirstAddress
End If
Next compteur
If Not PlageLiee Is Nothing Then
Reponse = MsgBox("La feuille " & MaFeuille.Name & " contient " & PlageLiee.Cells.Count & _
" cellules avec des liaisons" & vbCrLf & _
"voulez-vous les supprimer ?", vbYesNo + vbQuestion, "Liaisons trouvées")
If Reponse = 6 Then
For Each Cible In PlageLiee.Cells
Cible.Formula = Cible.Value
Next
End If
Set PlageLiee = Nothing
End If
For Each MonGraphe1 In MaFeuille.ChartObjects
For Each MaSerie In MonGraphe1.SeriesCollection
For compteur = 1 To UBound(Liaisons)
If InStr(1, MaSerie.Formula, Liaisons(compteur), vbTextCompare) > 0 Then
Reponse = MsgBox("le graphe de la feuille " & MonGraphe1.Name & _
" contient une série " & MaSerie.Name & " avec des liaisons" & vbCrLf & _
"Voulez-vous les supprimer ?", vbYesNo + vbQuestion, "Liaisons trouvées")
If Reponse = 6 Then
MaSerie.Delete
Exit For
End If
End If
Next compteur
Next
Next
Next
For Each MonGraphe In MonClasseur.Charts
For Each MaSerie In MonGraphe.SeriesCollection
For compteur = 1 To UBound(Liaisons)
If InStr(1, MaSerie.Formula, Liaisons(compteur), vbTextCompare) > 0 Then
Reponse = MsgBox("le graphe de la feuille " & MonGraphe.Name & _
" contient une série " & MaSerie.Name & " avec des liaisons" & vbCrLf & _
"voulez-vous les supprimer ?", vbYesNo + vbQuestion, "Liaisons trouvées")
If Reponse = 6 Then
MaSerie.Delete
Exit For
End If
End If
Next compteur
Next
Next
End SubUne méthode beaucoup plus violente qui consiste à modifier les liaisons par le nom du classeur source. Cela va créer des références circulaires qu'il faudra alors supprimer. Les données anciennement liées seront perdues.
Dim Nom As String, objWorkbook As Workbook, TabLiaison As Variant, cmpt As Long
Dim objWorksheet As Worksheet, objRange As Range
Set objWorkbook = Application.Workbooks.Open(Application.GetOpenFilename, UpdateLinks:=0)
TabLiaison = objWorkbook.LinkSources(xlExcelLinks)
If IsEmpty(TabLiaison) Then Exit Sub
For cmpt = LBound(TabLiaison) To UBound(TabLiaison)
objWorkbook.ChangeLink TabLiaison(cmpt), objWorkbook.FullName, xlLinkTypeExcelLinks
Next cmpt
For Each objWorksheet In objWorkbook.Worksheets
Do
Set objRange = objWorksheet.CircularReference
If Not objRange Is Nothing Then objRange.Value = objRange.Value
Loop While Not objRange Is Nothing
Next objWorksheet


