Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Variable Public deklarieren

Variable Public deklarieren
19.08.2017 21:57:55
Jonas
Hallo Leute,
habe eine dumme Frage. Ist es richtig, wenn ich eine Variable bei Public deklariere muss ich sie nirgend anders mehr deklarieren?
Mach das sinn?
Anzeige

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Variable Public deklarieren
19.08.2017 22:06:01
Sepp
Hallo Jonas,
wenn du sie als Public deklarierst, ist sie im gesamten Projekt verfügbar.
Du solltest aber nur dann Public Variablen verwenden, wenn u sie auch wirklich benötigst.
Gruß Sepp

Anzeige
AW: Variable Public deklarieren
19.08.2017 22:22:19
Jonas
Danke Sepp.
Ich habe zum Beispiel eine Datei mit
Set wksdatei = Workbooks("Datei.xls")
beim Start von Excel Deklariert und dann
Dim wksdatei as Worksbook
Dutzendfach in den Makros. Also immer wenn ich auf die Datei zugreife.
Würde es da sinn machen?
Gruß
Jonas
Anzeige
AW: Variable Public deklarieren
19.08.2017 22:40:57
Sepp
Hallo Jonas,
das kann Sinn machen, allerings solltest du die in jeder prozedur versichern, das die Variable auch initialisiert ist.
' **********************************************************************
' Modul: DieseArbeitsmappe Typ: Element der Mappe(Sheet, Workbook, ...)
' **********************************************************************

Option Explicit

Private Sub Workbook_Open()
Call init
End Sub

' **********************************************************************
' Modul: Modul1 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Public objWB As Workbook

Sub init()
Set objWB = Workbooks.Open("E:\Forum\test.xlsx")
End Sub


Sub einMakro()

If objWB Is Nothing Then Call init

'dein Code

End Sub

Sub anderesMakro()

If objWB Is Nothing Then Call init

'dein Code

End Sub

Gruß Sepp

Anzeige
AW: Variable Public deklarieren
20.08.2017 16:12:56
Piet
Hallo Jonas,
Set wksdatei = Workbooks("Datei.xls")
ich weise dich hölich auf eine 2. Deklaration hin die hier Sinn macht und von mir dann benutzt wird.
Const und Public Variable lege ich gerne in einem extra Modul fest, wo nur solche Daten drin stehen! Gültig für alle Module! Der Vorteil ist, man kann sich alle wichtigen Adressen um z.b. Bereich zu löschen oder Daten einzufügen, Adressen zum Kopieren, Sortieren, in dieses Modul schreiben, braucht sie nicht im Projekt zu suchen. Und wenn sich Werte/Adressen aendern gehst du nur ins "Public_modul" und aenderst es dort! Gerade beim Programm entwickeln ein grosser Vorteil. Zu Bedenken ist das der Wert dieser Variablen bei Makro Ende nicht automatisch gelöscht wird!! Rufst du mit Public Variable ein anderes Programm auf übernimmt es die gespeicherten Werte!
Public Const WbEx = "Datei.xls"
Public Const Bereich1 = "G1:K150"
Public wksdatei As Workshet
im Modul so deklariert: - Set wksdatei = Workbooks(WbEx) - Hast du diese Set Anweisung einmal programmiert sollte dieser Wert für alle anderen Module gültig sein. Manchmal setze ich solche Variable bei Open Workbook auf definierte Werte. Einfach mal selbst testen wie es funktioniert.
mfg Piet
Anzeige
@ Sepp
20.08.2017 21:27:57
Zwenn
Hallo Sepp,
nachdem ich bisher schon so einige Deiner Tipps und Lösungen gelesen habe, habe ich wirklich Respekt vor Deinem Wiseen. Aber grade vor diesem Hintergrund, erlaube mir die Frage ... Hältst Du globale Variablen ernsthaft für sinnvoll?
Ich persönlich halte sie für kontraproduktiv. Sie zerstören den Sinn der strukturierten Programmierung. Klar ist VBA eine objektorientierte Sprache und Klassenvariablen sind natürlich sinnvoll. Aber praktisch niemand verwendet VBA objektorientiert. Insofern frage ich mich, wie sinnvoll ein eigenes Modul für globale Variablen ist.
Stichworte "Wiederverwendung von Code" und "Information Hiding". Oder der einfachen Devise folgend: "So lokal wie möglich, so global wie nötig."
Diese Diskussion keimte bereits einmal mit Luc auf. Mich interessiert Deine Meinug dazu.
Viele Grüße,
Zwenn
Anzeige
AW: @ Sepp
20.08.2017 21:34:08
Sepp
Hallo Zwenn,
das habe ich in meiner ersten Antwort ja schon beantwortet.
"Du solltest aber nur dann Public Variablen verwenden, wenn du sie auch wirklich benötigst."
Und genau so halte ich es auch, also nur dann, wenn man einen greifbaren Vorteil daraus zieht.
Gruß Sepp

Anzeige
AW: @ Sepp
20.08.2017 21:44:36
Zwenn
Hmm,
also ich habe mal gelernt, es gibt keinen Grund für globale Variablen. Es lässt sich auch alles mit lokalen Variablen lösen. Variablen werden einfach als Funktions-Parameter weitergegeben. Allerdings komme ich von C, daher meine Frage :-)
Danke für Deine Antwort.
Viele Grüße,
Zwenn
Anzeige
AW: @ Sepp
20.08.2017 21:51:55
Uduuh
Hallo,
Aber praktisch niemand verwendet VBA objektorientiert.
dann bin ich praktisch niemand ;-)
Globale Var können durchaus einen Sinn haben. Ich habe z.B. etliche Projekte mit globalen Dictionary-Objekten, die ich einmal fülle und dann in allen Modulen/Prozeduren verwende.
Gruß aus’m Pott
Udo

Anzeige
AW: @ Sepp
20.08.2017 22:01:49
Zwenn
Ok,
natürlich gibt es Leute, die die Objektorientierung nutzen. Aber Du wirst mir Recht geben, wenn ich sage, das sind die wenigsten derer, die VBA verwenden. Ich wollte Entwicklern wie Dir ja auch gar nicht zu nahe treten :-)
Wenn Du sagst, Du nutzt globale Dictionaries und gleichzeitig, Du programmierst obejktorientiert ... Nutzt Du Objektorientierung konsequent? Dann gäbe es ja im Sinne der strukturierten Programmierung gar keine globalen Variablen.
Viele Grüße,
Zwenn
Anzeige
Jeder der Objekte verwendet, pgmmiert letztlich …
21.08.2017 15:22:25
Luc:-?
…objektorientiert, Zwenn,
aber auch Objekte (auch Dictionary-Objekte!) kann man von Prozedur zu Prozedur weiterreichen und dabei immer neue, prozedur­interne Referenzen auf die­selben anlegen. Wenn ich globale Variablen verwende, dienen diese oft strukturordnenden Aufgaben (Übersichtlichkeit!) eines GesamtProjekts und sind idR keine Objekt­Referenzen, sondern eher identifizierende, nicht objektbildende Eigenschaften dersel­ben (zB .Name). Ansonsten verwende ich häufig globale Konstanten wie Enumerationen (→ projektweit sinn­voll!). Hinzu kommen dann auch GlobalVariablen in (Dok-)Klassen­Modulen, die so auch per CallByName Objekten zuordenbar sind, was für GlobalVariablen in allgemeinen Modulen nicht möglich ist.
🙈 🙉 🙊 🐵 Gruß, Luc :-?
Besser informiert mit …
Anzeige
AW: Jeder der Objekte verwendet, pgmmiert letztlich …
24.08.2017 18:41:28
Zwenn
Hallo Luc,
nun komme ich erst heute dazu dir für Deine Antwort zu danken.
Was Du schreibst kann ich nachvollziehen und mir sind diese Mechanismen auch klar. Ich wundere mich nur, dass es anscheinend für alle ganz selbstverständlich ist, unter VBA globale Variablen zu verwenden. Ich persönlich sehe darin absolut keinen Vorteil und kann mich mit einer Information, die auch Programmteilen bekannt ist, die sie nix angehen, einfach nicht anfreunden. Aber es ist ja kein Beinbruch, wenn jeder auf seine Weise klar kommt.
Mit dem konsequent objektorientierten Programmieren hatte ich gemeint, dass die strukturierte Programmierung wirklich außen vor bleibt. So passiert das in Java quasi automatisch. Naja, außer man kommt auf die Idee, alles in der Main-Methode abzuhandeln oder für jede Klasse die Instanzierung abzuschalten ;-) Ob das in VBA aber überhaupt möglich ist weiß ich nicht. Vermutlich ist es auf jeden Fall nicht sinnvoll, weil die objektorientierung vor allem für die Excel-Elemente (Zellen, Tabellenblätter, usw.) wichtig ist und wir sie automatisch nutzen.
Wie auch immer, es gibt noch jede Menge, was ich nicht über VBA weiß :-)
Viele Grüße,
Zwenn
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige

Infobox / Tutorial

Excel VBA: Globale Variablen Deklarieren und Verwenden


Schritt-für-Schritt-Anleitung

  1. Öffne den VBA-Editor in Excel, indem du ALT + F11 drückst.
  2. Füge ein neues Modul hinzu:
    • Klicke mit der rechten Maustaste auf "VBAProject (DeineDatei.xls)".
    • Wähle "Einfügen" und dann "Modul".
  3. Deklariere eine globale Variable:
    • Verwende die Public-Anweisung, um die Variable zu deklarieren.
      Public wksdatei As Workbook
  4. Initialisiere die Variable in einer Prozedur:
    • Zum Beispiel in der Workbook_Open-Prozedur.
      Private Sub Workbook_Open()
      Set wksdatei = Workbooks("Datei.xls")
      End Sub
  5. Verwende die globale Variable in anderen Prozeduren:
    • Du kannst jetzt wksdatei in beliebigen Modulen verwenden, ohne sie erneut zu deklarieren.

Häufige Fehler und Lösungen

  • Fehler: "Variable nicht definiert"

    • Stelle sicher, dass du Option Explicit am Anfang deines Moduls hast. Das zwingt dich, alle Variablen zu deklarieren.
  • Fehler: "Objektvariable oder With-Blockvariable nicht festgelegt"

    • Achte darauf, dass die globale Variable korrekt initialisiert wurde, bevor du sie verwendest. Überprüfe, ob das Workbook tatsächlich geöffnet ist.

Alternative Methoden

Wenn du keine Public-Variablen verwenden möchtest, kannst du stattdessen:

  • Private Variablen innerhalb eines Moduls deklarieren, die nur dort verfügbar sind.
  • Parameter an Funktionen übergeben, um Werte zu verwenden, ohne sie global zu deklarieren.
Sub Beispiel()
    Dim lokaleVariable As Integer
    lokaleVariable = 10
    Call FunktionMitParameter(lokaleVariable)
End Sub

Sub FunktionMitParameter(ByVal wert As Integer)
    ' Verwendung des Parameters
End Sub

Praktische Beispiele

Hier ist ein Beispiel, wie du eine Public-Variable in einem Modul nutzen kannst:

' Modul1
Public wksdatei As Workbook

Sub InitWorkbook()
    Set wksdatei = Workbooks.Open("E:\Forum\test.xlsx")
End Sub

Sub VerwendeWorkbook()
    If wksdatei Is Nothing Then
        Call InitWorkbook
    End If
    ' Dein Code hier
End Sub

In diesem Beispiel wird die globale Variable wksdatei in mehreren Prozeduren verwendet, ohne dass sie in jeder Prozedur neu deklariert werden muss.


Tipps für Profis

  • Nutze Const für unveränderliche Werte:
    • Wenn du Werte hast, die sich nicht ändern, wie Dateinamen oder Zellbereiche, verwende Public Const.
      Public Const WbEx = "Datei.xls"
  • Organisiere globale Variablen in einem separaten Modul:
    • Lege alle Public-Variablen in einem speziellen Modul an, um die Übersichtlichkeit zu erhöhen.

FAQ: Häufige Fragen

1. Muss ich eine Public-Variable in jedem Modul deklarieren?
Nein, eine Public-Variable wird einmal pro Projekt deklariert und ist dann in allen Modulen verfügbar.

2. Was ist der Vorteil von Public-Variablen?
Sie ermöglichen den Zugriff auf Daten in verschiedenen Modulen, ohne sie mehrfach deklarieren zu müssen.

3. Wie initialisiere ich eine Public-Variable richtig?
Initialisiere sie in einer Prozedur, z.B. beim Öffnen des Workbooks, um sicherzustellen, dass sie bereit ist, verwendet zu werden.

4. Gibt es einen Nachteil bei der Verwendung von globalen Variablen?
Ja, sie können den Code schwerer verständlich machen und die Wartbarkeit beeinträchtigen, wenn sie nicht sorgfältig verwaltet werden.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige