Modifier des liaisons en VBA

Bonjour,

Afin d'aider un autre membre, je souhaite modifier par un code VBA les liaisons d'une feuille dans mon ''fichier-cible''. Toutes les liaisons sont faites vers des fichiers comportant l'indication de l'année et il faudrait ''simplement'' modifier les liaisons avec cette donnée pour l'année suivante.

Le nombre de liaisons est très grand, le nombre de fichiers-source également et les modifications doivent être refaites chaque année.

Cordialement.

9fichier-cible.xlsx (10.49 Ko)

Bonjour,

Les liaisons se "cachent" partout (Formules, Formules matricielles, Plages nommées, MFC, Graphiques, Objets et formes, ...) !

Si ce ne sont que des formules, il faut analyser chaque formule de chaque page (via SpecialCells) en recherchant la chaine "\[".

Attention aux formules matricielles.

Salut Patrice et merci pour ta réponse,

J'avais indiqué que toutes les formules étaient sur la même feuille. Il n'y a pas de formules matricielles ou autre plage nommée.

J'aurais en fait besoin du code qui permet de réaliser mon souhait.

Cordialement.

Re,

Avec ce code :

Sub Yvouille()
  Call Modifier_les_liaisons(2020, 2021)
End Sub

Private Sub Modifier_les_liaisons(strAvant As String, strApres As String)
Dim wsh As Worksheet
Dim rng As Range
Dim cel As Range
Dim fml As String
Dim deb As Long

  Set wsh = ActiveSheet
  On Error Resume Next
  Set rng = wsh.Cells.SpecialCells(xlCellTypeFormulas)
  On Error GoTo 0
  If rng Is Nothing Then Exit Sub
  For Each cel In rng.Cells
    If Not cel.HasArray Then
      fml = cel.Formula
      deb = InStr(1, fml, "\[")
      If deb > 0 Then
        deb = InStr(deb, fml, strAvant)
        If deb > 0 Then
          fml = Left(fml, deb - 1) & strApres & Mid(fml, deb + Len(strAvant))
          Application.DisplayAlerts = False
          cel.Formula = fml
          Application.DisplayAlerts = True
        End If
      End If
    End If
  Next cel

End Sub

Wow, merci infiniment pour ce code qui fonctionne du tonnerre

J'ai même vu que l'on pouvait utiliser des variables pour appeler la macro ''Modifier_les_liaisons''.

Call Modifier_les_liaisons(Range("D1"), Range("D1") + 1)

Ca répond exactement à mon attente, je ne peux que te remercier encore une fois pour ton aide.

Très bonne fin d'année et bon début 2021.

Bonjour à tous,

Et encore merci Yvouille...

Peux-tu m'indiquer comment inclure ce code stp? ou pourrais-tu me renvoyer le doc stp.

Merci encore, vous m'aidez comme jamais!

Bonjour,

Peux-tu m'indiquer comment inclure ce code stp?

Il suffit que tu copies la totalité de mon code dans un module standard du fichier à modifier.

Salut Mimischello,

Je t'avais indiqué sur notre autre fil que j'allais demander de l'aide sur le Forum pour pouvoir finir de t'aider, mais il est bien entendu que je l'aurais fait suite à ta réponse au sujet de ce que j'avais déjà avancé sur ton fichier.

Tu sembles maintenant dire que tout joue au niveau de ce que j'ai déjà préparé et il est bien entendu que je voulais continuer à t'aider à préparer le passage d'une année à l'autre. Je pense que l'on peut prévoir une macro qui créerait une copie du fichier de l'année précédente, qui supprimerait toutes les feuilles d'archives mensuelles anciennes, qui effacerait les données inutiles sur les feuilles restantes et qui inclurait la macro proposée par Patrice sur ce fil.

Je te laisse donc patienter quelques heures ou jours et je reviendrai sur notre autre fil avec une telle proposition.

Salut Patrice,

Encore un tout grand merci à toi qui m'a permis d'obtenir un super code qui me permettra de t'aider à mon tour.

Cordialement.

Bonjour à tous,

on peut aussi modifier directement la source du lien.
Avec l'avantage que toutes les formules de toutes les feuilles sont mises à jour d'un coup, ainsi que MFC, etc.

Sub test()
    majLiens 2020, 2021
End Sub

Sub majLiens(avant As String, apres As String)
    Dim alinks, i As Long
    alinks = ActiveWorkbook.LinkSources(xlExcelLinks)
    If Not IsEmpty(alinks) Then
        For i = 1 To UBound(alinks)
            ActiveWorkbook.ChangeLink alinks(i), Replace(alinks(i), avant, apres), xlExcelLinks
        Next i
    End If
End Sub

Bon réveillon à tous :-)
eric

Bonsoir à tous,

UN énorme MERCI !

Ce que m a envoyé Yvouille marche du tonnerre !

Je vous souhaite à tous une excellente année 2021!

Bonjour,

je trouve étrange que ma proposition de mise à jour des liens n'intéresse pas grand monde.
Tu devrais essayer, elle est nettement plus performante.

Mes meilleurs voeux à tous
eric

Salut Eriiic,

Je te remercie infiniment pour ta proposition, mais il est vrai qu'ayant reçu, testé et commencé à mettre en place la proposition de Patrice, avec des résultats - à mon niveau - à couper le souffle, je n'ai pas eu ni le temps ni le courage de tester ta solution, même si elle apporte une meilleure solution.

Mais qu'est-ce qu'une meilleure solution ? Avec la macro de Patrice, je n'ai pas le temps d'en voir le déroulement tellement la modification annuelle des liens est rapide. Est-ce que ta solution nous ferais gagner une milliseconde par année ? Une autre chose invisible ?

J'avais mis mon fil sur ''Résolu'' lorsque tu as posté, raison pour laquelle - très occupé ces temps-ci - je me suis permis l'impolitesse de ne pas te répondre. Désolé.

A une prochaine.

Bonjour Yvouille,

là il ne s'agit pas de millisecondes gagnées ou pas (quoique sur de nombreuses formules ça jouera très fortement), mais d'efficacité et de complétude.
TOUTES les utilisations d'un lien sont modifiées en une action unique (une par fichier lié) sans aller à la pêche pour les modifier une à une en écrivant cellule par cellule.
Et donc sans aucun risque de ne pas en traiter certaines, notamment en cas d'évolution du fichier, là ça deviendra visible.
Quid si une fonction matricielle est ajoutée ? Une MFC ? Dans un nom ?
Donc oui, tu n'es pas obligé de l'utiliser, ça n'en reste pas moins une meilleure solution de ne modifier que la source plutôt que toutes les utilisations.
Il suffit de se pencher sur le fonctionnement pour en être convaincu...

Quant au fait de ne pas avoir le minimum syndical, oui je trouve ça décevant de la part d'un ancien mais je m'en remettrai
eric

Salut Eriiic,

Tes retours me font passablement réfléchir, j'essaie de me creuser la tête pour me rappeler dans quelles conditions j'ai lu ton message du 31 à 19:53, dans quel état j'étais ces jours-là, mais ce ne pas facile de tout me souvenir.

Une chose est certaine, j'avais reçu une solution qui suffisait amplement à résoudre mon problème - enfin le problème de Mimischello - et une solution encore meilleure n'était pas ma priorité. Je me souviens quand même qu'une des idées qui m'avaient traversé la tête était que c'était une sorte d'échange entre spécialistes - entre Patrice et toi - et que ça me passait bien au-dessus de la tête, raison éventuelle qui a fait que je ne me suis pas intéressé plus que tant à ta solution. Tu parlais par exemple de modifier les MFC, ce qui n'était absolument pas utile à Mimischello.

Peut-être éventuellement aussi que j'étais en plein stress personnel - nous avions été faire de l'auto-école avec ma fille, toutes ces sueurs froides ne passent qu'après quelques heures - que j'avais beaucoup de fils à traiter tout-à-coup - tu sais, comme lorsque tu prends en charge un sujet par-ci, un sujet par-là et que soudain tous ces membres te répondent le même jour - ou que sais-je d'autre.

Personnellement assez fâché lorsqu'un membre ne formule pas le moindre merci - je présume que c'est à cela que tu fais illusion par ''minimum syndical'' - je fais normalement très attention à ce genre de chose.

Il semble que plusieurs facteurs se sont unis afin que ça se passe mal dans ce cas et j'en suis au plus haut point désolé.

Très cordiales salutations.

Bonjour Yvouille,

N'en parlons plus alors ;-)
Ce qui m'a poussé à insister c'est que j'avais l'impression que tu n'avais pas saisi la portée de la différence entre les deux approches.
eric

.... j'avais l'impression que tu n'avais pas saisi la portée de la différence entre les deux approches.

Dans un premier temps, j'avais moi l'impression que ça me passait largement au-dessus de la tête et je ne m'y suis donc pas réellement penché vu que j'avais ma solution.

Dans un premier temps, j'avais pensé ne pas prendre note du code de Patrice - dans mes archives personnelles - me disant que la prochaine fois que j'allais tomber à nouveau sur un tel problème je serai probablement déjà être mort mais, vu la simplicité de mise en fonction de ton code et de son côté "couvre tous les cas", j'ai quand même pris note aujourd'hui du tien

Très belle fin d'année.

Rechercher des sujets similaires à "modifier liaisons vba"