- ベストアンサー
VBAのPubilicキーワードについて
こんにちは、 現在、VBAの資格勉強中です。 下記の問題は、正解なのですが、何のことか?理解できません。 どうやって、適用範囲を変更するのでしょうか?教科書を見ても意味が理解できません。 問題 定数はPubilicキーワードを使用して、適用範囲を変更することができる。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは。 >定数はPubilicキーワードを使用して、適用範囲を変更することができる。 知っている人に対する、ちょっと引っ掛け問題のような気がします。 私も混乱していた時期が長かったです。 適用範囲のことを、スコープというのはご存知ですね。 当然、これは、「標準モジュール」に書く話のはずです。 もし、それが、「シートモジュール」に書くということになれば、エラーが発生します。 '//標準モジュール Public Const A As Integer = 1 'プロジェクトレベル Const B As Integer = 10 'モジュールレベル Private Const Y As Integer = 100 'モジュールレベル Sub Sample01() 'プロジェクトレベル MsgBox A MsgBox B MsgBox Y End Sub '// これを、Sheet1 から呼び出しみると分かります。 Sub Test01() Call Sample01 End Sub '// Public Const A As Integer = 1 'プロジェクトレベル Const B As Integer = 10 'モジュールレベル このように、モジュールレベルが、Public キーワードによって、プロジェクト(スコープ)レベルになりました。 (たぶん、テキストでは、パブリックモジュールレベル、プライベートモジュールレベルと書かれているかもしれませんが、プロジェクトレベル、モジュールレベルという用語の方がわかりやすいのであえて使っています。) (プロジェクトというのは、一つのブックの開発モジュール全般のことを指します。そして、プロジェクツ・レベルというのは、開いているブック全体の開発モジュールのことを指しますが、ふだん、Excel VBAでは、そこまで広い範囲は考えません。参照設定が必要になります。しかし、Word VBAでは、プロジェクツ・レベルが標準です。) なぜ、引っ掛けかというと、Sample01のプロシージャは、何もつけなくて、プロジェクトレベルだからです。Private キーワードを付けて、初めて、モジュールレベルに変更になりますが、Public Sample01() と書くのは、単なる見かけ上のことだと、解釈しています。ここに、定数とプロシージャの違いがあります。 そして、「標準モジュール」に対する「オブジェクト・モジュール」という言葉が出てきます。例えば、シートモジュールやThisWorkbookモジュールのことです。そこに、今度は、Public キーワードで定数を設定させようとすると、エラーになるはずです。つまり、Public キーワードによる定数(Const)は、「標準モジュール」が一般的だと言えます。もちろん「クラスモジュール」にも使われますが、ここでは、触れないことにしておきます。 かえって、分かりにくくなってしまったかもしれませんが、一度、VBEditor で書いてみると分かるはずです。
その他の回答 (3)
- weboner
- ベストアンサー率45% (111/244)
はじめに Public(パブリック)ですPubilicだとiが多いです >定数はPubilic定数を使用して、適用範囲を変更することができる これだと日本語としておかしな表現になります Public定数=Public宣言された定数 なので {定数はPublic宣言された定数を使用して、適用範囲を変更することができる} と言い換えることができる なんかおかしいですよね
お礼
なるほど、そうですね。 難しいですね。今、勉強中ですが、ベーシックでも、しんどくなってきました。
- keithin
- ベストアンサー率66% (5278/7941)
適用範囲についてしっかり理解すれば,自ずから理解も進むと思います。 ご質問での適用範囲ってのは,宣言した変数や定数を「どこ」から呼び出せるかという事です。 ここで言う「どこ」とは, ・あるプロシジャ(sub からend subまでのヒトカタマリ)の中 ・あるモジュール(マクロシート)の中 ・あるブック(VBAProject)の中 などの範囲があります。 エクセルを使った例: Book1.xlsmというVBAProjectの中に,標準モジュールのModule1とModule2を用意 Module1に '----------------Module1 '判りやすくするため,option explicitは宣言しない public const c1 as integer = 11 const c2 as integer = 22 sub macro1() const c3 as integer = 33 debug.print c1 debug.print c2 debug.print c3 end sub sub macro2() debug.print c1 debug.print c2 debug.print c3 end sub '----------------Module1 ここまで module2に '----------------Module2 sub macro3() debug.print c1 debug.print c2 debug.print c3 end sub '----------------Module2 ここまで とそれぞれ用意,実際に実行してみます。 c1はmacro1,2,3のどれからも値を呼び出せます。つまりpublicを付けたc1の適用範囲は,他のモジュールにも及ぶということです。 c2はmacro1,2から値を呼び出せますが,macro3では値が出てきません。つまりmoduleレベルで宣言したconstは,そのモジュールの中が適用範囲です。 c3はmacro1の中だけでしか値が出てきません。プロシジャの中で宣言したconstは,そのプロシジャの中だけが適用範囲です。 ここでoption explicitを宣言すると,「値が呼び出せない」定数/変数は「定義されていない」警告が現れてマクロの実行ができなくなります。 つまり「定義されていない」とは,「適用範囲がそこに届いていない」という意味です。 ちなみに更にBook2.xlsmを用意,Module1を挿入,そこに sub macro4() debug.print c1 debug.print c2 debug.print c3 end sub を準備してみます。 実行してみると,他のVBAPrjectのモジュールからは,publicにしてあったc1も呼び出せない,逆の言い方をするとpublicで宣言しても他のプロジェクトには届いていない事が判ります。 #注意 練習用のマクロでoption explicitを宣言していない状態では,「定義されていない」定数/変数は,実際にはVBAのオマケ機能により,その場で新たにvariant型の変数として自動生成されている事に留意して下さい。
補足
お返事ありがとう御座います。 やはり、自分の理解で正しかったかもしれません。 定数はPubilicキーワードを使用して、適用範囲を変更することができる。 は、釈然としません。 定数はPubilic定数を使用して、適用範囲を変更することができる。 でしたら、何も考えずに、○とします。 Pubilicキーワードと、Pubilic定数に、違いはあるのでしょうか? Pubilicキーワードって、わざわざ言うのは、何か深い意味があるのでしょうか?
- bin-chan
- ベストアンサー率33% (1403/4213)
VBAのモジュールってあるでしょ。 アレの範囲を越えて参照できるんです。 Publicで無いのはPrivate。参照可能範囲限定されます。
補足
お返事ありがとう御座います。 >定数はPubilicキーワードを使用して、適用範囲を変更することができる。 やっぱり、よくわからないです。 定数はPubilicを使用して、適用範囲を変更することができる。 でしたら、すんなり、理解できます。 Pubilicキーワードって、Pubilicと何が、違うのでしょうか?
補足
お返事ありがとう御座います。 >かえって、分かりにくくなってしまったかもしれませんが、一度、VBEditor で書いてみると分かるはずです。 やはり、自分の理解で正しかったかもしれません。 定数はPubilicキーワードを使用して、適用範囲を変更することができる。 は、釈然としません。 定数はPubilic定数を使用して、適用範囲を変更することができる。 でしたら、何も考えずに、○とします。 Pubilicキーワードと、Pubilic定数に、違いはあるのでしょうか? Pubilicキーワードって、わざわざ言うのは、なぜでしょうか?