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 10/12/2011, 11h08   #1
Invité de passage
 
Homme Philippe
infographie
Inscription : décembre 2011
Messages : 5
Détails du profil
Informations personnelles :
Nom : Homme Philippe
Localisation : France, Doubs (Franche Comté)

Informations professionnelles :
Activité : infographie
Secteur : High Tech - Produits et services télécom et Internet

Informations forums :
Inscription : décembre 2011
Messages : 5
Points : 0
Points : 0
Par défaut liaisons entre plusieurs classeurs

Bonjour à tous,

j'ai un souci avec des liaisons entre plusieurs classeurs, voici la problématique :


Donc je pars d'un classeur excel source.

Pour l'instant je travaille sur le format xls, mais je vais l'enregistrer comme modèle car c'est un document type pour la saisie des données. D'ailleurs je me pose la question du format à utiliser pour l'enregistrement du modèle avec les macros ? votre avis sur ce point svp ?

un fichier source (classeur A) comporte 3 feuilles :

- 1 feuille pour la saisie des informations (il s'agit de sessions de formations pour une assoc, donc 1 tableau avec 1 ligne par adhérent (nom, prenom, age, sexe...) Plusieurs formules sur la feuille, permettant de "batonner" des cellules en fonction de combinaison de critères (ex : si X a plus de 21 ans et a le bac, alors il est dans la catégorie A sinon la B)

1 feuille de synthèse, dont certaines cellules affichent les valeurs cumulées pour l'ensemble des inscrits sur la feuille A, et d'autres cellules affichent des données statistiques en pourcentage issue des la feuille "saisie".

1 feuille pour l'export (le coeur du probleme). Cette feuille reprend sur une ligne unique les données de la feuille synthèse, ligne qui ordonne les données dans l'ordre du tableau destination qui sera dans la classeur AAA.

J'ai une macro qui exporte (copier, collage spécial tout avec liaison) cette ligne dans le classeur AAA, donc 1 ligne par classeur source.

Voici le code de la macro :

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
32
33
34
35
36
37
38
39
40
41
Sub EXPORT_STATS()
'
' EXPORT_STATS Macro
' Macro enregistrée le 07/12/2011
'
 
'
    Sheets("export").Select
    Range("A3:AM3").Select
    Selection.Copy
    Windows("stats_2012_V1_071211.xls").Activate
    Range("A65536").End(xlUp).Offset(1, 0).Select
    ActiveSheet.Paste Link:=True
    ActiveWindow.ScrollColumn = 2
    ActiveWindow.ScrollColumn = 3
    ActiveWindow.ScrollColumn = 4
    ActiveWindow.ScrollColumn = 5
    ActiveWindow.ScrollColumn = 6
    ActiveWindow.ScrollColumn = 7
    ActiveWindow.ScrollColumn = 8
    ActiveWindow.ScrollColumn = 9
    ActiveWindow.ScrollColumn = 10
    ActiveWindow.ScrollColumn = 11
    ActiveWindow.ScrollColumn = 12
    ActiveWindow.ScrollColumn = 13
    ActiveWindow.ScrollColumn = 14
    ActiveWindow.ScrollColumn = 15
    ActiveWindow.ScrollColumn = 16
    ActiveWindow.ScrollColumn = 17
    ActiveWindow.ScrollColumn = 18
    ActiveWindow.ScrollColumn = 19
    ActiveWindow.ScrollColumn = 20
    ActiveWindow.ScrollColumn = 21
    ActiveWindow.ScrollColumn = 22
    ActiveWindow.ScrollColumn = 23
    ActiveWindow.ScrollColumn = 24
    ActiveWindow.ScrollColumn = 25
    Application.CutCopyMode = False
    Range("A65536").End(xlUp).Offset(1, 0).Select
    ActiveWorkbook.Save
End Sub
Le problème : j'ai fait un 1er export, pas de souci.

J'enregistre la classeur A sous le nom classeur B, je modifie les valeurs, j'exporte vers classeur AAA.

et dans mon classeur AAA j'ai bien les 2 lignes exportées, mais toutes les 2 présentent les valeurs du classeur B. et ma liaison a été renommée classeur B, la liaison vers le classeur A a disparu de la liste des liaisons. alors que je souhaitais que l'enregistrement du classeur B entraine la création d'une nouvelle liaison, en plus de l'existante dans le classeur AAA.

C'est pour ce motif que je pensais que partir d'un modèle pouvait éventuellement résoudre le pb, mais ca me semble trop simple.

J'espère que j'ai réussi a vous expliquer clairement le probleme.

Votre avis ?

merci par avance pour vos conseils...

Philippe
PhilippeBesac est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2011, 12h26   #2
Invité de passage
 
Homme Philippe
infographie
Inscription : décembre 2011
Messages : 5
Détails du profil
Informations personnelles :
Nom : Homme Philippe
Localisation : France, Doubs (Franche Comté)

Informations professionnelles :
Activité : infographie
Secteur : High Tech - Produits et services télécom et Internet

Informations forums :
Inscription : décembre 2011
Messages : 5
Points : 0
Points : 0
Il me semble avoir finalement trouvé la solution à ce problème qui n'en était apparemment pas un. L'enregistrement du document source au format xlt (modele), puis la création de fichiers source a partir de ce modele génère les liaisons correspondantes.

J'ai fait plusieurs essais concluants, mais j'aimerais connaitre votre point de vue sur cette méthode. est elle 100% fiable, et est on limité en nombre de liaisons sur un classeur xls ?
PhilippeBesac est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2011, 15h30   #3
Modérateur
 
Avatar de AlainTech
 
Homme Alain Gerard
Consultant informatique
Inscription : mai 2005
Messages : 3 675
Détails du profil
Informations personnelles :
Nom : Homme Alain Gerard
Âge : 58
Localisation : Belgique

Informations professionnelles :
Activité : Consultant informatique
Secteur : Finance

Informations forums :
Inscription : mai 2005
Messages : 3 675
Points : 7 665
Points : 7 665
Bonjour,

Ce qui n'est absolument pas fiable ce sont les Select, Activate et autres ActiveWorkbook.

Un petit exemple de ce que pourrait être ton code sans selections:
Code :
1
2
3
4
5
6
7
8
9
Sub EXPORT_STATS()
 
    Workbooks("NomDuClasseurSource").Sheets("export").Range("A3:AM3").Copy
    With Workbooks("stats_2012_V1_071211.xls").Sheets("NomDeLaFeuilleDestination")
      .Paste Destination:=.Range("A65536").End(xlUp).Offset(1, 0), Link:=True
    End With
    Application.CutCopyMode = False
    Workbooks("stats_2012_V1_071211.xls").Save
End Sub
__________________
N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
Pensez aussi à voter pour les réponses qui vous ont aidés.
------------
Je dois beaucoup de mes connaissances à mes erreurs!
AlainTech est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2011, 18h44   #4
Invité de passage
 
Homme Philippe
infographie
Inscription : décembre 2011
Messages : 5
Détails du profil
Informations personnelles :
Nom : Homme Philippe
Localisation : France, Doubs (Franche Comté)

Informations professionnelles :
Activité : infographie
Secteur : High Tech - Produits et services télécom et Internet

Informations forums :
Inscription : décembre 2011
Messages : 5
Points : 0
Points : 0
Bonsoir Alain,

merci pour cette proposition de code. Je débute en VBA alors ça ne m'étonne pas que je commette des erreurs de débutant !

J'aurais juste 2 questions : pourquoi les Select, Activate et autres ActiveWorkbook ne sont ils pas fiables ?

Concernant ton code, cette partie m'interpelle :

Code :
Workbooks("NomDuClasseurSource")
En effet la macro tourne sur un classeur modele xlt. Donc ensuite le fichier aura beaucoup de noms différents xls... Donc impossible de préciser ici un nom de fichier... Comment puis-je procéder ?

Encore merci pour ton code et l'intérêt porté à ce post.

Cordialement, Philippe
PhilippeBesac est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2011, 18h53   #5
Modérateur
 
Avatar de AlainTech
 
Homme Alain Gerard
Consultant informatique
Inscription : mai 2005
Messages : 3 675
Détails du profil
Informations personnelles :
Nom : Homme Alain Gerard
Âge : 58
Localisation : Belgique

Informations professionnelles :
Activité : Consultant informatique
Secteur : Finance

Informations forums :
Inscription : mai 2005
Messages : 3 675
Points : 7 665
Points : 7 665
Remplace
Code :
Workbooks("NomDuClasseurSource")
par Le problème des Select et Activate est double:
D'une part, il y aura une animation à l'écran qui n'est pas du plus heureux effet.
D'autre part, si l'utisateur veut vérifier qqch pendant le déroulement de la macro et qu'il clique quelque part, toute la macro est déstabilisée.
__________________
N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
Pensez aussi à voter pour les réponses qui vous ont aidés.
------------
Je dois beaucoup de mes connaissances à mes erreurs!
AlainTech est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 10/12/2011, 19h11   #6
Invité de passage
 
Homme Philippe
infographie
Inscription : décembre 2011
Messages : 5
Détails du profil
Informations personnelles :
Nom : Homme Philippe
Localisation : France, Doubs (Franche Comté)

Informations professionnelles :
Activité : infographie
Secteur : High Tech - Produits et services télécom et Internet

Informations forums :
Inscription : décembre 2011
Messages : 5
Points : 0
Points : 0
Merci pour ces infos Alain.

Mais à l'éxécution de la macro, j'ain le message d'erreur suivant :

erreur d'éxécution 1004

la méthode paste de la classe Worksheet a échoué

Voici le code de la macro tel que je l'ai retranscrit :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
Sub EXPORT_STATS()
'
' EXPORT_STATS Macro
'

'
    ThisWorkbook.Sheets("export").Range("A3:AM3").Copy
    With Workbooks("stats_2012_V1_071211.xls").Sheets("SYNTHESE_ANNUELLE")
      .Paste Destination:=.Range("A65536").End(xlUp).Offset(1, 0), Link:=True
    End With
    Application.CutCopyMode = False
    Workbooks("stats_2012_V1_071211.xls").Save
End Sub
j'ai indiqué en gras le code qui semble poser problème. Une question également : cette méthode colle bien les données avec liaison ?
PhilippeBesac est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2011, 03h04   #7
Modérateur
 
Avatar de AlainTech
 
Homme Alain Gerard
Consultant informatique
Inscription : mai 2005
Messages : 3 675
Détails du profil
Informations personnelles :
Nom : Homme Alain Gerard
Âge : 58
Localisation : Belgique

Informations professionnelles :
Activité : Consultant informatique
Secteur : Finance

Informations forums :
Inscription : mai 2005
Messages : 3 675
Points : 7 665
Points : 7 665
Je viens de tomber sur une exception à la règle "anti Selection" mais je pense l'avoir contournée.
Peux-tu essayer ceci:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Sub EXPORT_STATS()
'
' EXPORT_STATS Macro
'
 
'
    ThisWorkbook.Sheets("export").Range("A3:AM3").Copy
    With Workbooks("stats_2012_V1_071211.xls").Sheets("SYNTHESE_ANNUELLE")
      .Range("A65536").End(xlUp).Offset(1, 0).PasteSpecial
      .PasteSpecial Link:=True
    End With
    Application.CutCopyMode = False
    Workbooks("stats_2012_V1_071211.xls").Save
End Sub
Si ça ne fonctionne pas comme attendu, il faudra que j'accepte humblement qu'il y a des cas où la sélection est obligatoire.
__________________
N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
Pensez aussi à voter pour les réponses qui vous ont aidés.
------------
Je dois beaucoup de mes connaissances à mes erreurs!
AlainTech est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2011, 11h34   #8
Expert Confirmé Sénior
 
Avatar de mercatog
 
Inscription : juillet 2008
Messages : 5 848
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 5 848
Points : 13 907
Points : 13 907
Bonjour

Pour la dernière proposition d'Alain, remplacez la ligne 10 par celle ci
Ensemble contre les Select

Pour ne pas passer par le Copy/Paste
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Sub EXPORT_STATS2()
Dim Fich As String, Chemin As String
Dim Wbk As Workbook
Dim c As Range
 
Application.ScreenUpdating = False
'Chemin du fichier
Chemin = "C:\Users\user\Desktop\"
'Ouvrir le fichier où on va écrire
Set Wbk = Workbooks.Open(Chemin & "stats_2012_V1_071211.xls", UpdateLinks:=False)
'Nom du fichier et feuille export
Fich = "'[" & ThisWorkbook.Name & "]export'!"
'On insère la formule
With Wbk.Worksheets("SYNTHESE_ANNUELLE")
    Set c = .Cells(.Rows.Count, "A").End(xlUp)(2)
    c.Resize(1, 39).Formula = "=" & Fich & "A3"
End With
'On ferme notre fichier en sauvegardant
Wbk.Close True
Set Wbk = Nothing
End Sub
__________________
Cordialement.
mercatog est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 11/12/2011, 19h56   #9
Invité de passage
 
Homme Philippe
infographie
Inscription : décembre 2011
Messages : 5
Détails du profil
Informations personnelles :
Nom : Homme Philippe
Localisation : France, Doubs (Franche Comté)

Informations professionnelles :
Activité : infographie
Secteur : High Tech - Produits et services télécom et Internet

Informations forums :
Inscription : décembre 2011
Messages : 5
Points : 0
Points : 0
Bonsoir,

merci beaucoup Alain et Mercatog pour votre aide précieuse...
Alain, ton code fonctionne très bien avec le correctif de Mercatog, sinon l'export était disons.. exotique !!

Mercatog, merci pour ta 2e proposition de code, mais étant débutant, je ne le comprends pas alors je vais plutôt me contenter de celui d'Alain, je me sens plus à l'aise avec.

J'aurais par ailleurs une question relative au fonctionnement même de ces classeurs.

Le classeur de destination, ou les données sont exportées dans un tableau de synthèse, va se retrouver avec plusieurs dizaines de liaisons (environ 250) vers les classeurs sources. Les liaisons sont nécessaires, car ces fichiers sources peuvent voir leur données (uniquement les valeurs) modifiées au fil des mois. tout ça risque d'être très lourd en mémoire non ? Existe-t-il une autre méthode permettant la mise à jours des valeurs du classeur destination ?

Je joins a ce post le classeur modele qui sera utilisé pour les classeurs sources, et le classeur de destination.

Le modele contient des données exemple, rien de confidentiel.

Un avis global sur ce travail est bienvenu !

Bonne soirée,
Fichiers attachés
Type de fichier : xls stats_2012_V1_071211.xls (124,5 Ko, 1 affichages)
Type de fichier : zip DOC_CENTRAL_TYPE_V1_061211.zip (34,1 Ko, 1 affichages)
PhilippeBesac est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 22h28.


 
 
 
 
Partenaires

Hébergement Web