Liaison "dynamique" entre 2 classeurs

Fermé
Del78 - 9 oct. 2008 à 10:44
santiago69 Messages postés 477 Date d'inscription mercredi 7 mars 2001 Statut Membre Dernière intervention 12 septembre 2016 - 9 oct. 2008 à 18:36
Bonjour,

Je rencontre un petit problème de liaison entre deux classeurs... Je vous explique :

J'ai créer dans dossier (D1) dans lequel il y a deux autres dossiers (D2 et D3). Les dossiers D2 et D3 comportent chacun un classeur (respectivement C2 et C3). le classeur C2 reprend des données de C3 (grâce à des liens). Jusque là tout va bien pour moi je m'en sors...

Le problème est lorsque je veux déplacer le dossier D1 dans un autre emplacement et lorsque j'ouvre mon classeur C2, mes liaisons ne fonctionnent plus puisque le nom du chemin a changé. Comment faire pour pallier ce problème ? Je ne trouve pas de solution...

Merci à vous !
A voir également:

5 réponses

santiago69 Messages postés 477 Date d'inscription mercredi 7 mars 2001 Statut Membre Dernière intervention 12 septembre 2016 209
9 oct. 2008 à 14:57
Salut,
Desole pour le retard, j'etais parti mange.
Voila un bout de code VB que j'ai teste et qui marche.

1) Ouvre le doc C2 et assure toi que les formules pointent vers la bonne adresse de C3.

2) Dans le doc C2, tu doit cree 2 noms :
-> Menu Insertion, Noms, Definir
Nom dans le classeur : relpath
Fait reference a : ..\D3\[C3.xls] (le chemin relatif de C3)
-> Clic sur Ajouter
Nom dans le classeur : path
Fait reference a : ="C:\Documents and Settings\santiago\My Documents\D1\D3\[C3.xls] (le chemin absolu de C3)
-> Clic sur Ajouter
-> Clic sur Fermer

3) Dans le code VBA de C2 (Alt+F11), dans l'objet ThisWorkbook, ajoute le code suivant :

Private Sub Workbook_Open()
    Dim oldaddress As String, newaddress As String
    Dim FSO As New FileSystemObject
    Dim Sheet As Object
    'Compare addresses
    oldaddress = Names("path").Value
    oldaddress = Mid$(oldaddress, 3, Len(oldaddress) - 3)
    newaddress = Names("relpath").Value
    newaddress = FSO.GetAbsolutePathName(ThisWorkbook.Path & "\" & Mid$(newaddress, 3, Len(newaddress) - 3))
    'If they are different
    If newaddress <> oldaddress Then
        'Replace occurences
        For Each Sheet In ThisWorkbook.Sheets
            Sheet.Cells.Replace oldaddress, newaddress
        Next
        'Save current address
        Names("path").Value = newaddress
    End If
End Sub


4) Voila, tu n'as plus qu'a faire des tests et me poser des questions si necessaire.

1
santiago69 Messages postés 477 Date d'inscription mercredi 7 mars 2001 Statut Membre Dernière intervention 12 septembre 2016 209
9 oct. 2008 à 11:13
Il y a une methode manuelle :
- Menu Editions, Liaisons
- Clique sur modifier la source et pointe sur le nouveau C3.
- Si tu clic sur Invite de demarrage, tu peux configurer la maniere dont les liaisons se mettent a jour au demarrage.

Pour une methode automatique, j'imagine bien un truc faisable en VBA mais ca demandera au moins 15 minutes. Si ca t'interesse, fais le moi savoir.

A+
Santiago
0
Bonjour Santiago69,

Et merci pour ta réponse...
La solution automatique m'intéresse énormément, même si elle prend 15 minutes :-)... En effet, mes classeurs ont vocation à aller sur le bureau d'un client, qui les mettra où il veut par la suite ! Il vaut mieux que je prévoit le coup, sinon je vais faire un peu tâche quand je lui mettrais sur son PC...

Merci !
0
Salut,

Pas de soucis, je te rassure tu as le droit d'aller manger !

Merci pour ta réponse, j'ai testé et malheureusement cela ne fonctionne pas ! J'ai une erreur de compilation "Type défini par l'utilisateur non défini" et FSO As New FileSystemObject à la troisième ligne et surligné en gris...

N'étant pas du tout à l'aise avec ceci, je veux bien un nouveau coup de pouce... Je pense que j'ai bien défini mes noms...

Merci !!
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
santiago69 Messages postés 477 Date d'inscription mercredi 7 mars 2001 Statut Membre Dernière intervention 12 septembre 2016 209
9 oct. 2008 à 18:36
Ah merde, j'avais oublie une etape :
Retourne dans l'interface VBA (Ctrl+F11)
Menu Outils, References...
Tu coche la case Microsoft Scripting Runtime
Tu clic sur OK, tu ferme le classeur et tu reouvre.

0