web-dev-qa-db-ja.com

vbaでパブリック変数を宣言してデフォルト値を割り当てることは可能ですか?

私はこれをしたいのですが、コンパイルされません:

Public MyVariable as Integer = 123

これを達成する最良の方法は何ですか?

47
David

.NETが私たちをだめにしています:)あなたの宣言はVBAには無効です。

アプリケーションのロード時に値を指定できるのは定数のみです。次のように宣言します。

Public Const APOSTROPHE_KEYCODE = 222

これは私のVBAプロジェクトの1つからのサンプル宣言です。

VBA Constant Image

パブリック変数を宣言し、その値を初期化するものを探している場合は、Workbook_Openサブルーチンを作成し、そこで初期化を行う必要があります。例:

Private Sub Workbook_Open()
  Dim iAnswer As Integer

  InitializeListSheetDataColumns_S
  HideAllMonths_S

  If sheetSetupInfo.Range("D6").Value = "Enter Facility Name" Then
    iAnswer = MsgBox("It appears you have not yet set up this workbook.  Would you like to do so now?", vbYesNo)
    If iAnswer = vbYes Then
      sheetSetupInfo.Activate
      sheetSetupInfo.Range("D6").Select
      Exit Sub
    End If
  End If

  Application.Calculation = xlCalculationAutomatic
  sheetGeneralInfo.Activate
  Load frmInfoSheet
  frmInfoSheet.Show


End Sub

Workbookオブジェクト自体でsubを宣言してください: enter image description here

95
ray

別の角度を提供するために-

関数呼び出し間でパブリック変数を維持することはお勧めできません。使用する必要がある変数は、SubsとFunctionsに保存し、パラメーターとして渡す必要があります。コードの実行が完了したら、VBAプロジェクトが変数の値を保持することを期待しないでください。

この理由は、ワークブックの使用中にVBAプロジェクトを誤ってリセットする可能性のあるものが非常に多いためです。これが発生すると、すべてのパブリック変数が0にリセットされます。

サブルーチンおよび関数の外部に値を保存する必要がある場合、永続化する必要がある情報については、名前付き範囲のある非表示のワークシートを使用することを強くお勧めします。

9
Alain

確かに知っていますが、その定数がconst MyVariable as Integer = 123である場合、それ以外の場合は不運です。変数には他の場所で初期値を割り当てる必要があります。

あなたは出来る:

public property get myIntegerThing() as integer
    myIntegerThing= 123
end property

クラスモジュールでグローバルに作成します。

public cMyStuff as new MyStuffClass

したがって、cMyStuff.myIntegerThingはすぐに利用可能です。

8
Alex K.

これは、初期化されたグローバル定数が必要なときに私がすることです:
1。 Globalsというモジュールを追加します
2。次のようなプロパティをGlobalsモジュールに追加します。

Property Get PSIStartRow() As Integer  
    PSIStartRow = Sheets("FOB Prices").Range("F1").Value  
End Property  
Property Get PSIStartCell() As String  
    PSIStartCell = "B" & PSIStartRow  
End Property
2
Achilles

一般宣言で変数を定義し、環境で発生する最初のイベントで変数を初期化できます。

または、関連するプロパティを持つクラスを自分で作成し、Initialiseメソッドで初期化することもできます

1
Duncan Howe

上で述べたように、グローバルなアクセス可能な変数を宣言するには、publicキーワードで始まる関数の外でそれを行うことができます。

また、影響はプロシージャの外部では許可されないため、たとえば、パブリック変数を初期化するInitGlobalsというサブを作成し、ステートメントの先頭でこのサブルーチンを呼び出すことができます。

以下に例を示します。

Public Coordinates(3) as Double
Public Heat as double
Public Weight as double

Sub InitGlobals()
    Coordinates(1)=10.5
    Coordinates(2)=22.54
    Coordinates(3)=-100.5
    Heat=25.5
    Weight=70
End Sub

Sub MyWorkSGoesHere()
    Call InitGlobals
    'Now you can do your work using your global variables initialized as you wanted them to be.
End Sub
1
Mohamed YOUNES