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

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Mis à jour liaisons entre fichiers sans ouvrir les fichiers de destination


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    Consultant MOA
    Inscrit en
    Septembre 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant MOA
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2011
    Messages : 9
    Points : 1
    Points
    1
    Par défaut Mis à jour liaisons entre fichiers sans ouvrir les fichiers de destination
    Bonjour,

    J'aurais grand besoin d'aide pour gérer la mise à jour automatisée de liaisons sur Excel...
    Voici mon problème :

    J'ai plusieurs fichiers :
    - Un fichier source qui contient des données de référence
    - Plusieurs fichiers destinations, qui reprennent des valeurs contenues dans mon fichier source (données liées, avec des formules type RECHERCHEV). Ces fichiers destinations sont tous rangés dans un même dossier.

    Je sais qu'en standard, la mise à jour d'un fichier destination se fait automatiquement à l'ouverture du fichier en question.

    Ma préoccupation aujourd'hui, est de pouvoir lancer la mise à jour des liaisons, sans avoir à ouvrir les multiples fichiers destinations.
    L'idéal serait d'avoir une macro dans le fichier source, qui me permette de déclencher la mise à jour de tous les fichiers destinations en "un clic". Je pensais utiliser la fonction UpdateLink, sur tous les fichiers contenus dans le dossier approprié, mais je n'ai pas réussi à aller au bout de mon idée.

    Quelqu'un saurait-il m'aider (en poursuivant cette piste ou une autre) ?

    Merci d'avance

  2. #2
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 207
    Points : 14 362
    Points
    14 362
    Par défaut
    Bonsoir,

    Mais pourquoi veux-tu les mettre à jour ?

  3. #3
    Nouveau Candidat au Club
    Femme Profil pro
    Consultant MOA
    Inscrit en
    Septembre 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant MOA
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2011
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    Bonsoir,

    Je souhaite faire cette mise à jour pour m'assurer que tous les fichiers de destination contiennent les bonnes informations, même si la mise à jour automatique des liaisons à l'ouverture a été - par erreur - désactivée sur l'un des fichiers de destination.

    Merci d'avance.

  4. #4
    Expert éminent sénior
    Avatar de kiki29
    Homme Profil pro
    ex Observeur CGG / Analyste prog.
    Inscrit en
    Juin 2006
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ex Observeur CGG / Analyste prog.

    Informations forums :
    Inscription : Juin 2006
    Messages : 6 132
    Points : 11 272
    Points
    11 272
    Par défaut
    Salut, je soppose que tu as consulté ceci http://silkyroad.developpez.com/VBA/ClasseursFermes/

  5. #5
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 207
    Points : 14 362
    Points
    14 362
    Par défaut
    Bonjour,

    Mets la macro suivante dans chacun des classeurs concernés :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Workbook_Open()
        ThisWorkbook.UpdateLinks = xlUpdateLinksAlways
    End Sub
    Le seul point ennuyeux est que, si tu as des fichiers avec l'extension xlsx, tu seras obligée de les enregistrer au format xlsm. De plus, si tu as déjà une macro
    Private Sub Workbook_Open()
    copie simplement la ligne de code dans cette macro :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ThisWorkbook.UpdateLinks = xlUpdateLinksAlways

  6. #6
    Nouveau Candidat au Club
    Femme Profil pro
    Consultant MOA
    Inscrit en
    Septembre 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant MOA
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2011
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    Bonjour,
    Oui j'avais déjà consulté ce lien, mais je ne dois pas avoir les compétences pour m'en sortir malgré ces explications...

    Pour un peu plus de détails, voici la macro que j'ai essayé d'utiliser :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    Sub test4()
    '
    ' test4 Macro
    '
     
        Dim Cn As ADODB.Connection
        Dim Fichier As String
     
        'Définit le classeur fermé 
        Fichier = "C:\dossier destination\test destination 1.xls"
     
        Set Cn = New ADODB.Connection
     
        '--- Connexion ---
        With Cn
            .Provider = "Microsoft.Jet.OLEDB.4.0"
            .ConnectionString = "Data Source=" & Fichier & _
                ";Extended Properties=Excel 8.0;"
            .Open
        End With
     
    ' Mise à jour des liens vers le fichier source - ne fonctionne pas    
            ActiveWorkbook.UpdateLink Name:= _
            "C:\dossier source\test source.xls", _
            Type:=xlExcelLinks
     
    ' Fermeture de la connexion    
        Cn.Close
        Set Cn = Nothing
     
    End Sub

    La macro ne tourne pas (message : erreur 1004 la méthode UpdateLink de l'objet Workbook a échoué).
    De plus, j'aurais souhaité faire fonctionner cette macro sur tous les fichiers du dossier C:\dossier destination.

    D'avance un grand merci...

  7. #7
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 207
    Points : 14 362
    Points
    14 362
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ActiveWorkbook.UpdateLink Name:= _
    "C:\dossier source\test source.xls", _
    Type:=xlExcelLinks
    Activeworkbook fait référence au classeur affiché, donc ouvert. A mon avis tu ne peux pas te servir d'ADO ppour exécuter des instructions Excel. Tu peux uniquement t'en servir pour agir sur la valeur des ccellules.

  8. #8
    Nouveau Candidat au Club
    Femme Profil pro
    Consultant MOA
    Inscrit en
    Septembre 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant MOA
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2011
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    Bonjour Daniel,

    Merci beaucoup pour tes éléments de réponse.
    J'ai bien incorporé la macro à mes fichiers de destination, cela fonctionne très bien.

    Seulement, j'ai un cas réel qui rejoint ma demande initiale :
    J'ai toujours un fichier source, dont les modifications ont un impact sur mes fichiers de destination - que je vais appeler fichiers de 1e destination.
    Ensuite, j'ai des fichiers de 2e destination, qui s'appuient sur les modifications du fichier source ainsi que sur les données des fichiers de 1e destination impactées par les modifications du fichier source.

    Avec ta solution, je résous bien mon problème de mise à jour des liaisons quand j'ouvre tous les fichiers. Mais pour que les fichiers de 2e destination soient à jour, il faudrait que j'ouvre tous les fichiers de 1e destination avant.

    Connais-tu un moyen de lancer une mise à jour des liens pour tous les fichiers d'un même dossier, sans avoir à les ouvrir manuellement un à un ? Cela me permettrait de lancer automatiquement la mise à jour des fichiers de 1e destination, puis seulement ensuite d'ouvrir les fichiers de 2e destination en étant sûre que les données liées sont à jour.

    D'avance un grand merci !

  9. #9
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 207
    Points : 14 362
    Points
    14 362
    Par défaut
    Bonjour,

    Il faut ouvrir les fichiers de 1ère destination, mettre à jour les liens, puis faire de même avec les fichiers de seconde destination. Donc connaître le dossier et les noms de chacun de ces fichiers. On peut le faire avec une macro, oui. Si personne d'autre t'a répondu, je t'enverrai une macro dans l'après-midi.

    Voici un exemple, la macro se trouvant dans le classeur source, les classeurs destination de niveau 2 étant listés dans la variable Classeurs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Sub miseAjour()
        Dim Liaisons, Classeurs
        Classeurs = Array("c:\temp\dest2-1.xlsm", "c:\temp\dest2-2.xlsm")
        Application.ScreenUpdating = False
        For Each Item In Classeurs
            Workbooks.Open Item, UpdateLinks = True
            Liaisons = ActiveWorkbook.LinkSources
            For i = 1 To UBound(Liaisons)
                Workbooks.Open Liaisons(i), UpdateLinks = True
                ActiveWorkbook.Close True
            Next
            ActiveWorkbook.Close True
        Next Item
        Application.ScreenUpdating = True
    End Sub

  10. #10
    Nouveau Candidat au Club
    Femme Profil pro
    Consultant MOA
    Inscrit en
    Septembre 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant MOA
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2011
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    Bonsoir Daniel,
    Je te remercie sincèrement pour ton aide.
    J’ai réalisé des tests mais malheureusement je n’arrive pas à faire fonctionner ta macro. Peut-être auras-tu encore un peu de temps pour m’aider… En tout cas je te remercie déjà pour tes réponses précédentes.

    Je te mets ci-joint mes fichiers tests : fichier source, fichiers de destination 1 (1-1 et 1-2), fichiers de destination 2 (2-1 et 2-2).
    J’ai mis la macro que tu as proposée dans le fichier source, pour effectuer la mise à jour des fichiers de destination 1.

    Par rapport à ta macro, voici les différentes étapes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    Sub MiseAJour()
        Dim Liaisons, Classeurs
     
        'Ici j’aurais souhaité désigner tous les fichiers contenus dans le dossier de destination 1 au lieu de nommer les fichiers un à un, car dans la réalité, j’en ai plusieurs centaines
        Classeurs = Array("C:\tests maj\fichier destination 1-1.xls", "C:\test maj\fichier destination 1-2.xls")
     
        Application.ScreenUpdating = False
        For Each Item In Classeurs
            Workbooks.Open Item, UpdateLinks = True
            Liaisons = ActiveWorkbook.LinkSources
            'Ici je pense que la boucle ne fonctionne pas comme souhaité : 
            'Résultat attendu : ouverture de chaque fichier de destination 1, mise à jour et fermeture du fichier
            'Résultat obtenu : ouverture du premier fichier de destination, mise à jour, pas de fermeture. Pas d’action sur le deuxième fichier…
            For i = 1 To UBound(Liaisons)
                Workbooks.Open Liaisons(i), UpdateLinks = True
                ActiveWorkbook.Close True
            Next
            ActiveWorkbook.Close True
        Next Item
        Application.ScreenUpdating = True
    End Sub
    Je te remercie d’avance pour ton aide précieuse.
    Très bonne journée
    --------------------------------------------------------------------------

    Fichier joint dans vos discussions

    ---------------------------------------------------------------------------

  11. #11
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 207
    Points : 14 362
    Points
    14 362
    Par défaut
    Bonjour,

    Ce que tu dois mettre dans la variable "Classeurs", c'est les classeurs destination de deuxième niveau :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Classeurs = Array("C:\tests maj\fichier destination 2-1.xls", "C:\test maj\fichier destination 2-2.xls")
    Teste comme cela et si ça ne fonctionne pas, reviens le dire.

  12. #12
    Nouveau Candidat au Club
    Femme Profil pro
    Consultant MOA
    Inscrit en
    Septembre 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant MOA
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2011
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    Rebonjour,

    J'ai fait les tests avec les différentes configurations :
    - Que les fichiers de destination 1, comme indiqué précédemment
    - Tous les fichiers de destination 1 et 2, même comportement que précédemment
    - Que les fichiers de destination 2, il y a un message d'erreur 1004 - le chemin est jugé incorrect, alors que l'adresse est juste

    Merci beaucoup...

  13. #13
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 040
    Points
    20 040
    Par défaut
    Bonjour,

    Utiliser ActiveWorkbook, n'est pas une bonne idée tu devrais utiliser une variable workbook.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Dim Wk as workbook
    (...)
    set wk = Workbooks.Open (Item, UpdateLinks = True)
    (...)
     
    wk.close true
    (...)

  14. #14
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 207
    Points : 14 362
    Points
    14 362
    Par défaut
    @Marylinh :
    Sur quelle ligne, l'erreur ?

  15. #15
    Nouveau Candidat au Club
    Femme Profil pro
    Consultant MOA
    Inscrit en
    Septembre 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant MOA
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2011
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    Bonsoir,

    @Daniel : L'erreur est ligne 6 (Classeurs = Array...)
    @ bbil : Merci pour ton conseil. Pourrais-tu me préciser ta réponse, notamment en m'indiquant comment indiquer le dossier contenant les fichiers à mettre à jour ?

    Merci à vous et bonne soirée

  16. #16
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 207
    Points : 14 362
    Points
    14 362
    Par défaut
    Bonjour,

    Microclimat ?
    J'ai testé la ligne dans une macro à part (ligne toute seule dans la macro) et je n'ai pas d'erreur.
    Quel est le message d'erreur ?

  17. #17
    Nouveau Candidat au Club
    Femme Profil pro
    Consultant MOA
    Inscrit en
    Septembre 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant MOA
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2011
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    Bonsoir,
    Peut-être un microclimat oui

    J'ai bien vérifié mes chemins et noms de fichiers, et tout est correct, pourtant j'ai ce message là :

    Erreur d'exécution '1004' :
    'C:\tests maj\fichier destination 2-2.xls' est introuvable. Vérifiez l'orthographe du nom du classeur et la validité de l'emplacement.

    Si vous essayez d'ouvrir le fichier à partir de la liste des fichiers les plus récents, assurez-vous que le fichier n'a pas été renommé, déplacé ou supprimé.
    Quand je clique sur Débogage, l'erreur correspond à la ligne de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Workbooks.Open Item, UpdateLinks = True
    Sachant que je déclare les 2 fichiers de destination 2 comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Classeurs = Array("C:\tests maj\fichier destination 2-1.xls", "C:\tests maj\fichier destination 2-2.xls")
    Merci encore...

  18. #18
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 207
    Points : 14 362
    Points
    14 362
    Par défaut
    Le problème vient de tes noms de dossier et de fichiers avec des espaces. Puisque ce sont des noms de test, renomme sans espace. Je ne mets JAMAIS d'espaces dans ces noms et je n'ai pas le temps de chercher aujourd'hui comment contourner ce problème.

    Au temps pour moi, ne tiens pas compte de la réponse précédente. Poste la totalité de ton code.

  19. #19
    Nouveau Candidat au Club
    Femme Profil pro
    Consultant MOA
    Inscrit en
    Septembre 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant MOA
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2011
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    Bonjour Daniel,

    Voilà voilà j'ai refait des tests, réécrit mes chemins et noms de fichiers, et après vérification complète cela fonctionne, et très bien !
    Alors merci mille fois !

    Pour ceux à qui cela pourrait servir, et qui n'auraient pas le courage de relire toute la conversation, voilà le code en entier donné par Daniel, et qui marche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    Sub MiseAJour()
        Dim Liaisons, Classeurs
     
        'Mettre ici les chemins des fichiers de destination 2
        Classeurs = Array("C:\tests_1\fichier_destination_2-1.xls", "C:\tests_1\fichier_destination_2-2.xls")
     
        Application.ScreenUpdating = False
        For Each Item In Classeurs
            Workbooks.Open Item, UpdateLinks = True
            Liaisons = ActiveWorkbook.LinkSources
            For i = 1 To UBound(Liaisons)
                Workbooks.Open Liaisons(i), UpdateLinks = True
                ActiveWorkbook.Close True
            Next
            ActiveWorkbook.Close True
        Next Item
        Application.ScreenUpdating = True
    End Sub
    Merci et bonne continuation !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 23/10/2010, 21h57
  2. Récupérer des infos sans ouvrir les fichiers
    Par hakuna_du_94 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 02/12/2008, 08h56
  3. Différence entre les fichiers .ss et les fichiers .scm
    Par Djakisback dans le forum Scheme
    Réponses: 2
    Dernier message: 18/11/2008, 18h53
  4. Comment ouvrir un fichier sans ouvrir le dialogue ?
    Par chacarre dans le forum Débuter
    Réponses: 2
    Dernier message: 24/04/2008, 18h34
  5. VBA : ouvrir un fichier sans activer les macros
    Par ShAk44 dans le forum Excel
    Réponses: 3
    Dernier message: 02/07/2007, 12h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo