Explication code

Calvus

XLDnaute Barbatruc
Bonjour,

Trouvé sur le forum ce bout de code fait par Pierrot93 . :)

Private Sub CommandButton1_Click()
Shapes("NomImage").Visible = Not Shapes("NomImage").Visible
End Sub

ici :https://www.excel-downloads.com/threads/afficher-cacher-image-excel.124413/

Alors 3 questions svp.
Pourquoi Private sub, et non pas Sub seulement, puisqu'en en testant les 2 fonctionnent. Y a t'il une différence importante ? J'ai encore beaucoup de mal avec ces notions, déclarations...etc.

Impossible de faire fonctionner ce code dans un module ? Pourquoi ?

Et enfin, est ce une propriété particulière de ce bouton que de dire XX.Visible = Not XX.Visible ? Dur dur pour la logique :p

Merci
 

Pierrot93

XLDnaute Barbatruc
Re : Explication code

Bonjour,

Pourquoi Private sub, et non pas Sub seulement, puisqu'en en testant les 2 fonctionnent. Y a t'il une différence importante ? J'ai encore beaucoup de mal avec ces notions, déclarations...etc.

"private" option par défaut.... la difference est qu'en l'état, cette procédure ne peut être appelé d'un autre module...

Impossible de faire fonctionner ce code dans un module ? Pourquoi ?

en l'état le code s'applique aux objets de la feuille en question... pour le faire fonctionner dans un autre modue, préciser la feuille...

Code:
Sheets("NomFeuille").Shapes("NomImage").Visible = Not Sheets("NomFeuille").Shapes("NomImage").Visible

Et enfin, est ce une propriété particulière de ce bouton que de dire XX.Visible = Not XX.Visible ? Dur dur pour la logique

non pas une propriété particulière... c'est la propriété "visible" de l'objet.... retourne une valeur de type "booleen"... applique le contraire de l'état actuel...

bonne journée
@+
 

Papou-net

XLDnaute Barbatruc
Re : Explication code

Bonjour Calvus,

- Private Sub est créé automatiquement par VBE. Sub est équivalent car, en dehors de tout préfixe, il est considéré comme local dans le module de code.

- Pour faire fonctionner ce code dans un module, il faut le transférer dans un module de code et l'insérer dans un Sub que tu nommeras selon ton désir. Il faut ensuite faire appel à cette macro dans le code du bouton. Ex :

Code:
Private Sub CommandButton1_Click()
Call MaMacro
End Sub

Sub MaMacro
Feuil1.Shapes("NomImage").Visible = Not Shapes("NomImage").Visible
End Sub

Ne pas oublier de spécifier le contenant du Shape, Feuil1 dans mon exemple.

- Enfin, Shapes... = Not Shapes... inverse l'état Visible de la forme : si elle est visible elle devient masquée et inversement. Ca représente une contraction d'une condition If Then, tout simplement.

Espérant avoir répondu.

Cordialement.

Edit : oups ! Salut Pierrot, je me doutais bien que tu allais répondre à notre ami si tu étais connecté.
 

Calvus

XLDnaute Barbatruc
Re : Explication code

Bonjour Pierrot :) ,

Merci, je vais digérer tes réponses.

Concernant la 1ère, c'est assez flou pour moi. je viens de faire un test car j'ai cru comprendre à ta réponse que seules les instructions Sub permettaient l'appel depuis une autre fonction.
Mais ça marche avec Private sub également. Qu'ai je loupé ?

Avec Private

Code:
Private Sub CommandButton1_Click()
Sheets("feuil2").Visible = Not Sheets("feuil2").Visible
End Sub


Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Range("a3") = "za" Then
CommandButton1_Click

End If
End Sub

Sans

Code:
Sub CommandButton1_Click()
Sheets("feuil2").Visible = Not Sheets("feuil2").Visible
End Sub


Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Range("a3") = "za" Then
CommandButton1_Click

End If
End Sub

Merci
 

Pierrot93

XLDnaute Barbatruc
Re : Explication code

Re, bonjour Papou

Concernant la 1ère, c'est assez flou pour moi. je viens de faire un test car j'ai cru comprendre à ta réponse que seules les instructions Sub permettaient l'appel depuis une autre fonction.
Mais ça marche avec Private sub également. Qu'ai je loupé ?

c'est si une procédure private dans un module, tu ne pourra pas l'appeler d'un autre module, mais aucun souci, si présente dans le même module...
 

Dranreb

XLDnaute Barbatruc
Re : Explication code

Boujour.
Il y a une notion qui n'est pas éclaircie pour notre ami, me semble t-il, c'est que ce sont des procédures évènements.
Ce qui veut dire qu'elle sont invoquées par un gestionnaire d'évènements des objets et non, en principe, par du code VBA.
Voilà pourquoi elles paraissent à première vue déclenchées par quelque chose d’extérieur au module alors qu'elles sont pourtant Private.
Lorsqu'on examine la pile d'appels lors d'un arrêt on a parfois dans la liste des lignes "(code non visual basic)" lorsqu'une instruction d'une procédure évènement a provoqué l'éxécution d'une autre procédure évènement.
Le Private ou Public ne définit que la visibilité de la Sub en tant que procédure normale. Il n'a pas d'incidence sur son déclenchement en tant que procédure évènement.
Cordialement.
 

Calvus

XLDnaute Barbatruc
Re : Explication code

Bonsoir,

Merci Dranreb , encore des éclaircissements... enfin pas vraiment :( :eek:

Ce qui veut dire qu'elle sont invoquées par un gestionnaire d'évènements des objets et non, en principe, par du code VBA.

C'est à dire utiliser un bouton par exemple, ou encore ce qu'on appelle un useform ?

Lorsqu'on examine la pile d'appels lors d'un arrêt on a parfois dans la liste des lignes "(code non visual basic)" lorsqu'une instruction d'une procédure évènement a provoqué l'éxécution d'une autre procédure évènement.

Là, je suis complètement largué, malgré mes recherches.

Le Private ou Public ne définit que la visibilité de la Sub en tant que procédure normale. Il n'a pas d'incidence sur son déclenchement en tant que procédure évènement.

Je crois comprendre, je dis bien je crois seulement (il est tard !), mais alors pourquoi utilise t-on l'une plutôt que l'autre. Qu'est ce qui va inciter notre choix ?

Merci, je suis peut être un peu long à la comprenette, mais c'est assez lourd à digérer au début.

A+
 
Dernière édition:

Grand Chaman Excel

XLDnaute Impliqué
Re : Explication code

Bonsoir Calvus,

Voici en mes mots quelques explications complémentaires... Une SUB peut être déclarée :
- Private (cachée des autres modules)
- Public (visible dans les autres modules)
- rien du tout : donc public par défaut et visible dans les autres modules.

Si tu as une SUB appelée Test1 déclarée Private dans le Module1, celle-ci ne sera pas visible dans les autres modules. Donc si tu as un SUB dans le module2 qui essaie d'appeler Test1, ça ne va pas marcher.
Par contre Test1 pourra être appelée par les autres SUB contenues dans Module1.

Par contre si ta SUB est déclarée Public, elle peut être appelée par n'importe quel module.

L'avantage de déclarer une SUB comme Private est lorsque tu as plusieurs modules et que chacun à une fonction particulière. Tu peux ainsi "encapsuler" certains SUB à des modules précis. Ça peut être pratique quand tu as un très long code avec plusieurs SUB.

Aussi les SUB qui sont Private ne sont pas visible dans Excel dans le gestionnaire des macros (Développeur | Macro). Ça peut servir quand tu veux cacher certains SUB aux utilisateurs.

Lorsque tu as un objet, comme par exemple un bouton dans un formulaire, on a alors des "événements" (exemple _Click) et ces SUB sont toujours Private car elles ne peut être appelée que par l'objet lui-même qui fait partie du formulaire. Tu ne peux pas appeler "CommandButton1_Click" à partir d'une autre SUB contenue dans un autre module par exemple.

Ouf pas facile à expliquer.

Regarde le fichier joint. Le bouton ouvre le formulaire et chaque bouton appelle une Sub Test1, Test1a et Test1b. Chacune étant déclarée Private, Public ou rien du tout. Regarde le code, ça devrait t'aider à comprendre... (j'espère)

A+
 

Pièces jointes

  • Exemple.xlsm
    20.9 KB · Affichages: 20
  • Exemple.xlsm
    20.9 KB · Affichages: 29
  • Exemple.xlsm
    20.9 KB · Affichages: 19

Calvus

XLDnaute Barbatruc
Re : Explication code

Bonjour à tous,

Grand Chaman Excel Merci ! :)

C'est enfin clair, et ton fichier ainsi que ta réponse m'ont permis de comprendre les explications fournies par Dranreb, Pierrot et Papou.
Je vais pouvoir tester et m'exercer à souhait.

J'ai des questions plein la tête, que je poserai certainement sur ce fil puisqu'il s'agit toujours de code et de procédures ( je commence même à utiliser le vocabulaire des pros ! ;) )

Merci à tous les 4 pour vos réponses, et Excel_lente journée à tous.
 

eriiic

XLDnaute Barbatruc
Re : Explication code

Bonjour à tous

Petit complément sur Private Sub :
Même s'il n'y a qu'un seul module, la déclarer Private évite également qu'elle s'affiche dans la liste des macros appelée par le menu 'outils / macros' à partir du classeur.
Allège cette liste et surtout évite des erreurs de manipulation si la procédure ne doit être appelée que d'une autre et non directement par l'utilisateur.

eric
 

Calvus

XLDnaute Barbatruc
Re : Explication code

Merci Eric,

Cela semble répondre à une question que j'allais poser à Grand Chamane,

Aussi les SUB qui sont Private ne sont pas visible dans Excel dans le gestionnaire des macros (Développeur | Macro). Ça peut servir quand tu veux cacher certains SUB aux utilisateurs.

Est ce cela que ça veut dire ?
Ou ça peut encore correspondre à autre choses?

Merci
 

Discussions similaires