Liaison "dynamique" entre 2 classeurs

Del78 -  
santiago69 Messages postés 485 Statut Membre -
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 !
Configuration: Windows XP
Safari 525.13

5 réponses

  1. santiago69 Messages postés 485 Statut Membre 209
     
    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
  2. santiago69 Messages postés 485 Statut Membre 209
     
    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
  3. Del78
     
    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
  4. Del78
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. santiago69 Messages postés 485 Statut Membre 209
     
    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