échanges entre 2 classeurs par macro

dmc

XLDnaute Occasionnel
bonjour de nouveau à vous tous, VBAistes
j'ai vainement cherché, sans succès. je pose ma question :
ma macro lit la cellule a1 de la feuille "detail" du classeur "résultat", admettons que la valeur lue soit "Abc".
j'ai besoin de :
- a) trouver quelle ligne de la plage "A:A" dans la feuille "general" du classeur "catalogue" déjà ouvert correspond à cette chaine complète ("ABC" est admis si plus simple pour la macro);
- b) lire sur cette ligne trouvée la valeur de la cellule en colonne B
- c) affecter cette valeur en cellule a2 de le feuille "detail" du classeur "résultat".
Je sais, c'est probablement simple, je n'arrive pas à jongler entre mes deux classeurs.
J'aimerais au passage limiter les changements de cellule activée, histoire de ne pas perdre mon point de départ.
Vous remerciant d'avance, car je compte sur vous.
 

skoobi

XLDnaute Barbatruc
Re : échanges entre 2 classeurs par macro

Bonjour dmc,

A tester:
Code:
Sub test()
Set trouve = Workbooks("catalogue.xls").Sheets("general").Columns("A").Find(Workbooks("résultat.xls").Sheets("detail").Range("A1").Value, _
LookIn:=xlValues, lookat:=xlWhole)
If Not trouve Is Nothing Then Workbooks("résultat.xls").Sheets("detail").Range("A2").Value = trouve.Offset(0, 1).Value
End Sub
 

dmc

XLDnaute Occasionnel
Re : échanges entre 2 classeurs par macro

skoobi, je suis en train d'implanter ce code.
j'ai besoin d'un information sur la ligne "set....."
dois-je l'implanter une fois en début de macro, comme une déclaration ou comme déclencheur de calcul à chaque fois que j'ai besoin d'extraire une valeur ?
Sans doute est-ce une question absurde ???
 

skoobi

XLDnaute Barbatruc
Re : échanges entre 2 classeurs par macro

Re,

quand on débute, rien n'est absurde ;).
Set permet d'attribuer une variable à un objet quel qu'il soit (ici trouve est un Range).
Pour ensuite l'utiliser, tu fais comme si tu avais à faire à l'objet attribuer:
Code:
trouve.Value
trouve.Column
etc...
Si tu réécris
Code:
Set trouve = ...
Tu affectes cette variable à un autre Range.
Par contre, ce que je n'ai pas fais est de déclarer cette variable au début du code:
Code:
Dim trouve as Range
 

dmc

XLDnaute Occasionnel
Re : échanges entre 2 classeurs par macro

à Skoobi, aux autres prêts à me renseigner, bonsoir et ...galère :
je n'ai pas réussi, ou plutôt j'obtiens l'erreur suivante :
"Cet objet ne gère pas cette propriété ou méthode (erreur 438)"
la ligne incriminée est la suivante :
Set trouve = Workbooks("macros_tarifs_" & Version & ".xls").Sheets("bateaux").Columns("C"). _
Find(Workbooks(File_Is).Range("c2").Value, LookIn:=xlValues, lookat:=xlWhole)
à tous vles VBAistes de bonne volonté, merci de me décoincer, le survol de l'instruction avec ma souris ne me fournit pas d'indication.
 

dmc

XLDnaute Occasionnel
Re : échanges entre 2 classeurs par macro

à Skoobi
tu trouveras ci-après un lien cjoint http://cjoint.com/?bEtwZHQYZJ
vers le fichier contenant la macro. ce fichier est dégraissé, afin d'en faire un petit jeu d'essai.
également en cjoint: http://cjoint.com/?bEtAFVTeEC, un fichier à traiter par ma macro.
Pardon à PascalXLD, qui n'aime pas que l'on aie recours à ce procédé, mais mes fichiers sont trop gros, même dégraissés.
la macro s'appelle : traitement tarifs jeanneau
Attention, volumineux, archaîque.... mais fonctionne bien, sauf quand je veux l'améliorer.
j'ai placé le point d'arrêt au module qui plante.
Avant de lancer :
- créer un répertoire \dmctest\jeanneau et y placer le fichier joint macros_tarifs_2009c2.xls.
- créer un sous-répertoire \dmctest\jeanneau\2009c2 et y placer le fichier joint CC505-C2009.xls
puis lancer cette macro dont l'objectif est de transformer le fichier fourni en un fichier présenté à MA sauce (quand elle veut bien prendre).
En cas de difficulté à faire tourner, ne pas hésiter à me contacter.
merci, à +
 

dmc

XLDnaute Occasionnel
Re : échanges entre 2 classeurs par macro

bon ok , errare humanum est !
au moins, j'ai une occasion de fourguer ma macro, la montrer à un pro qui va me la démonter !
j'ai corrigé la ligne de find, avec Sheets(1), car j'ignore à ce stade le nom de la feuille, et je sais que c'est la première. Néanmoins, il serait préférable que je place le nom, quelle est la solution simple STP ?
je n'ai plus de plantage. Mais, la valeur ne m'est pas renvoyée !!! toutes ces souffrances pour échouer maintenant ? non, Skoobi va m'expliquer, sûr...
hein ? c'est sûr ? ! non ?
j'ai presque pas peur...mais si!
what skoobi want, what skoobi do ! sure
bye
 

dmc

XLDnaute Occasionnel
Re : échanges entre 2 classeurs par macro

bonsoir skoobi.
1) en cherchant bien, j'ai trouvé, ma macro fonctionne. les corrections par rapport à ta formule étaient toutes bêtes : écrire sheets au lieu de sheet !
2) je préférais placer le nom de la feuille active plutot que son numéro : j'ai mis à l'ouverture de cette feuille l'instruction suivante méga-évidente : feuille_active = ActiveSheet.Name
3) pour répondre à ta question : mon fournisseur me fournit des fichiers tarifs, tous les trois mois, dans une forme que je trouve non esthétique, pas pratique et non personnalisée pour mon entreprise. Aussi, je traite ces fichiers avec cette macro que j'ai créé. Si tu veux en voir le résultat, suis le lien ci-après (ou fais fonctionner ma macro !):
http://cjoint.com/?bDobzwJL6c
4) j'ai corrigé ma macro, mais elle reste très lourde. en particulier, le module sub_minus a pour objectif de convertir les chaines de majuscules à initiales en majuscules et le reste en minuscules, mais avec des exceptions, nombreuses, pour les mots de - de 3 lettres, ou certains mots sélectionnés.
D'autres mots sont enricihis en accents, je complète au fil de l'eau.
Comme je ne maitrisais pas case else, j'arrive à saturation, et si quelqu'un veut améliorer cette partie, merci d'avance.
5) pépin en fonctionnement : la phase d'aménagement du document juste avant l'enregistrement, se révèle très longue, j'ignore pourquoi. Cette étape est facile à retrouver en cherchant : mise en page. il me faut plus de 30 secondes pour franchir cette étape, j'ignore pourquoi?

si cela t'interesse de m'aider à compléter cette macro, je t'en remercie d'avance.
Bonne soirée. dans l'attente de te lire.
 

skoobi

XLDnaute Barbatruc
Re : échanges entre 2 classeurs par macro

Re bonjour dmc,

pour qu'une macro soit moins lente à l'exécution (ou plus rapide :D), il faut éviter le plus possible les .Select (le défaut de l’enregistreur de macro…)

Par exemple:
Code:
[FONT=Arial]   Range("f6").Select[/FONT]
[FONT=Arial]   tarif = ActiveCell.Text[/FONT]
devient:
Code:
tarif = Range("f6").Text

Autre exemple:
Code:
[FONT=Arial]   ActiveSheet.DrawingObjects.Select[/FONT]
[FONT=Arial]   Selection.Delete[/FONT]
[FONT=Arial]   ' copie-coller avec valeurs (suppression des éventuelles formules)[/FONT]
[FONT=Arial]Cells.Select[/FONT]
[FONT=Arial]   'Selection.Borders.ColorIndex = 5[/FONT]
devient
Code:
[FONT=Arial]   ActiveSheet.DrawingObjects.Delete[/FONT]
[FONT=Arial]   ' copie-coller avec valeurs (suppression des éventuelles formules)[/FONT]
[FONT=Arial]   Cells.Borders.ColorIndex = 5[/FONT]

Ce n’est pas toujours possible :
Code:
[FONT=Arial]   Range("A2").Select: ActiveWindow.FreezePanes = True  'lignes figées[/FONT]

Pour ce qui est de sub_minus, je remarque ceci :
Code:
[FONT=Arial]If UCase(mot) = "ASYMETRIQUE" Then mot = "Asymétrique"[/FONT]
[FONT=Arial]If UCase(mot) = "BABORD" Then mot = "Bâbord"[/FONT]
[FONT=Arial]If UCase(mot) = "CADENES" Then mot = "Cadènes"[/FONT]
[FONT=Arial]…[/FONT]
[FONT=Arial]…[/FONT]
Ca n’a l’air de rien mais chaque condition va être analysé ce qui va augmenter le temps d’exécution du code.
Utilise plutôt cette structure : If …ElseIf… EndIf (ce que tu fais correctement ailleurs dans le code).
Code:
[FONT=Arial]If UCase(mot) = "ASYMETRIQUE" Then [/FONT]
[FONT=Arial]mot = "Asymétrique"[/FONT]
[FONT=Arial]ElseIf UCase(mot) = "BABORD" Then [/FONT]
[FONT=Arial]mot = "Bâbord"[/FONT]
[FONT=Arial]ElseIf UCase(mot) = "CADENES" Then [/FONT]
[FONT=Arial]mot = "Cadènes"[/FONT]
[FONT=Arial]…[/FONT]
[FONT=Arial]…[/FONT]

ou mieux, Select Case :

Code:
[FONT=Arial]       Select Case UCase(mot)[/FONT]
[FONT=Arial]       Case "ASYMETRIQUE": mot = "Asymétrique"[/FONT]
[FONT=Arial]       Case "BABORD": mot = "Bâbord"[/FONT]
[FONT=Arial]       Case "CADENES": mot = "Cadènes"[/FONT]
[FONT=Arial]       .....[/FONT]
[FONT=Arial]       ...[/FONT]
[FONT=Arial]       End Select[/FONT]
Pourquoi ? car Select Case permet de tester la valeur d’une variable, ce que tu peux aussi faire avec If … End If mais c’est une question de « lisibilité ».

Test et dis nous
 
Dernière édition:

dmc

XLDnaute Occasionnel
Re : échanges entre 2 classeurs par macro

bonsoir Skoobi
chose promise ...: ma macro modifiée selon tes conseils :
http://cjoint.com/?cfaTFWRPlj

merci de tes conseils, j'ai pu mettre un peu d(ordre.
il n'y a plus de select

mais le pssage de mise n page est toujours aussi long, environ 15s pour traiter largeur de page, titre ect.
Si tu as un conseil, sur ça et d'autres améliorations merci d'avance.
et merci pour les précedents et précieux conseils déjà donnés.
@+ cordialement
 

Discussions similaires

Réponses
4
Affichages
277

Statistiques des forums

Discussions
311 720
Messages
2 081 924
Membres
101 841
dernier inscrit
ferid87