Meilleure réponse
Les sous-programmes ont une plage de visibilité. Dans VBA, un Sub Public est accessible ( appelé ) à partir de nimporte quel module de code. Un Private Sub ne peut être appelé quà partir du module dans lequel il réside.
Ce concept est nommé Scope. Les objets et les variables ont également une portée .
Il y a une courte introduction ici: Comprendre létendue et la visibilité
Nous rendons un sous-privé quand nous savons que rien en dehors du module actuel ne devrait jamais faire ce pour quoi ce code est conçu; nous construisons quelque chose de spécifique à la tâche et au contexte. Dun autre côté, nous devrions réfléchir sérieusement lorsque nous rendons un sous-public public.
Lorsque vous écrivez VBA pour des utilisateurs autres que vous-même, vous ne voulez probablement pas quils appellent votre code directement. Tout Public Sub, à condition quil nait pas de paramètres, est visible dans la liste «Macro» des utilisateurs. (Alt-F8)
Cacher les abonnés publics à lutilisateur (devrait) se charger de lui-même; quand vous appelez un Sub dans un autre module, vous devez généralement lui dire ce quil doit savoir en lui passant les paramètres appropriés, et les Public Subs avec des paramètres napparaissent pas dans la liste de lutilisateur.
Mais parfois cest pratique davoir un utilitaire Sub qui peut être appelé de nimporte où et qui ne nécessite pas de paramètres; dire à partir dun bouton dans une feuille de calcul qui appelle le code de démarrage dans un module public. Vous ne voulez PAS que votre module de démarrage soit visible par les utilisateurs.
Alors, donnez à votre sous-marin un paramètre que vous nutilisez jamais. Mieux encore, donnez-lui un paramètre que vous navez besoin pas de mentionner. Voir le paramètre facultatif dans le troisième sous-marin ci-dessous.
Option Explicit
Sub Visible()
" Can call this guy from anywhere;
" from any module or directly by the user.
" Sub (on it"s own) is lazy shorthand for "Public Sub"
Invisible
End Sub
Private Sub Invisible()
" This Sub can ONLY be called from inside its module.
" It is not shown in the Macro list available to the user.
Tricksy
End Sub
Public Sub Tricksy(Optional pIgnore As Boolean = True)
" This sub can be called from anywhere.
" It does not require a parameter (pIgnore).
" BUT, because it has a parameter, it does not appear
" in the user"s list of available "macros".
MsgBox "Hi there", vbExclamation, "Greetings from Tricksy"
End Sub
Lutilisateur peut voir et appeler sub Visible . Seul le code du même module peut appeler sub Invisible . Tricksy peut être appelé de nimporte où et ne nécessite pas de paramètre, mais lutilisateur ne peut pas le «voir».
Appel de Visible donne:
Lors du débogage, vous pouvez appeler les abonnés publics à partir de la fenêtre immédiate et vous pouvez le faire à tout moment lorsque le code nest pas déjà en cours dexécution.
Mais vous ne pouvez appeler les abonnés privés à partir de la fenêtre immédiate que lorsque vous avez atteint un point darrêt ou fait une pause quelque part dans son module hôte .
Answer
Private et (Public) Sub sont utilisés pour déclarer la portée dune routine .
Private Sub: fait que la routine ne peut être appelée que dans le même module par une autre routine.
Supposons que vous ayez un module appelé Module A et que dans ce module vous avez deux routines appelées:
- Private Sub Hello\_World ()
- Sous-message ()
Public Sub Message()
Call Hello\_World()
End Sub
Private Sub Hello\_World()
MsgBox “Hello World”
End Sub
La routine Message appelée Hello\_World . Cela a été possible car les deux routines étaient dans le même module (module A).
Disons que vous avez Module B avec la routine suivante :
Sub Message2()
Call Hello\_World()
End Sub
Cela renverra une erreur de compilation: « Sub or Function not defined ».
Pourquoi?
Parce quil appelait une routine privée ( Hello\_World ) dun autre module. Impossible.
Public Sub: votre routine peut également être appelée par dautres routines dans différents modules. Toutes les routines sont publiques par défaut, il nest donc pas nécessaire de déclarer le monde «public» avant. Juste le Sub suffit.
Sub ThisIsEnough()