Beste Antwort
Unterprogramme haben eine Reihe von Sichtbarkeiten. In VBA kann von jedem Codemodul aus auf ein öffentliches Sub zugegriffen werden ( heißt ) . Ein privates Sub kann nur von dem Modul aufgerufen werden, in dem es sich befindet.
Dieses Konzept heißt Gültigkeitsbereich. Objekte und Variablen haben ebenfalls Gültigkeitsbereich
Hier gibt es ein kurzes Intro: Umfang und Sichtbarkeit verstehen
Wir machen ein Sub privat, wenn wir es wissen dass nichts außerhalb des aktuellen Moduls jemals das tun sollte, wofür dieser Code entwickelt wurde; Wir bauen etwas aufgaben- und kontextspezifisches. Auf der anderen Seite sollten wir uns überlegen, wann wir ein Sub öffentlich machen.
Wenn Sie VBA für andere Benutzer als Sie selbst schreiben, möchten Sie wahrscheinlich nicht, dass sie Ihren Code direkt aufrufen. Jedes öffentliche Sub, sofern es keine Parameter enthält, wird in der Benutzerliste „Makro“ angezeigt. (Alt-F8)
Das Ausblenden öffentlicher Subs vor dem Benutzer (sollte) normalerweise für sich selbst sorgen; Wenn Sie ein Sub in einem anderen Modul aufrufen, müssen Sie ihm im Allgemeinen mitteilen, was es wissen muss, indem Sie ihm die entsprechenden Parameter übergeben. Öffentliche Subs mit Parametern werden nicht in der Benutzerliste angezeigt.
Aber manchmal Es ist praktisch, ein Dienstprogramm Sub zu haben, das von überall aufgerufen werden kann und keine Parameter erfordert. Sagen wir von einer Schaltfläche in einem Arbeitsblatt, die den Startcode in einem öffentlichen Modul aufruft. Sie möchten NICHT, dass Ihr Startmodul für Benutzer sichtbar ist.
Geben Sie Ihrem Sub also einen Parameter, den Sie niemals verwenden. Geben Sie noch besser einen Parameter ein, den Sie nicht erwähnen müssen. Siehe den optionalen Parameter im dritten Unterabschnitt unten.
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
Der Benutzer kann sub Sichtbar . Nur Code im selben Modul kann sub Invisible aufrufen. Tricksy kann von überall aufgerufen werden und erfordert keinen Parameter, aber der Benutzer kann ihn nicht „sehen“.
Aufruf von Sichtbar führt zu:
Beim Debuggen können Sie öffentliche Subs aufrufen Sie können dies jederzeit tun, wenn der Code noch nicht ausgeführt wird.
Sie können Private Subs jedoch nur dann über das Sofortfenster aufrufen, wenn Sie einen Haltepunkt erreicht oder irgendwo in seinem Hostmodul angehalten haben
Antwort
Private und (öffentliche) Sub werden verwendet, um den Umfang einer Routine zu deklarieren
Private Sub: bewirkt, dass die Routine nur von einer anderen Routine innerhalb desselben Moduls aufgerufen werden kann.
Angenommen, Sie haben ein Modul mit dem Namen Modul A und innerhalb dieses Moduls haben Sie zwei Routinen mit dem Namen:
- Private Sub Hello\_World ()
- Subnachricht ()
Public Sub Message()
Call Hello\_World()
End Sub
Private Sub Hello\_World()
MsgBox “Hello World”
End Sub
Die Nachrichtenroutine mit dem Namen Hello\_World . Dies war möglich, weil sich beide Routinen im selben Modul befanden (Modul A).
Angenommen, Sie haben Modul B mit der folgenden Routine :
Sub Message2()
Call Hello\_World()
End Sub
Dies gibt einen Kompilierungsfehler zurück: „Sub oder Funktion nicht definiert“.
Warum?
Weil aufgerufen wurde Eine private Routine ( Hello\_World ) aus einem anderen Modul. Nicht möglich.
Öffentliches Sub: Ihre Routine kann auch von anderen Routinen in verschiedenen Modulen aufgerufen werden. Alle Routinen sind standardmäßig öffentlich, daher ist es nicht erforderlich, die Welt zuvor als „öffentlich“ zu deklarieren. Nur das Sub ist genug.
Sub ThisIsEnough()