1つのプロシージャで静的変数を宣言し、Excel VBAを使用していくつかの異なるプロシージャでこの変数を使用することは可能ですか?
つまり.
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
Myvarが他の手順で表示され、変更されたり「失われたり」しないようにする必要があります。上記のコードは、myvarが静的変数として宣言されていない場合に機能しますが、より多くのコードの場合、変数は「失われます」。 static宣言が使用されている場合、myvarはusevarプロシージャからは見えません。また、「Public Static myvar as integer」はVBAでは受け入れられません。
ご協力いただきありがとうございます
ゼウス
[〜#〜] main [〜#〜]を呼び出してこれを試してください:
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
アイテムを宣言する場合Static、その値はプロシージャまたはサブルーチン内で保持されます。アイテムPublicを宣言すると、その値は保持され、他のプロシージャからも見えるようになります。
この質問は4年以上前に@ Gary's Studentによって回答されましたが、ソリューションはmyvar
のデータ型に依存する可能性があるため、言及する価値のある微妙なニュアンスがあります。
まず、質問で述べたように、Static
はサブルーチンまたは関数内でのみ許可されているため、Public Static myvar as Integer
は機能しません。
@Patrick LepelletierによるOPへのコメントで述べたように、代わりにConstant
を宣言することでこれを簡単に回避できます(動的に変更する必要がない場合):Public Const myvar as Integer = 999
。 (またはおそらくPrivate Const myvar...
)
もう1つのオプションは、myvar
を変数または定数ではなく関数として宣言し、それを疑似定数に効果的に変換することです。 :
Private Function myvar() as Integer
Static intMyvar as Integer
intMyvar = 999
myvar = intMyvar
End function
myvar
が整数であるこの単純な例では、疑似定数アプローチは明らかに不要であり、関数呼び出しのオーバーヘッドが追加されます。 Constant
を宣言するだけで十分です。ただし、定数を使用できるのは、値が静的で、オブジェクトではない場合のみです。 myvar
がオブジェクト、たとえばRange
の場合は機能しません。その場合、疑似定数を使用すると便利です。
Private Function myvar() as Range
Set myvar = Range("A1")
End Function
別の利点は、関数内のコードを使用して特定の条件をチェックし、それに応じてmyvar
に異なる値を割り当てることができることです。
疑似定数アプローチは、ワークシート範囲の命名と組み合わせることができます。セルA1が名前付き範囲の場合、たとえばMyRange
とすると、次のように記述できます。
Dim strMyString as String
strMyString = "MyRange"
Private Function myvar() as Range
Set myvar = Range(strMyString)
End Function
これで、コードを壊すことなくセルA1のコンテンツ内を移動できます。セルをカットアンドペーストすると、名前付き範囲が続くためです。このアプローチは、ワークシート内で物事が頻繁に移動する傾向がある設計段階で役立ちます。
疑似定数は いくつかの問題 の回避にも役立ちます。通常、大規模なプロジェクトでは問題になる可能性があるグローバル(またはモジュールレベル)変数に関連付けられます。
重要なのは、2つの変数を使用することです。以下のコードでは、myvarはパブリックですが静的ではありません。 stvarは静的ですが、パブリックではありません。そのスコープはMain()内のみです。 myvar = stvarとstvar = myvarを割り当てることで、publicとstaticの両方の変数を効果的に作成します。値は保持されます。
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