Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

Public Variable verliert Wert
#1
Hallo liebes Forum,

ich habe eine Excel-Datei mit mehreren Tabellenblättern und benötige für verschiedene Subs den Wert der letzten Zeile mit Inhalt für jedes Tabellenblatt.
Also habe ich eine Funktion unter "Diese Arbeitsmappe" erstellt, die diese Werte herausfindet und die entsprechenden Variablen oben als Public definiert.

Wenn ich jetzt aber in einem anderen Sub in einem anderen Modul diesen Sub aufrufe, wird der zwar durchgeführt und die Variablen bekommen die richtigen Werte zugewiesen. Wenn der Sub durchgelaufen ist und Excel wieder zurück in den aufrufenden Sub springt, sind dort aber weiterhin alle Variablen leer.

In der Überwachung steht dann für die Variablen "außerhalb des Kontexts" und als Kontext "Diese Arbeitsmappe". Ich habe sie ja aber als Public definiert. Sollten sie dann nicht erhalten bleiben auch in einem anderen Modul? Das war nämlich meine Idee, um Werte aus einem Sub wieder zurückzugeben, da man ja in VBA soweit ich weiß nur Variablen an andere Subs weitergeben kann, aber nicht returnen kann.

Das gleiche Problem habe ich mit einem Array, den ich in einem separaten Sub fülle (dort als Public definiert), und diesen Sub in meiner eigentlichen Prozedur aufrufen will.

Ich habe das Gefühl, ich übersehe da etwas. Vielleicht kann mir ja jemand auf die Sprünge helfen :)
Antworten Top
#2
Moin!
Ein Deklaration als Public funktioniert nur in einem allgemeinen Modul.

Gruß Ralf
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. 
Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
[-] Folgende(r) 1 Nutzer sagt Danke an RPP63 für diesen Beitrag:
  • tophy
Antworten Top
#3
Zitat:Ein Deklaration als Public funktioniert nur in einem allgemeinen Modul.
Abgesehen davon, dass es so nicht wirklich stimmt, hilft es nicht wirklich im Verständnis. 

Andererseits ist es auch ziemlich hoffnungslos, das Thema Objekte und Klassen in einem Post zu erklären. 

Und natürlich ist es besser, eine Public Variable in einem allgemeinen Modul zu deklarieren. Am besten wäre es, wenn man die Public Variable nicht benötigt

Dieser Code in "Diese Arbeitsmappe"
Code:
Option Explicit

Public myVar As Long
Public arr As Variant

Private Sub Workbook_Open()
    Dim i As Long
    ReDim arr(1 To 10)
    For i = 1 To 10
        arr(i) = Chr(64 + i)
    Next
    myVar = 42
End Sub
und diesen Code in ein allgemeines Modul
Code:
Sub printVars()
   
    Debug.Print ThisWorkbook.myVar

    Dim i As Long, v As Variant
    v = ThisWorkbook.arr
    For i = 1 To 10
        Debug.Print v(i)
    Next
End Sub

Ist das best practise? Eher nicht, aber das Verständnis ist hilfreich
Antworten Top
#4
Hi,

(01.11.2022, 12:06)tophy schrieb: da man ja in VBA soweit ich weiß nur Variablen an andere Subs weitergeben kann, aber nicht returnen kann.
Das stimmt so nicht.

Wenn du einen Wert zurück haben willst, dann verwende eine Function. Die ist nämlich extra dafür gemacht.

Wenn man mehrere Werte zurück haben will, dann gibt man halt ein Array zurück. Oder man man übergibt einige Variablen als ByRef. Dann können diese in der Sub geändert werden und können dann im Hauptprogramm weiterverwendet werden. Man handelt sich allerdings andere Nachteile ein. Wie z.B. dass die automatische Typumwandlung nicht funktioniert. Und die Variable daher im Hauptprogramm und in der Sub gleich definiert sein müssen (ich meine nicht den Namen, sondern den Typ).

Wenn man globale Variablen braucht, hat man irgendwas in der Konzeption des Programmes falsch gemacht.
Gruß,
Helmut

Win10 - Office365 / MacOS - Office365
[-] Folgende(r) 1 Nutzer sagt Danke an HKindler für diesen Beitrag:
  • tophy
Antworten Top
#5
Tatsächlich hat es in meinem Fall schon geholfen, die public Variable in einem Modul zu deklarieren.
Es ist aber gut zu wissen, dass es functions mit return in VBA gibt. Das ist bisher irgendwie an mir vorbeigegangen.
Antworten Top
#6
Hallöchen,

mal oT:
Zitat:Wenn man globale Variablen braucht, hat man irgendwas in der Konzeption des Programmes falsch gemacht.

Da hab ich ja die letzten 25 Jahre einiges falsch gemacht Sad

Mal zwei einfache Beispiele:

Man braucht nicht alle Eingaben eines UF gleich, geht mit
--> Übergabe an Public Variable
--> Verlassen per Hide, wäre die Frage, ob die Variablen oder das / die UF belastender sind
--> Aufteilen in mehrere UF und Aufruf, wenn nötig. Könnte aber einen kontinuierlichen Ablauf stören

Man definiert Voreinstellungen, geht mit
--> einmalig in Public Variablen und Wertzuweisung im ersten Sub oder im ersten, wo sie benötigt bzw. ermittelt werden (bei Konstanten nur bei der Deklaration)
--> mehrfache Definition, also in jedem Makro, wo sie benötigt werden,
--> einmalige Definition und Übergabe an die folgenden Makros, auch wenn sie nur in jedem zweiten gebraucht werden
Voreinstellungen kann man natürlich auch auf einem Blatt speichern oder vom System entnehmen, ist aber auch wieder die Frage ob man das 1x tut oder mehrfach, also in jedem Makro, wo sie benötigt werden, oder ...

(Man benötigt Type - Deklarationen)

...
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste