Vous utilisez un navigateur obsolète. Il se peut que ce site ou d'autres sites Web ne s'affichent pas correctement. Vous devez le mettre à jour ou utiliser un navigateur alternatif.
COMMENT copier une macro VBA d'une feuille et l'utiliser dans une autre ???
Bonjour le forum,
Depuis quelque temps, je pose des questions sur le forum, et sur certaines de ces réponses, on me donne comme solution des macros à mettre dans ma feuille.
Le problème, je ne suis jamais arrivé à exécuter les macros dans mes fichiers !!!
Pourriez-vous me faire un tutoriel pour que je puisse me servir des macros que l'on m'a données.
Voici un début de tuto (je ne sais s'il est juste, puisse que ça ne fonctionne pas!!)
Ton classeur est ouvert :
Tu fais ALT + F11 pour te retrouver dans l'éditeur VBA.
Puis, CTRL + R pour afficher l'explorateur de projet (s'il n'est pas déjà affiché).
L'explorateur de projet c'est la petite fenêtre au haut à gauche.
Tu double-cliques sur "VBAProject(LeNomDeTonClasseur)" pour développer l'arborescence.
Tu fais menu Insertion / Module et le module de code (Module1) s'ouvre dans la fenêtre principale.
Et tu fais un copier-coller du code à cet endroit (toutes les lignes de "Private Sub...." à "End Sub" incluses).
Tu peux ensuite fermer l'éditeur VBA.
J'ai bien fait tout cela, mais rien à faire !! Bon, je suis débutant en Excel, mais je sais tout de même lire !!!
Dans une feuille du classeur, qui contient la macro, insère une forme automatique ou une image, fait un click droit et affecte à cette forme/image la macro souhaitée. Et ça roule...
En espérant t'avoir "aidé" et avoir bien compris ton soucis
Il n'y a aucun problème dans le tuto que l'on t'a fourni
Gràce à ce tuto tu crées ta macro, mais faut-il encore que tu puisses maintenant l'utiliser.
La méthode la plus simple est de te servir de la barre de menu : "Outils" -- "Macros"
ainsi tu dois retrouver toutes les macros que tu as pu construire selon le tuto précédent. Tu choisis celle qui te convient et clique sur le bouton "Exécuter"
Petite remarque par rapport au tuto
Après Sub (première ligne du module), donne un nom à ta macro, exemple :
Sub essai()
tu devrais t'en sortir avec ces renseignements supplémentaires
Attention, ce que tu nous propose n'est pas vraiment une macro, mais une procédure évennemntielle
C'est à dire que le code que cette procédure contient se sera "activé" que si il y a un changement dans ta feuille active.
Par contre avec ce que nous avons (JCGL et moi même) proposé c'est de de permettre de lancer la macro au moment où tu le désires (voir mes explications "Outils" --" "Macros"), ce n'est pas pareil
Donc pour répondre à ta première question il te suffit de placer ton code dans un module :
Sub retour_a_la_ligne()
Dim ColDeb, ColFin As Integer
ColDeb = 1 ' Colonne de départ
ColFin = 15 ' colonne de fin
If Target.Column = ColFin Then
Cells(Target.Row + 1, ColDeb).Select
End If
End Sub
et d'appeler ta macro au moment opportun
Maintenant si tu désires la lier à un évennement, alors "c'est une autre paire de manches"
Donc, si j'ai bien compris, à chaque fois que l'on me donne une procédure événementielle, il faut que je remplace le début soit "Private Sub Worksheet_Change(ByVal Target As Range)" par, "Sub le_nom_que_je donne()" ?
Puis ensuite, je retrouve ce nom, dans Outils>Macro>Macros.
Je n'ai ensuite plus qu'a exécuter, c'est bien cela ?
Merci pour ta réponse, je crois que je vais pouvoir bosser maintenant !
PS: Cela dit, je viens de tester la formule, elle ne fonctionne pas !!
Donc, si j'ai bien compris, à chaque fois que l'on me donne une procédure événementielle, il faut que je remplace le début soit "Private Sub Worksheet_Change(ByVal Target As Range)" par, "Sub le_nom_que_je donne()" ?
Puis ensuite, je retrouve ce nom, dans Outils>Macro>Macros.
Je n'ai ensuite plus qu'a exécuter, c'est bien cela ?
Merci pour ta réponse, je crois que je vais pouvoir bosser maintenant !
PS: Cela dit, je viens de tester la formule, elle ne fonctionne pas !!
Salut à tous
Quand tu vas dans VBE (Alt+F11)
Tu as l'explorateur de projet
Dans l'arborescence, il y a au minimum (plus si affinités)
Feuil(Feuil1) - ou équivalent suivant le nom donné
ThisWorkBook
et éventuellement un module général dans l'arborescence module (on laisse de coté les USF pour l'instant)
Si tu double-clic sur un module, la page de droite semble identique pour les 3 types de modules
Une case en haut à gauche : (Général)
Une case en Haut à droite : (Déclaration)
une page blanche où tu peux entrer ton code
(Jusqu'à là, ça va comme disait le défenestré du 13me étage en passant devant le 2me)
Ces 3 types de modules sont pourtant différents : Module : Module général (case en haut à gauche, tu n'as que (général) quand tu n'as pas de code)
- Son domaine d'application est Excel : tu peux créer une macro dans un classeur, ouvrir un autre classeur et faire agir ta macro sur l'un ou l'autre des classeur. Feuil : module de classe feuille (case en haut à gauche tu as (Général), mais aussi WorkSheet)
- Son domaine d'application est la feuille, même si on peut "agir" sur d'autres feuilles ThisWorkBook : module de classe WorkBook (Case en haut à gauche (Général), mais aussi WorkBook)
- Son domaine d'application est le classeur
Et tu fais un copier-coller du code à cet endroit (toutes les lignes de "Private Sub...." à "End Sub" incluses)
Je ne sais pas à quoi fait référence ta macro, mais je sais que ce n'est pas une macro tirée d'un module général : le préfixe Private réduit le champ d'action d'une macro (par exemple pour qu'on ne l'utilise que dans le classeur qui la contient-voir l'aide)
Différences entre un module de classe et un module général : Un module de classe appartient à une classe : c'est-à-dire qu'on lui à défini des propriétés par défaut Pour être plus clair
Chaque fois que tu crées une feuille dans Excel, celui-ci crée en même temps un module de classe "Feuille" qui lui est lié :
Dedans sont prédéfinies certaines propriétés exemple les macros :
-WorkSheet_SelectionChange
-WorkSheet_Change etc...
Idem pour les classeur avec ThisWorkBook
-WorkBook_Open
-WorkBook_BeforeClose etc...
Tant que tu n'active pas ces "propriétés", elles ne sont pas active (CQFD).
À chaque action dans Excel, celui-ci va voir les modules de classe et vérifie que l'événement dans Excel ne fait pas l'objet d'un traitement. pour être plus explicite :
Sur la Feuille("F1") tu change la valeur en A1. Quand tu valides par Enter
-Excel regarde s'in existe sur le module de classe F1 une macro WorkSheet_Change. Si elle esiste, il fait une copie de la cellule A1 et lui donne le nom de Target, puis il l'exécute. Après, il passe à l'action suivante
-Excel regarde si dans ThisWorkBook il existe une macro du nom de Workbook_SheetChange. Si elle existe, il fait une copie de la feuille F1 et lui attribue le nom de Sh, il fait une copie de A1 et lui attribue le nom de Target, puis il l'exécute. Après, il passe à l'action suivante.
-Excel t'autorise à bosser
À aucun moment, il ne perd du temps à scruter dans les modules généraux si éventuellement tu pourrais avoir mis une macro qui pourrait avoir pour déclencheur un événement.
C'est pour ça que systèmatiquement, quand j'aide sur une macro événementielle, j'explique comment la créée. Même si après, on l'efface et on met l'intégralité du code avec le nom de la macro.
Pour ton exemple
Dans Excel : Clic-droit sur l'onglet de ta feuille>>Visualiser le code
Partie droite en Haut
Case Gauche (Général) tu sélectionnes WorkSheet
(ça te crée la macro WorkSheet_SelectionChange)
Case de Droite tu sélectionne Change
(ça te crée la macro WorkSheet_Change)
Problème : tu viens de créer une macro à lancement automatique. Une macro à lancement automatique se lance automatiquement quand tu veux, et c'est super, mais aussi quand tu ne veux pas (et c'est moins super : un exemple
Private Sub Worksheet_Change(ByVal Target As Range)
If Range("A1") > 0 then Range("A1") = Range("A1") + 1
End Sub
Pas dur comme macro : si A1 > 0 alors A1 = A1 + 1
Et là, si tu mets 1 en A1, tu te retrouves avec une erreur dépassement de capacité ???
Explication :
A1=1 tu valides => lancement de la macro puisque la feuille à changée =>
A1>0 => VRAI => A1=A1+1(=2) => lancement de la macro puisque la feuille à changée =>
A1>0 => VRAI => A1=A1+1(=3) etc... jusqu'à l'explosion finale
=> Donc, quand j'utilise les macro automatique, je dois interdire que la macro ne se boucle sur elle-même :
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
If Range("A1") > 0 then Range("A1") = Range("A1") + 1
Application.EnableEvents = True
End Sub
Je mets 1 en A1, quand je valides A1=2, et c'est bon, j'ai tout compris, je peux utiliser les macro automatique
Si je mets 5 en A1, Quand je valides, A1=6
Si je mets A => fenêtre de débogage "Erreur d'exécution 13 / Erreur de type"
Ah, oui, peut pas additionner 1 à A, pas grave => Fin
2 en A1 => A1=2 Hein ? idem pour 5, 1, A Mais qu'estce qui se passe-t-il ???
J'ai mis A en A1 => La feuille a changé +lancement de la macro => Application.EnableEvents = False => If Range("A1") > 0 then => Excel détecte une erreur => Prend la main et envoie un message d'erreur et attend => je clique sur OK du message => Excel fait End Sub
à aucun moment l'instruction : Application.EnableEvents = True n'a été exécutée => je n'ai plus de gestion d'erreur et rien pour me le signaler => je dois gérer moi-même les erreurs pour exécuter l'instruction de remise en route des événements
Chez moi, un telle macro sera du genre :
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo Err_Worksheet_Change
Application.EnableEvents = False
If Range("A1") > 0 Then Range("A1") = Range("A1") + 1
Sort_Worksheet_Change:
Application.EnableEvents = True
Exit Sub
Err_Worksheet_Change:
MsgBox (Err.Number & " - " & Err.Description)
Resume Sort_Worksheet_Change
End Sub
en cas d'erreur, excel va à l'adresse Err_Worksheet_Change
- la macro m'avertit que j'ai une erreur
- continue à l'adresse Sort_Worksheet_Change
- Remet en route la gestion des évènements
- finit la macro
Mais il existe autant de manières de traiter les erreurs que de programmeurs (ou de progr-amateurs )
Salut,
je lis les lignes ci-dessus, et je vois un certain nombre d'erreurs ou d'approximations. Voici quelques rectifications à ces erreurs (peut-être pas toutes, parce que j'ai lu en diagonale)
- je lis : Je ne sais pas à quoi fait référence ta macro, mais je sais que ce n'est pas une macro tirée d'un module général : le préfixe Private réduit le champ d'action d'une macro
non, une macro Private peut très bien se retrouver dans un module standard (plutôt que général), mais il est vrai que sa visibilité est alors restreinte à son module d'appartenance.
- je lis : Un module de classe appartient à une classe
en fait, il est plus juste (et plus parlant) de dire qu'un module de classe est utilisé pour définir les propriétés et méthodes d'un objet. Une feuille est un objet, elle a son propre module de classe. Et lorsqu'on définit un nouvel objet, on crée un module de classe.
-Enfin je vois souvent dans les macros événementielles l'instruction Application.EnableEvents = False. Ce n'est pas une façon de faire que je conseille, parce que ce n'est jamais très prudent de désactiver les événements, justement lorsqu'on est dans une macro événementielle. Vos propres lignes de code sont susceptibles de déclencher d'autres événement auxquels vous ne pensez pas et il peut-être très gênant pour le bon fonctionnement de votre programme que ceux-ci soient désactivés.
Alors comment vérifier qu'on aura pas un événement réentrant qui fera tourner notre macro en boucle ? Eh bien, il suffit de mettre une variable booléenne en début de macro pour tester ça :
Dim OnIt As Boolean 'en début de module
'et dans votre macro
If OnIt The Exit Sub
OnIt = True
'vos instructions
'...
'OnIt = False
End Sub
et voilà, ainsi vous ne risquez pas de mettre le bazar dans Excel.
Personnellement, les seules fois où je m'autorise un Application.EnableEvents = False, c'est quand je fais par exemple un SaveAs et que je ne veux pas du message d'alerte si le nom du fichier existe déjà et ma désactivation des messages d'alerte ne concerne alors qu'une, et une seule ligne de code.
Application.EnableEvents = False
ThisWorkbookSaveAs "NouveauNom"
Application.EnableEvents = True
(édition : tiens à la relecture en fait je m'aperçois que je confonds ici Application.EnbleEvents et Application.DisplayAlerts. Donc en fait, je ne me sers pratiquement jamais de cette instruction !)
Toute autre utilisation me semble dangereuse.
J'espère que vous ne prendrez pas mal ces remarques qui ne sont là que pour faire avancer le schmilblick
Ah ben je pensais que bien que mon message s'était perdu dans les dédales des messageries...
Mon mail est accessible partout (sur Vériti ou dans les docs de chacun de mes programmes) : xlti at wanadoo point fr
Ce site utilise des cookies pour personnaliser le contenu, adapter votre expérience et vous garder connecté si vous vous enregistrez.
En continuant à utiliser ce site, vous consentez à notre utilisation de cookies.