VBA: supprimer les liaisons Excel 3


Avez-vous besoin de partager vos fichiers Excel? Avez-vous besoin d'utiliser vos fichiers Excel aux différents endroits? En avez-vous assez des messages vous demandant "d'actualiser les liens" ou vous informant que "les liens externes sont indisponibles"? Vous êtes au bon endroit car vous trouverez ici la solution à toutes ces situations.

Les liaisons externes dans des fichiers Excel

Qu'est-ce "une liaison" en Excel? Il s'agit d'un lien que différents Classeurs peuvent avoir entre eux – le plus simple sera de l'illustrer sur un exemple:

Excel: liaison vers un autre Classeur ouvert

Excel: liaison vers un autre Classeur, tant qu'il est ouvert – on voit uniquement le nom de l'autre Classeur

Excel: liaison vers un autre Classeur fermé

Excel: liaison vers un autre Classeur, une fois que ce dernier est fermé – on voit également le chemin vers l'autre Classeur

Lier les fichiers entre eux est une pratique courante qui, dans la plupart de situations, est pratique, facile, parfois indispensable. Mais cette solution peut être également très limitante: si les fichiers externes auxquels votre fichier Excel est lié ne sont pas disponibles, au mieux vous vous en sortez avec des messages d'avertissement, au pire le contenu qui n'est pas mis à jour faussera vos calculs. La solution?

Remplacer les liens par les valeurs avant de partager/déplacer un fichier Excel

Pour éviter les problèmes lors de partage, déplacement, envoi par email,… d'un fichier, vous pouvez remplacer les valeurs liés par des valeurs "normales". Votre fichier ne sera plus lié à d'autres fichiers Excel et il sera possible de l'utiliser sans devoir se demander quelle valeur est obsolète et laquelle ne l'est pas.

Du point de vue pratique, cette solution peut être très fastidieuse si vous devez l'appliquer manuellement – trouver les cellules qui contiennent des liens, les remplacer, ne rien oublier… Heureusement, VBA est là pour tout automatiser et éviter "l'erreur humaine".

VBA: supprimer les liens vers d'autres fichiers Excel

Le code VBA qui suit est très pratique, surtout si d'autres personnes sont susceptibles de lire votre fichier. Rompre les liaisons existantes va prévenir la situation où le fichier essaie de récupérer des données dans d'autres Classeurs auquel in n'a pas accès – car dans une telle situation, votre Classeur est inutilisable.

En rompant les liaisons, le contenu des cellules qui provenait des autres Classeurs est remplacé par des valeurs. D'un côté vous perdez la possibilité de tenir le fichier à jour automatiquement mais de l'autre côté, vous évitez les fenêtres pop-up vous demandant s'il faut essayer de mettre les données à jour. Et, ce qui peut être important également, vous ne montrez pas au monde la structure des dossiers de votre ordinateur. Ce qui, à nos jours, ne peut pas faire du mal du point de vue de la sécurité.

Et voici le résultat une fois les liaisons rompues:

La liaison vers l'autre Classeur est remplacée par la valeur de la cellule

Résultat: La liaison vers l'autre Classeur est remplacée par la valeur de la cellule

Fonction VBA pour supprimer toutes les liaisons vers d'autres Classeurs

Voici le code source VBA qui vous permettra de supprimer toutes les liaisons que le Classeur en question a avec des autres Classeurs.

Sub SupprimerLiaisons()
Dim Liaisons As Variant
Liaisons = ActiveWorkbook.LinkSources(Type:=xlLinkTypeExcelLinks)

If IsEmpty(Liaisons) = True Then Exit Sub

For LiaisonsTrouvee = 1 To UBound(Liaisons)
ActiveWorkbook.BreakLink _
    Name:=Liaisons(LiaisonsTrouvee), _
    Type:=xlLinkTypeExcelLinks
Next LiaisonsTrouvee

End Sub

Il est, bien sûr possible de modifier cette fonction pour que le Classeur "à nettoyer" soit utilisé comme argument en remplaçant ActiveWorkbook.

Ainsi, vous pouvez utiliser cette macro également pour des fichiers sans macros sans devoir les modifier.

Sub SupprimerLiaisons(MonClasseur As Workbook)
Dim Liaisons As Variant
Liaisons = ActiveWorkbook.LinkSources(Type:=xlLinkTypeExcelLinks)

If IsEmpty(Liaisons) = True Then Exit Sub

For LiaisonsTrouvee = 1 To UBound(Liaisons)
MonClasseur.BreakLink _
    Name:=Liaisons(LiaisonsTrouvee), _
    Type:=xlLinkTypeExcelLinks
Next LiaisonsTrouvee

End Sub

 

22 0




Laissez un commentaire

Votre adresse de messagerie ne sera pas publiée.

3 commentaires sur “VBA: supprimer les liaisons Excel

  • Marcel LEVA

    Bonjour,
    Lorsque je fais, par macro et la méthode Copy … paste d'une plage, d'un fichier source vers les 22 autres fichiers destinations (avec une boucle), Excel ( le vilain!) crée automatiquement une liaison avec ce fichier source, mais seulement dans le ou les fichiers acceptant cette modification. Evidemment, plus tard, quand j'ouvre un fichier dest j'ai droit à la fenêtre ( "activer les liaisons"….) Avec ta macro, je peux résoudre le problème en "supprimant les liens créés". J'ai aussi résolu le problème en modifiant la "source" par le fichier lui-même comme source. Ca me parait peu satisfaisant.
    Mais je pense qu'il y a un "loup" dans ma macro. Peux-tu y regarder et me corriger ? Ci dessous la partie de macro concernée (qui fonctionne par ailleurs très bien).
    'xxxxxxxxxxx
    For Each cel In OS.Range("BA2:BA" & derligne)
    If cel.Value = "xxx" Or cel.Value = "XXX" Then 'condition dans Source
    lig = cel.Row 'n° lig
    Set nom = OS.Range("C" & lig) 'Nom à chercher
    Set Fiche = OS.Range("D" & lig & ":AW" & lig) 'Sélection à copier
    Fiche.Copy
    OD.Activate 'Classeur Destination
    derl = OD.Range("C" & Rows.Count).End(xlUp).Row
    Set LeNom = OD.Range("C2:C" & derl).Find(nom, LookAt:=xlWhole) 'Trouver le même nom

    If LeNom Is Nothing Then 'si le nom cherché n'existe pas, chercher le second ("xxx")
    On Error Resume Next

    Else
    'If LeNom = Nom Then 'si le nom est trouvé
    lig2 = LeNom.Row ' sa ligne
    Range("D" & lig2).Select 'Cellule Destination
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    Selection.PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    End If
    End If
    'xxxxxxxxxxxxx
    Merci.

  • JB

    Bonjour,

    J'ai un souci concernant des liaisons sur un classeur. A l'ouverture de ce fichier (qui est partagé avec d'autres utilisateurs pour information), si j'active le contenu, je dois passer alors une centaine de messages d'erreurs comme quoi Excel ne trouve pas le lien vers des fichiers.
    Le problème est que ces fichiers ne sont pas des fichiers Excels mais d'autres fichiers (word, images, etc.). Donc il m'est impossible de trouver ces liaisons de manière simple.
    Donc ma question est : comme pourrais je lister l'ensemble des liens que Excel souhaite mettre à jour et les supprimer ? Et pas seulement les liens vers d'autres classeurs.
    Merci beaucoup, cela fait un moment que je cherche.
    Cordialement

    • JB

      Pardon petite màj. Ce sont bien des fichiers Xcel sur lequel mon fichier pointe. Mais ceux ci ne s'affichent pas lorque l'on clique sur "Modifier les liaisons" ni lorsque je fais tourner votre macro. Par contre des messages d'erreur s'affichent lorsque l'on active le contenu. Je ne comprends pas