Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 25/09/2011, 19h22   #1
Invité de passage
 
Femme
Consultant MOA
Inscription : 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 : 0
Points : 0
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
maylinh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/09/2011, 22h01   #2
Expert Confirmé Sénior
 
Homme Daniel
aucune
Inscription : septembre 2011
Messages : 2 004
Détails du profil
Informations personnelles :
Nom : Homme Daniel
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : aucune

Informations forums :
Inscription : septembre 2011
Messages : 2 004
Points : 4 037
Points : 4 037
Bonsoir,

Mais pourquoi veux-tu les mettre à jour ?
__________________
Cordialement.

Daniel

Citation:
La plus perdue de toutes les journées est celle où l'on n'a pas ri.
Chamfort
Daniel.C est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/09/2011, 23h29   #3
Invité de passage
 
Femme
Consultant MOA
Inscription : 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 : 0
Points : 0
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.
maylinh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/09/2011, 00h29   #4
Expert Confirmé
 
Homme Philippe
ex Observeur CGG / Analyste prog.
Inscription : juin 2006
Messages : 1 703
Détails du profil
Informations personnelles :
Nom : Homme Philippe
Localisation : France, Finistère (Bretagne)

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

Informations forums :
Inscription : juin 2006
Messages : 1 703
Points : 3 624
Points : 3 624
Salut, je soppose que tu as consulté ceci http://silkyroad.developpez.com/VBA/ClasseursFermes/
__________________
Pensez à Voter, d'avance merci. ( Pouces en bas à la droite de Citer )
Balisez votre code après l'avoir indenté sous Excel via Smart Indenter
Autre utilitaire : MZ Tools 3.0 VBA

Contribution : Excel / Word / PDF avec Adobe Acrobat Pro / PDFCreator 1 2
kiki29 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/09/2011, 09h59   #5
Expert Confirmé Sénior
 
Homme Daniel
aucune
Inscription : septembre 2011
Messages : 2 004
Détails du profil
Informations personnelles :
Nom : Homme Daniel
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : aucune

Informations forums :
Inscription : septembre 2011
Messages : 2 004
Points : 4 037
Points : 4 037
Bonjour,

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

Code :
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 :
ThisWorkbook.UpdateLinks = xlUpdateLinksAlways
__________________
Cordialement.

Daniel

Citation:
La plus perdue de toutes les journées est celle où l'on n'a pas ri.
Chamfort
Daniel.C est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/09/2011, 10h56   #6
Invité de passage
 
Femme
Consultant MOA
Inscription : 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 : 0
Points : 0
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 :
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...
maylinh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/09/2011, 11h38   #7
Expert Confirmé Sénior
 
Homme Daniel
aucune
Inscription : septembre 2011
Messages : 2 004
Détails du profil
Informations personnelles :
Nom : Homme Daniel
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : aucune

Informations forums :
Inscription : septembre 2011
Messages : 2 004
Points : 4 037
Points : 4 037
Bonjour,

Citation:
Code :
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.
__________________
Cordialement.

Daniel

Citation:
La plus perdue de toutes les journées est celle où l'on n'a pas ri.
Chamfort
Daniel.C est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/09/2011, 11h42   #8
Invité de passage
 
Femme
Consultant MOA
Inscription : 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 : 0
Points : 0
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 !
maylinh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/09/2011, 16h03   #9
Expert Confirmé Sénior
 
Homme Daniel
aucune
Inscription : septembre 2011
Messages : 2 004
Détails du profil
Informations personnelles :
Nom : Homme Daniel
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : aucune

Informations forums :
Inscription : septembre 2011
Messages : 2 004
Points : 4 037
Points : 4 037
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 :
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
__________________
Cordialement.

Daniel

Citation:
La plus perdue de toutes les journées est celle où l'on n'a pas ri.
Chamfort
Daniel.C est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 29/09/2011, 19h47   #10
Invité de passage
 
Femme
Consultant MOA
Inscription : 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 : 0
Points : 0
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 :
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

---------------------------------------------------------------------------
maylinh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/09/2011, 15h06   #11
Expert Confirmé Sénior
 
Homme Daniel
aucune
Inscription : septembre 2011
Messages : 2 004
Détails du profil
Informations personnelles :
Nom : Homme Daniel
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : aucune

Informations forums :
Inscription : septembre 2011
Messages : 2 004
Points : 4 037
Points : 4 037
Bonjour,

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

Code :
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.
__________________
Cordialement.

Daniel

Citation:
La plus perdue de toutes les journées est celle où l'on n'a pas ri.
Chamfort
Daniel.C est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/09/2011, 16h45   #12
Invité de passage
 
Femme
Consultant MOA
Inscription : 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 : 0
Points : 0
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...
maylinh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/09/2011, 16h53   #13
Responsable Visual Basic
 
Avatar de bbil
 
Inscription : juin 2003
Messages : 11 773
Détails du profil
Informations personnelles :
Âge : 45
Localisation : France, Ariège (Midi Pyrénées)

Informations forums :
Inscription : juin 2003
Messages : 11 773
Points : 16 849
Points : 16 849
Envoyer un message via Skype™ à bbil
Bonjour,

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

Code :
1
2
3
4
5
6
7
8
 
Dim Wk as workbook
(...)
set wk = Workbooks.Open (Item, UpdateLinks = True)
(...)
 
wk.close true
(...)
bbil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/09/2011, 17h01   #14
Expert Confirmé Sénior
 
Homme Daniel
aucune
Inscription : septembre 2011
Messages : 2 004
Détails du profil
Informations personnelles :
Nom : Homme Daniel
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : aucune

Informations forums :
Inscription : septembre 2011
Messages : 2 004
Points : 4 037
Points : 4 037
@Marylinh :
Sur quelle ligne, l'erreur ?
__________________
Cordialement.

Daniel

Citation:
La plus perdue de toutes les journées est celle où l'on n'a pas ri.
Chamfort
Daniel.C est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/09/2011, 23h02   #15
Invité de passage
 
Femme
Consultant MOA
Inscription : 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 : 0
Points : 0
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
maylinh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/10/2011, 10h28   #16
Expert Confirmé Sénior
 
Homme Daniel
aucune
Inscription : septembre 2011
Messages : 2 004
Détails du profil
Informations personnelles :
Nom : Homme Daniel
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : aucune

Informations forums :
Inscription : septembre 2011
Messages : 2 004
Points : 4 037
Points : 4 037
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 ?
__________________
Cordialement.

Daniel

Citation:
La plus perdue de toutes les journées est celle où l'on n'a pas ri.
Chamfort
Daniel.C est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/10/2011, 22h40   #17
Invité de passage
 
Femme
Consultant MOA
Inscription : 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 : 0
Points : 0
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à :

Citation:
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 :
Workbooks.Open Item, UpdateLinks = True
Sachant que je déclare les 2 fichiers de destination 2 comme suit :
Code :
Classeurs = Array("C:\tests maj\fichier destination 2-1.xls", "C:\tests maj\fichier destination 2-2.xls")
Merci encore...
maylinh est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 02/10/2011, 12h06   #18
Expert Confirmé Sénior
 
Homme Daniel
aucune
Inscription : septembre 2011
Messages : 2 004
Détails du profil
Informations personnelles :
Nom : Homme Daniel
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : aucune

Informations forums :
Inscription : septembre 2011
Messages : 2 004
Points : 4 037
Points : 4 037
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.
__________________
Cordialement.

Daniel

Citation:
La plus perdue de toutes les journées est celle où l'on n'a pas ri.
Chamfort
Daniel.C est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/10/2011, 10h48   #19
Invité de passage
 
Femme
Consultant MOA
Inscription : 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 : 0
Points : 0
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 :
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 !
maylinh est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 18h01.


 
 
 
 
Partenaires

Hébergement Web