|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité régulier
![]() Inscription : mai 2004 Messages : 61 ![]() |
Bonjour à tous,
Je souhaiterai insérer, sur une page excel, un bouton qui me permette de transférer des données vers un autre fichier SI certaines cellules sont remplies. En effet, j'ai deux fichiers et je dois recopier bcp de données du fichier1 vers le fichier2 avec les risques d'erreur que cela comporte. Je voudrais donc automatiser la copie des données. Ex. : Si la cellule G15 de mon fichier1 est remplie et que j'appuie sur mon bouton "transfert de données", les données contenues dans les cellules A15, C15, D15 du fichier1 sont envoyées dans les cellulles A1, C1, D1 de mon fichier2. Est-ce que vous pourriez m'aider à faire la macro s'il vous plait ? Je ne suis pas du tout experte en VB... Un grand merci par avance pour votre aide. Cordialement, Alfred |
|
|
00
|
|
|
#2 |
|
Membre actif
![]() Inscription : novembre 2008 Messages : 188 ![]() |
On ne refusera pas de t'aider mais on n'est pas là non plus pour te cracher le code directement.
Pour commencer tu peux utiliser l'enregistreur de macros (Outils->Macro->Nouvelle Macro...) pour générer automatiquement un code des actions que tu veux réaliser. Après Outils->Macro->Macros... (ou Alt+F8), tu sélectionnes la macro que tu viens d'enregistrer et tu cliques sur 'Modifier'. Essaie alors de modifier la macro pour l'adapter à tes besoins et reviens demander de l'aide ici quand tu coinces (en décrivant ce qui ne va pas, où ça se produit, dans quelles circonstances...). Bon courage! |
|
|
00
|
|
|
#3 |
|
Invité régulier
![]() Inscription : mai 2004 Messages : 61 ![]() |
Bonjour,
J'ai dû mal m'exprimer parce que je n'attendais pas que vous me "crachiez le code directement". Excusez moi. Je voulais surtout, dans un premier temps, savoir si ce que je voulais faire était possible et comment faire pour mettre des conditions. Je vais continuer à chercher. Cordialement, Alfred |
|
|
00
|
|
|
#4 |
|
Membre actif
![]() Inscription : novembre 2008 Messages : 188 ![]() |
C'est tout à fait faisable et même pas bien sorcier en VBA.
Pour le bouton: Affichage -> Barres d'outils -> Boîte à outils Contrôles, puis dans cette barre d'outil, sélectionne un contrôle "bouton de commande" (l'icône est un rectangle gris) que tu places où tu veux sur ta feuille. De l'autre côté tu peux écrire une macro qui teste le contenu de tes cellules (avec des structures du style If [condition] Then [action1] Else [action 2] End If) et qui copie tes cellules. |
|
|
10
|
|
|
#5 | ||
|
Invité régulier
![]() Inscription : mai 2004 Messages : 61 ![]() |
Bonjour,
Et merci pour vos réponses. J'étais exactement en train de faire ce que vous dites, mais j'ai vraiment du mal. Je ne suis pas certain de placer les instructions au bon endroit... En fait, j'ai bien mis un bouton sur la feuille, mais comme je voulais ajouter une condition, je suis un peu perdu... Pour l'instant, je n'ai pas encore copié les données des cellules, je fais juste des tests avec une message box. Code :
Autre question, sans doute idiote, mais bon... Il faut bien débuter... Est-ce qu'on peut imbriquer les Sub ? Merci d'avance. |
||
|
|
00
|
|
|
#6 |
|
Membre régulier
![]() Inscription : mars 2004 Messages : 33 ![]() |
Bonjour,
Vous ne pouvez pas attribuer la procédure que vous avez écrite au bouton car vous avez écrit votre code dans une procédure associé à un événement possédant un paramètre (Target). Pour associer une macro directement à un bouton de type formulaire que vous semblez avoir crée, il faut que la procédure soit sans paramètre et doit être publique. (il y a aussi l'option du bouton en ActiveX et la rédaction de la procédure évenementielle _onClick) quand à imbriquer des Sub, j'avoue ne pas bien comprendre ou vous voulez en venir... Cordialement. |
|
|
00
|
|
|
#7 | ||||||
|
Membre actif
![]() Inscription : novembre 2008 Messages : 188 ![]() |
Citation:
Normalement ça devrait automatiquement te placer dans la procédure correspondant à l'évènement "clic sur ce bouton". Il ne te reste alors plus qu'à taper ta procédure à cet endroit et elle sera exécutée lorsque tu cliques sur le bouton. Citation:
En fait, toutes les procédures (sub) et fonctions (function) sont déclarées séparément mais tu peux ensuite appeler n'importe laquelle depuis une autre. Exemple schématique: Code :
Au sein de ma procédure principale, j'appelle ma procédure secondaire. A ce moment là, l'exécution de la procédure principale est "mise en pause", la procédure secondaire est appelée, exécutée et une fois qu'elle s'est terminée l'exécution de la procédure principale reprend. Il est très fortement recommandé d'utiliser ce genre de structure car cela améliore grandement la clarté du code et permet souvent d'en réduire la longueur (si la procédure secondaire est appelée au moins 2 fois à des endroits différents dans la procédure principale). J'espère avoir été assez clair...n'hésite pas à demander des éclaircissements sur ce que tu ne comprends pas. |
||||||
|
|
10
|
|
|
#8 | ||||
|
Invité régulier
![]() Inscription : mai 2004 Messages : 61 ![]() |
Merci pour vos réponses : elles m'éclairent bien !
C'est super clair pour les sub "imbriquées", j'ai bien compris ! Je vais faire des petits tests pour voir j'arrive à passer de la théorie à la pratique. Bonjour, J'ai à nouveau besoin de votre aide... Pour m'en sortir, j'ai procédé par étapes. J'ai donc fait des petites macros en me disant qu'une fois que ça fonctionnerait je pourrais "fusionner" les macros. J'ai donc deux macros qui fonctionnent bien... séparément La macro 1 récupère bien les données de la cellule modifiée et la copie dans un autre fichier mais uniquement dans une cellule donnée. En plus, je n'arrive pas à affecter cette macro à un bouton... La macro 2 colle bien les cellules copiées dans la première ligne vide, mais je n'arrive à copier qu'une cellule donnée et non un cellule modifiée comme dans la macro 1. Avez vous des pistes à me donner ? Merci d'avance pour votre aide. Alfred Macro 1 : Code :
Code :
|
||||
|
|
00
|
|
|
#9 |
|
Membre actif
![]() Inscription : novembre 2008 Messages : 188 ![]() |
Bonjour,
En ce qui concerne ta Macro1, comme l'a déjà expliqué casanabo un peu plus haut, le problème vient du fait que ta macro est associé à l'évènement: Code :
Worksheet_change(ByVal Target As Range) VBA permet de réaliser des programmes "interactifs" en gérant les évènements affectant les objets sur lesquels on travaille. Par exemple, lorsque le contenu d'une cellule change, que l'on clique sur un bouton...etc. Dans ce cas précis, l'évènement Worksheet_change désigne un changement d'état d'une feuille de calcul et, en prime, envoie également une copie (ByVal) de l'objet ayant changé (Target As Range). Donc chaque fois qu'une cellule ou une plage de cellule est modifiée dans ta feuille de calcul, la Sub Worksheet_change(ByVal Target As Range) est exécutée. Problème: Ta macro utilise justement la plage retournée par l'évènement et en est donc dépendante. Si tu essaies de l'affecter à un bouton de contrôle, ça ne marchera plus car tu ne pourras pas récupérer 'Target' de la même façon. Solution: Utilise la même procédure sur l'évènement 'Click' de ton bouton de contrôle et à la place de Target utilise: Code :
ActiveSheet.ActiveCell 'il faut que le bouton de contrôle se truve sur la même feuille pour que cela fonctionne. En ce qui concerne la Macro2, j'avoue ne pas comprendre ton problème. |
|
|
00
|
|
|
#10 | ||
|
Invité régulier
![]() Inscription : mai 2004 Messages : 61 ![]() |
Bonjour Sclarckone, et merci pour ta réponse.
Entre temps, j'avais modifié la macro : Code :
Merci d'avance pour ton aide. Alfred |
||
|
|
00
|
|
|
#11 | ||||||
|
Membre actif
![]() Inscription : novembre 2008 Messages : 188 ![]() |
Code :
Au passage, il est inutile de sélectionner ta cellule de destination et de faire le collage sur la cellule de destination. C'est ce que fait l'enregistreur de macro (vu que tu cliques sur la cellule avant de coller) mais en VBA ça peut se raccourcir comme ça: Code :
Sheets("Feuil1").Cells(NoDeLaDernLig + 1, 3).PasteSpecial Paste:=xlPasteAllExceptBorders Pour ton problème d'évènement modification de cellules/clic sur bouton, il n'y a évidemment pas d'évènement correspondant dans VBA (qui ne gère que des évènements ponctuels sur un seul élément pour ce que j'en sais). Une solution à ton problème est de déclarer un tableau de taille dynamique avec une portée globale qui va contenir les valeurs des cellules modifiées (par exemple, mais si tu veux copier plusieurs cellules, il vaudra mieux stocker directement les 'Range' si c'est possible): Code :
Avec ce tableau accessible depuis n'importe quelle objet, tu peux décomposer le problème en 2 parties: 1°/ Sur l'évènement 'Worksheet_change", rajouter un élément au tableau: Code :
Redim Preserve monTableau (0 To UBound(monTableau)+1) 'si tu as choisi d'indicer les éléments en démarrant de 0, UBound() est une fonction renvoyant le plus grand indice du tableau 2°/Sur l'évènement 'CommandButton_Click', tu copies une à une toutes les valeurs stockées dans le tableau en n'oubliant pas d'effacer le contenu du tableau une fois que c'est fini: Code :
|
||||||
|
|
10
|
|
|
#12 | ||||
|
Invité régulier
![]() Inscription : mai 2004 Messages : 61 ![]() |
Merci beaucoup Sclarckone ! J'apprécie ton aide. Je suis en train de devenir dingue avec cette macro !
Je vais essayer de faire ce que tu me conseilles et je reviens vers toi. Alfred. Bonjour Sclarckone, Je suis désolé, mais je ne m'en sort pas du tout avec les tableaux... Le code suivant, tout simple, fonctionne (sur le modèle que tu m'as donné mais sans tableau) : Code :
Code :
J'ai essayé de faire des macros juste pour comprendre le fonctionnement des tableaux mais peine perdue, je ne comprends pas ! Merci d'avance de m'aider encore un peu ! Cordialement, Alfred |
||||
|
|
00
|
|
|
#13 | ||
|
Membre Expert
![]() Retraité Inscription : avril 2011 Messages : 692 ![]() |
Bonjour,
Si j’ai bien compris, tu cherches à effectuer une copie de certaines cellules d’un classeur vers un autre classeur, cette copie étant exécutée via un CommandButton. Les cellules à copier sont dans le classeur actif, colonnes D, E, F et O (à adapter si nécessaire). Elles doivent être « collées » dans le classeur Fichier1.xls, colonnes A, B, C et D (à adapter si nécessaire), dans la première ligne vide. Les lignes correspondant aux cellules à copier sont marquées dans la colonne L (à adapter si nécessaire). Voici un code qui pourra te servir de fil conducteur. Code :
|
||
|
|
00
|
|
|
#14 |
|
Invité régulier
![]() Inscription : mai 2004 Messages : 61 ![]() |
Merci beaucoup gFZT82
J'apprécie beaucoup votre aide à tous parce que, bien que je me démène, je ne m'en sort pas et moralement c'est pas facile ! Je vais étudier le code que tu me donnes, et je te donne des nouvelles. En plus, c'est super bien commenté, ça va beaucoup m'aider ! Cordialement, Alfred |
|
|
00
|
|
|
#15 | |||||||
|
Membre actif
![]() Inscription : novembre 2008 Messages : 188 ![]() |
Citation:
Mais d'abord il y a un problème de "portée"... On parle de portée d'une variable ou d'un objet pour désigner l'espace dans lequel cette variable existe. Pour bien comprendre prenons le cas le plus courant: la déclaration au sein d'une procédure avec Dim: Code :
Pour empêcher la variable d'être détruite à la fin de la procédure on peut utiliser le mot clé 'Static' à la place de 'Dim', mais la variable n'est toujours pas accessible depuis d'autres procédures/fonctions. De façon similaire, peut déclarer des variables pour tout un module, cela se fait tout en "haut" du module, avant la première procédure/fonction. On a alors 2 portées possibles: - 'Private': la variable est accessible à toutes les procédures/fonctions du modules mais pas depuis un autre module - 'Public' la variable est accessible depuis tous les modules du projet Dans l'explorateur de projet, tu peux voir le projet de ton fichier en cours (normalement: VBA Project (nom_de_ton_fichier.xls)) et chaque module de ce projet: le classeur a un module ainsi que chaque feuille (plus des userforms indépendants et des modules persos si tu en utilises). Pour en revenir à nos moutons, il faut donc que tu déclares ton tableau dans ton module (qui, j'imagine, contient tes 2 procédures vu que tu travailles sur une seule feuille) en portée au moins 'Private' (mais utilise 'Public'; comme ça, si tu as besoin d'utiliser ce tableau dans d'autres feuilles, ce sera possible). Code :
Code :
Surtout, ne te contente pas de recopier le code que l'on te donne mais efforce-toi de le comprendre et n'hésite pas à poser des questions si besoin. Bon courage |
|||||||
|
|
00
|
|
|
#16 | |
|
Invité régulier
![]() Inscription : mai 2004 Messages : 61 ![]() |
Merci beaucoup Sclarckone,
Citation:
J'avoue que ça me démoralise de ne pas y arriver , mais bon, il faut garder espoir...Pour ce qui est du reste de ton mail, je vais m'y atteller tout de suite... A bientôt. Encore merci |
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com