VBA Gültigkeitsbereich Prozeduren(Modul/Userform)

Hi,

eine Public Sub kann auf Modulebene modulübergreifend verwendet werden. Trifft es zu, daß auf eine Public Sub, die in einer Userform geschrieben ist, nicht aus einem Modul (und umgekehrt) zugegriffen werden kann? Wenn das nicht möglich ist, gibt es ein workaround?

Gruß Wilhelm

Hallo, Wilhelm!

eine Public Sub kann auf Modulebene modulübergreifend
verwendet werden. Trifft es zu, daß auf eine Public Sub, die
in einer Userform geschrieben ist, nicht aus einem Modul (und
umgekehrt) zugegriffen werden kann?

Eigentlich nicht. Nur kann die Funktion nicht direkt aufgerufen werden, sondern muss mit dem UserForm-Namen referenziert werden.

Wenn also z. B. die defaultmäßig Private Sub CommandButton1_Click überschrieben als Public Sub CommandButton1_Click definiert wird, kann auch aus einem Modul mit Call UserForm1.CommandButton1_Click diese Funktion aufgerufen werden.

Der Aufruf einer Public Sub aus einem globalen Modul aus einer UserForm heraus ist auch ohne die Nennung des Moduls möglich.

Gruß, Manfred

Hallo Manfred,
als ich Deinen Beitrag gelesen hatte, fiel mir sofort ein, daß ich das alles schon mal gewußt aber vergessen habe, herzlichen Dank.

Was ist ein g l o b a l e s Modul?
Und was ist eine Klasse, Bücher lesen hat bisher nicht geholfen.

Gruß
Wilhelm

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Wilhelm!

als ich Deinen Beitrag gelesen hatte, fiel mir sofort ein, daß
ich das alles schon mal gewußt aber vergessen habe, herzlichen
Dank.

Da nich’ für.

Was ist ein g l o b a l e s Modul?

Wenn Du unter VBA Code in ein Formular packst (z. B. die Reaktion auf einen Klick auf eine Schaltfläche), dann landet der in einem Formularmodul. Generell ist erst mal alles in diesem Modul nur in diesem Modul sichtbar. Wenn die Funktionen wie beschrieben als Public deklariert sind, können sie jedoch mit der Referenzierung des zugehörigen Formular-Modulnamens aufgerufen werden.

Du hast in Deinem Projektexplorer ja diverse Formulare/UserForms. Und dann gibt es noch eine Kategorie „Module“. Dies sind die globalen Module. In diese sollten Funktionen geschrieben werden, die vom „umgebenden“ Formular unabhängig sind und auch in anderen Formularen oder Zusammenhängen verwendet werden oder verwendet werden könnten.

Als Beispiel: Im Formularmodul sollten i. d. R. nur die Ereignisroutinen stehen, die die Benutzerinteraktion steuern. Eine Funktion, die Dir z. B. anhand zweier Werte „Betrag“ und „MwSt-Satz“ den Gesamtbetrag ausrechnet, ist jedoch nicht nur in einem Formular „Rechnungserstellung“ verwendbar, sondern auch in „EingangsrechnungErfassen“ und überall sonst in einer Büro- undLagerverwaltung sinnvoll und gültig. Daher kommt diese Funktion in ein globals Modul, muss nur an einer Stelle gepflegt werden, kann aber von jeder Stelle aus aufgerufen werden.

Und was ist eine Klasse, Bücher lesen hat bisher nicht
geholfen.

Da reißen wir die Objektorientierung an. Ein Modul kennt ja i. d. R. nur Funktionen, Prozeduren und globale Variablen. Diese haben zunächst mal recht atomare Typen (div. Zahlen wie Long, Integer, Strings etc.). Ein wenig komplexere Typen kann man sich selbst bauen mit dem Type-Konstrukt. Diese Typen haben bestimmte „Attribute“; man könnte sich einen Typ „ADRESSE“ definieren, bestehend aus einem String für Strasse, PLZ und Ort. Dieser Typ wäre schon einmal ein wenig aussagekräftiger (und vor allem zusammengehörend) als drei getrennte Variablen.

Geht man jetzt noch einen Schritt weiter, kann man so was auch in Klassen kapseln, die neben Attributen auch noch „Methoden“ (quasi Funktionen und Prozeduren) haben, die das Arbeiten mit dem neuen „Objekt“ ermöglichen.

Das so als ganz kurzer Einstieg… Zur weiteren Suche müsstest Du Dich mit Objektorientierung genauer auseinandersetzen.

Gruß, Manfred

1 Like

Hi Manfred,
Du hast Dir wirklich viel Mühe mit mir gegeben! Dafür gilt Dir erneut mein ganz herzlicher Dank. Für mich interessant war, daß ich das, was Du erklärend geschildert hast, eigentlich mit try and error bei meinen Programmen tatsächlich richtig gemacht habe, etwa nach der Parole: „Der Architekt weiß, wie es geht, kann es aber nicht. Der Polier weiß nicht, wie es geht, kann es aber trotzdem“. Hoffentlich stoße ich bei zukünfigen Fragen wieder einmal auf Deinen Wissensschatz.
Gruß Wilhelm

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]