以下は私が自分で答える質問ですが、それは私にとって大きな欲求不満を引き起こし、ウェブで検索するのに苦労したので、他の人のために時間と労力を節約することを期待してここに投稿しています.将来これを忘れた場合、おそらく自分自身のために:
VBA(私の場合はMS Excel)の場合、Public
宣言は、変数(または関数)をそのモジュール内の他の関数またはサブルーチンからグローバルにアクセスできるようにすることになっています。他のモジュール。
Forms
Sheets
.
_ _
要するに、以下は、で作成されたときにパブリックでアクセス可能な変数を作成しません。Form
したがって、mModule1 で bYesNo 変数と dRate 変数が未定義であると言ってクラッシュします。
(inside fMyForm)
Public bYesNo As Boolean`
Public dRate As Double
Private Sub SetVals()
bYesNo = Me.cbShouldIHaveADrink.value
dRate = CDec(Me.tbHowManyPerHour.value)
End Sub
(Presume the textbox & checkbox are defined in the form)
(inside mModule1)
Private Sub PrintVals()
Debug.Print CStr(bYesNo)
Debug.Print CStr(dRate)
End Sub
ただし、以下のわずかな変更を加えると、すべて正常に機能します。
(inside fMyForm)
Private Sub SetVals()
bYesNo = Me.cbShouldIHaveADrink.value
dRate = CDec(Me.tbHowManyPerHour.value)
End Sub
(Presume the textbox & checkbox are defined in the form)
(inside mModule1)
Public bYesNo As Boolean`
Public dRate As Double
Private Sub PrintVals()
Debug.Print CStr(bYesNo)
Debug.Print CStr(dRate)
End Sub
mModule1
fMyForm が常に最初に呼び出されると仮定すると、PrintVals
ルーチンが実行されるまでに、フォームのテキストボックスとチェックボックスの値が適切にキャプチャされます。
正直なところ、MS がこの変更で何を考えていたのかを理解することはできませんが、一貫性の欠如は効率を大きく損ない、このような特異性を学習します。 10年以上を検索するのは非常に困難です。