web-dev-qa-db-ja.com

Excel vbaのパブリック静的変数

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では受け入れられません。

ご協力いただきありがとうございます

ゼウス

11
Zeus

[〜#〜] 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を宣言すると、その値は保持され、他のプロシージャからも見えるようになります。

7
Gary's Student

この質問は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のコンテンツ内を移動できます。セルをカットアンドペーストすると、名前付き範囲が続くためです。このアプローチは、ワークシート内で物事が頻繁に移動する傾向がある設計段階で役立ちます。

疑似定数は いくつかの問題 の回避にも役立ちます。通常、大規模なプロジェクトでは問題になる可能性があるグローバル(またはモジュールレベル)変数に関連付けられます。

5
Egalth

重要なのは、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
0
On Chang