IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

FAQ Excel

FAQ ExcelConsultez toutes les FAQ

Nombre d'auteurs : 46, nombre de questions : 845, dernière mise à jour : 30 mars 2022 

 
OuvrirSommaireLes liens et liaisonsLes liaisons

Il est possible d'utiliser :

Vba
Sélectionnez
Application.AskToUpdateLinks = True

Né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.

Créé le 14 février 2004  par Bidou

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.

Vba
Sélectionnez
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 Sub
Créé le 10 juin 2007  par SilkyRoad

Ce 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

Vba
Sélectionnez
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 Sub

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

Vba
Sélectionnez
    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
Créé le 14 février 2004  par Bidou

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2009 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.