webentwicklung-frage-antwort-db.com.de

Öffentliche statische Variable in Excel vba

Ist es möglich, eine statische Variable in einer Prozedur zu deklarieren und diese Variable in mehreren verschiedenen Prozeduren mit Excel VBA zu verwenden?

d.h. 

Public myvar as integer

Sub SetVar()
   static myvar as integer
   myvar=999
end sub

sub Usevar()
    dim newvar as integer
    newvar=myvar*0.5
end sub

Ich brauche myvar, um von anderen Verfahren gesehen zu werden, und nicht ändern oder "verloren" werden. Der obige Code funktioniert, wenn myvar nicht als statische Variable deklariert ist, aber mehr Code als verloren geht. Wenn die statische Deklaration verwendet wird, wird myvar vom usevar-Verfahren nicht gesehen. "Public Static myvar as integer" wird von VBA nicht akzeptiert.

Danke für Ihre Hilfe

Zeus

10
Zeus

Versuchen Sie dies durch Aufruf vonMAIN:

Public myvar As Integer

Sub MAIN()
    Call SetVar
    Call UseVar
End Sub

Sub SetVar()
    myvar = 999
End Sub

Sub UseVar()
    Dim newvar As Variant
    newvar = myvar * 0.5
    MsgBox newvar
End Sub

Wenn Sie einen Artikel Static deklarieren, wird sein Wert innerhalb der Prozedur oder des Sub-Eintrags beibehalten. Wenn Sie das Element Public angeben, wird der Wert beibehalten und ist auch für andere Verfahren sichtbar.

6
Gary's Student

Obwohl diese Frage vor über vier Jahren von @ Gary's Student beantwortet wurde, gibt es eine feine Nuance, die erwähnenswert ist, da die Lösung vom Datentyp von myvar abhängen kann.

Wie Sie bereits in der Frage bemerkt haben, funktioniert Public Static myvar as Integer nicht, da Static nur innerhalb eines Sub oder einer Funktion erlaubt ist.

Wie in den Kommentaren zum OP von @Patrick Lepelletier vermerkt, können Sie dies einfach umgehen, indem Sie stattdessen eine Constant deklarieren (vorausgesetzt, Sie müssen sie nicht dynamisch ändern): Public Const myvar as Integer = 999. (Oder möglicherweise Private Const myvar...)

Eine andere Option ist, myvar als Funktion anstelle einer Variablen oder Konstante zu deklarieren, um sie effektiv in eine Pseudo-Konstante umzuwandeln:

Private Function myvar() as Integer
     Static intMyvar as Integer 
     intMyvar = 999
     myvar = intMyvar
End function

In diesem einfachen Beispiel, in dem myvar eine ganze Zahl ist, ist der Ansatz der Pseudokonstante offensichtlich unnötig und fügt den Aufwand eines Funktionsaufrufs hinzu. Einfach eine Constant deklarieren, macht den Job. Die Verwendung einer Konstante funktioniert jedoch nur, wenn der Wert statisch ist und kein Objekt. Es funktioniert nicht, wenn myvar ein Objekt ist, beispielsweise eine Range. In diesem Fall kann die Verwendung von Pseudokonstanten hilfreich sein:

Private Function myvar() as Range
    Set myvar = Range("A1")
End Function

Ein weiterer Vorteil ist, dass Sie Code innerhalb der Funktion verwenden können, um nach bestimmten Bedingungen zu suchen und myvar entsprechend unterschiedliche Werte zuzuweisen. 

Der Pseudokonstantenansatz kann auch mit Benennungsarbeitsblattbereichen kombiniert werden: Wenn die Zelle A1 ein benannter Bereich ist, beispielsweise MyRange, können Sie Folgendes schreiben:

Dim strMyString as String
strMyString = "MyRange"
Private Function myvar() as Range
    Set myvar = Range(strMyString)
End Function

Jetzt ist es möglich, den Inhalt der Zelle A1 zu verschieben, ohne den Code zu beschädigen, da der benannte Bereich beim Ausschneiden und Einfügen der Zelle folgt. Ich finde diesen Ansatz in der Entwurfsphase nützlich, wenn sich die Dinge häufig in einem Arbeitsblatt bewegen.

Pseudokonstanten tragen auch dazu bei, einige Probleme zu vermeiden, die normalerweise mit globalen Variablen (oder Modulebenen) verbunden sind, die in größeren Projekten ein Problem darstellen können.

2
Egalth

Der Schlüssel ist die Verwendung von 2 Variablen. Im folgenden Code ist myvar öffentlich, aber nicht statisch. stvar ist statisch, aber nicht öffentlich. Sein Geltungsbereich ist nur innerhalb von Main (). Durch die Zuweisung von myvar = stvar und stvar = myvar wird eine Variable erzeugt, die sowohl öffentlich als auch statisch ist. Der Wert bleibt erhalten.

Public myvar As String
Sub Main() 'in module 1
Static stvar As String
myvar = stvar
toInput
stvar = myvar
End Sub

Sub toInput() 'in module2
myvar = InputBox("enter something", "Input", myvar)
End Sub
0
On Chang