- 締切済み
パブリック変数を宣言する時に・・・
エクセルVBAの質問です。 モジュールAとBがあるとしまして、 Aの中にあるプロシージャからBの中のプロシージャを呼び出す場合、 変数を引き渡したいとしたらパブリック変数を使いますよね? この場合宣言は、 Aの宣言セクションでするのか、 Bの宣言セクションでするのか、 あるいは両方で同じ変数を宣言するのか、 どれなんでしょ?
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- KenKen_SP
- ベストアンサー率62% (785/1258)
こんにちは。 > Aの宣言セクションでするのか、Bの宣言セクションでするのか、 > あるいは両方で同じ変数を宣言するのか、 試せばすぐわかることですが、どのモジュールでもいいですよ。 例) ' // --- Module1 --- Public a As Long Sub Main() a = 10 Call SubProc() End Sub ' // --- Module2 --- Sub SubProc() MsgBox Cstr(a) End Sub > 変数を引き渡したいとしたらパブリック変数を使いますよね? 現在主流となっているコーディングルールでは、なるべく広域変数 つまりグローバル変数を使わないことが推奨されています。 私なら引数を使います。パブリック変数はほとんど使いません。 例) ' // --- Module1 --- Sub Main() Dim a As Long a = 10 Call SubProc(a) End Sub ' // --- Module2 --- Sub SubProc(ByVal b As Long) MsgBox CStr(b) End Sub ちなみに、ThisWorkbook、シートモジュール等で宣言した Public な変数 にアクセスするには、 Sheet1.hoge ThisWorkbook.hoge のように書きます。また、Dim キーワードで宣言した場合は、モジュール レベル変数(Private)として扱われますので、ほかモジュールからは アクセスできません。
- ki-aaa
- ベストアンサー率49% (105/213)
#2です。 ちょっとだけ変えます。 同じシートモジュールに書く場合は、かんたんです。 たとえば、Sub aaa と Sub bbb を Module1にかく場合です。 Sub aaa と Sub bbb で「行あ」を受け渡します。 最初の Sub の前に、受け渡したい変数「行あ 」を書きます。 Option Explicit Dim 行あ As Long Sub aaa() Dim myCmd As Integer 行あ = 10 Call Sub bbb If 行あ = 22 Then ' 処理 End If End Sub Sub bbb() Dim myCmd As Integer If 行あ = 10 Then ' 処理 行あ = 22 End If End bbb このようにすれば、モジュール間の値の受け渡しができます。 注 違うシートモジュール間の受け渡しは、できません。
お礼
ご回答ありがとうございます。 同一モジュール内に於いては、宣言セクションに書けば、 パブリックにしなくても良い、と解釈しているのですが。 記述は標準モジュール内にしています。
- ki-aaa
- ベストアンサー率49% (105/213)
同じシートモジュールに書く場合は、かんたんです。 たとえば、Sub aaa と Sub bbb を Module1にかく場合です。 Option Explicit Dim 行あ As Long Sub aaa() Dim myCmd As Integer 行あ =10 Call Sub bbb End Sub Sub bbb() Dim myCmd As Integer If 行あ =10 Then ' 処理 End If End bbb このようにすれば、モジュール間の値の受け渡しができます。 注 違うシートモジュール間の受け渡しは、できません。
- 某HN クロメート(Chromate)(@CoalTar)
- ベストアンサー率40% (705/1742)
VBAは詳しくないですが 参考URLの Visual Basic for Applications の変数の適用範囲 -パブリック変数の適用範囲 に この変数はどのモジュール シートでも宣言できます。 と書かれています。参考にしてみてください
お礼
ご回答ありがとうございます。 どのモジュールでも良い、というのはわかっているのですが、 どのモジュールでは良くない、というのがわからないんですよねえ・・。
お礼
ご回答ありがとうございます。 知識として、どのモジュールに書いても良いと理解しているのですが、 何故か上手く動かなくて、見落としてることがあるのかと思って質問しました。 自分は頭が良くないので、引数という概念が全く理解出来ません。 どうしたら例に出されているようなプロシージャになるのか、 本当にわからないのです。ごめんなさい。