COMMENT utiliser un code macro dans excel ??

cephalotus

XLDnaute Occasionnel
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. :confused:



:confused: J'ai bien fait tout cela, mais rien à faire !! Bon, je suis débutant en Excel, mais je sais tout de même lire !!!

Merci par avance pour vos réponses.
 
Dernière édition:

JCGL

XLDnaute Barbatruc
Re : COMMENT utiliser un code macro dans excel ??

Bonjour à tous, Cephalotus,


Jusque ici tu as tout bon...

Mais il faut lancer ta macro...

Trouve toi une macro qui commence par Sub

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 :)
 

Jacques87

XLDnaute Accro
Re : COMMENT utiliser un code macro dans excel ??

Bonsoir,

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

Bon courage
A ta disposition et bonne soirée
 

cephalotus

XLDnaute Occasionnel
Re : COMMENT utiliser un code macro dans excel ??

Re, le forum,

Comment lancer la macro ??

Par exemple, j'ai cette macro comme exemple (retour automatique à la ligne), comment faire ensuite après l'avoir mise dans le module ?




Private Sub Worksheet_Change(ByVal Target As Range)

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




Merci pour vos réponses.
 

Jacques87

XLDnaute Accro
Re : COMMENT utiliser un code macro dans excel ??

Re,

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"

A+
 

cephalotus

XLDnaute Occasionnel
Re : COMMENT utiliser un code macro dans excel ??

Bonsoir Jacques, le forum,

Merci pour ta réponse et tes précisions.

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 !!
 
Dernière édition:

JCGL

XLDnaute Barbatruc
Re : COMMENT utiliser un code macro dans excel ??

Re à tous,

Non Cephalotus cela n'a rien à voir.

Une macro évenementielle peut se déclencher à l'ouverture, à la fermeture d'un fichier ou au changement de valeur d'une feuille.

Trouve toi une macro qui commence par Sub ......() et essaye avec une des méthodes proposées
 
Dernière édition:

Gorfael

XLDnaute Barbatruc
Re : COMMENT utiliser un code macro dans excel ??

cephalotus à dit:
Bonsoir Jacques, le forum,

Merci pour ta réponse et tes précisions.

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 :) )

A+
 

Ti_

Nous a quitté
Repose en paix
Re : COMMENT utiliser un code macro dans excel ??

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
 
Dernière édition:

Jacques87

XLDnaute Accro
Re : COMMENT utiliser un code macro dans excel ??

Bonjour à tous
Bonjour Ti,

désolé de "poluer" ce post, mais comme je n'arrive pas à joindre Ti, je profite de l'occasion en espérant qu'il suit ce post.

Thierry, j'ai essayé de répondre à ta demande , mais il me semble que ma réponse ne te soit pas parvenue.
Mon e-mail est bien
leaemile@orange.fr

Au plaisir de te lire et toutes mes amitiés
 

Ti_

Nous a quitté
Repose en paix
Re : COMMENT utiliser un code macro dans excel ??

salut Jacques

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
 

Discussions similaires