VBA – Private und öffentliche Prozeduren (Subs und Funktionen)
In this Article
In diesem Tutorial erklären wir Ihnen den Unterschied zwischen öffentlichen und privaten Deklarationen in VBA und wie Sie Module als privat definieren können.
Öffentliche im Vergleich zu privaten Unterprozeduren
Prozeduren (Subs und Funktionen) können in VBA entweder als privat oder öffentlich deklariert werden. Wenn sie öffentlich sind, können Sie sie im Excel-Makrofenster sehen und sie können von überall in Ihrem VBA-Projekt aufgerufen werden. Wenn sie privat sind, sind sie im Excel-Makrofenster nicht sichtbar und können nur innerhalb des Moduls, in dem sie deklariert wurden, mit normalen Methoden verwendet werden (für den Zugriff auf private Prozeduren aus anderen Modulen siehe unten in diesem Artikel).
Öffentliche Funktionen können wie integrierte Excel-Funktionen im Excel-Arbeitsblatt aufgerufen werden.
Hinweis: Variablen und Konstanten können ebenfalls öffentlich oder privat sein.
Excel-Makrofenster
Standardmäßig sind Excel-Makros (die meisten VBA-Prozeduren) für die Benutzer der Arbeitsmappe im Makrofenster sichtbar:
Diese werden als öffentliche Prozeduren betrachtet. Sie können Prozeduren ausdrücklich als öffentlich definieren, indem Sie „Public“ vor der Sub-Anweisung hinzufügen:
Public Sub HalloWelt()
MsgBox "Hallo Welt"
End Sub
Wenn Sie die Prozedur nicht als öffentlich definieren, wird sie als öffentlich angesehen.
Um eine Prozedur als privat zu deklarieren, fügen Sie einfach „Private“ vor die Sub-Anweisung der Prozedur:
Private Sub HalloJedermann()
MsgBox "Hallo jedermann"
End Sub
Die zweite Prozedur wäre für Excel-Benutzer im Makrofenster nicht sichtbar, kann aber dennoch in Ihrem VBA-Code verwendet werden.
Prozeduren mit Argumenten
Unterprozeduren können Argumente haben. Argumente sind Eingaben für die Unterprozedur:
Sub Hallo(strName as string)
MsgBox "Hallo " & strName
End Sub
Wenn eine Unterprozedur Argumente hat, wird sie nie im Makrofenster erscheinen, unabhängig davon, ob sie als öffentlich deklariert ist, da es keine Möglichkeit gibt, die Argumente zu definieren.
Funktionen werden ebenfalls nie im Makrofenster erscheinen, unabhängig davon, ob sie als öffentlich deklariert sind.
Öffentliche Funktionen können in Excel direkt in einem Arbeitsblatt als „Benutzerdefinierte Funktion“ (BDF) verwendet werden. Dabei handelt es sich im Grunde um eine benutzerdefinierte Formel, die direkt in einem Arbeitsblatt aufgerufen werden kann. Sie sind in der Kategorie „Benutzerdefiniert“ im Fenster „Funktion einfügen“ zu finden oder können direkt in eine Zelle eingegeben werden.
Verwendung von Prozeduren zwischen Modulen in Ihrem VBA-Projekt
Öffentliche Prozeduren können von jedem Modul oder Formular innerhalb Ihres VBA-Projekts aufgerufen werden.
Der Versuch, eine private Prozedur von einem anderen Modul aus aufzurufen, führt zu einem Fehler (Hinweis: siehe eine Umgehungslösung unten in diesem Artikel).
Hinweis: Öffentliche Prozeduren und Variablen in Klassenmodulen verhalten sich etwas anders und werden in diesem Artikel nicht behandelt.
Verschiedene Module können Prozeduren mit demselben Namen speichern, sofern sie beide privat sind.
Wenn zwei oder mehr Prozeduren denselben Namen haben und als öffentlich deklariert sind, erhalten Sie beim Ausführen des Codes einen Kompilierfehler mit der Meldung „Mehrdeutiger Name“.
Private Module
Standardmäßig sind die Module öffentlich.
Um ein Modul privat zu machen, setzen Sie das folgende Schlüsselwort an den Anfang des Moduls.
Option Private Module
Wenn Sie ein Modul als privat deklarieren, sind alle Prozeduren im Modul für Excel-Benutzer nicht sichtbar. Funktionsprozeduren erscheinen nicht im Fenster „Funktion einfügen“, können aber dennoch im Excel-Blatt verwendet werden, solange der Benutzer den Namen der Funktion kennt!
Unterprozeduren (Subs) erscheinen nicht im Makrofenster, können aber dennoch im VBA-Projekt verwendet werden.
Zugriff auf eine private Prozedur aus einem anderen Modul
Wie bereits erwähnt, kann auf private Prozeduren in anderen Codemodulen nicht mit „normalen“ Methoden zugegriffen werden. Sie können jedoch auf private Prozeduren zugreifen, indem Sie den in VBA verfügbaren Befehl Application.Run verwenden.
Betrachten Sie die folgenden 3 Module.
Modul2 ist ein privates Modul mit einer öffentlichen Unterprozedur, während Modul3 ein öffentliches Modul mit einer privaten Unterprozedur ist.
In Modul1 können wir HalloWelt aufrufen. Die Option Private Module am oberen Rand hindert uns nicht daran, die Sub aufzurufen, denn sie dient lediglich dazu, die Sub im Makrofenster auszublenden.
Wir brauchen auch die Call-Anweisung nicht, denn sie dient nur dazu, den Code leichter lesbar zu machen.
Der Code könnte auch wie folgt aussehen:
Sub HallovonPrivatAufrufen()
'eine Sub aus einem privaten Modul aufrufen
HalloWelt
End Sub
Wir können die Sub HalloWelt auch mit dem VBA-Befehl Application.Run ausführen.
In Modul3 wurde die Sub GutenMorgenWelt jedoch als privat deklariert. Sie können sie nicht von einem anderen Modul aus mit „normalen“ Mitteln, d.h. der Call-Anweisung, aufrufen.
Sie müssen den Befehl Application.RunCommand verwenden, um eine private Unterprozedur von einem anderen Modul aus auszuführen.
Sub GutenMorgenAufrufen()
'eine private Sub von einem öffentlichen aus Modul ausführen
Application.Run ("GutenMorgenWelt")
End Sub
Wenn Sie den Befehl Application.RunCommand verwenden, müssen Sie den Namen der Unterprozedur in Anführungszeichen setzen.
Wenn wir versuchen, die Anweisung Call zu verwenden, um die Unterprozedur GutenMorgenWelt auszuführen, würde ein Fehler auftreten.