初心者のExcelマクロVBA:定数のススメ
今日は少し定数について書きたいと思います。定数ってなぁに?からですね。
定数(ていすう)とは?
定数とは変えることができない変数という感じです。
( ゚Д゚)?
ちょっと矛盾していますが、そんなイメージです。変数は様々な値を保持することができる箱のようなものでした。定数はこれに対して、いろいろな値は入れることはできないですが、入れたらずっとその値のままです。永遠に変わることはありません。
定数の必要性
値を変えることができないなら、そのまま値を値として使えばいいじゃないか!と思いますよね?たとえば。。。
Public Sub test() a = 10 if a = 10 then msg = "値は10です" end if End Sub
定数で書くとこんな感じ
Public Const TEN = 10 Public Sub test() Dim a As Long if a = TEN then msg = "値は10です" End If End Sub
さてこれの何が便利なのでしょうか?ぶっちゃけこの例では一切、便利さはありません。しかし、定数は絶対に必要なのです。なぜか?それは、さまざまな値に意味を持たせたい時です。
定数は値に意味をもたらしてくれる。
もっとも顕著な例は、もともとエクセルマクロVBAが用意している定数です。たとえばメッセージボックスを表示する関数がありますが、OKボタンなのか?警告なのか?OKキャンセルなのか?という設定ができます。この設定値は定数でできています。
ret = MsgBox("例です。", vbOKCancel+vbInformation, "タイトル")
ここの、「vbOKCancel」と「vbInformation」がいわゆる定数です。他にもこの関数で設定できる定数には以下のようなものがあります。
定数 | 値 | 内容 |
---|---|---|
vbOKOnly | 0 | (既定値) [OK] ボタンのみを表示します。 |
vbOKCancel | 1 | [OK] ボタンと [キャンセル] ボタンを表示します。 |
vbAbortRetryIgnore | 2 | [中止]、[再試行]、[無視] の 3 つのボタンを表示します。 |
vbYesNoCancel | 3 | [はい]、[いいえ]、[キャンセル] の 3 つのボタンを表示します。 |
vbYesNo | 4 | [はい] ボタンと [いいえ] ボタンを表示します。 |
vbRetryCancel | 5 | [再試行] ボタンと [キャンセル] ボタンを表示します。 |
vbCritical | 16 | 警告メッセージ アイコンを表示します。 |
vbQuestion | 32 | 問い合わせメッセージ アイコンを表示します。 |
vbExclamation | 48 | 注意メッセージ アイコンを表示します。 |
vbInformation | 64 | 情報メッセージ アイコンを表示します。 |
vbDefaultButton1 | 0 | (既定値)第 1 ボタンを標準ボタンに設定します。 |
vbDefaultButton2 | 256 | 第 2 ボタンを標準ボタンに設定します。 |
vbDefaultButton3 | 512 | 第 3 ボタンを標準ボタンに設定します。 |
vbDefaultButton4 | 768 | 第 4 ボタンを標準ボタンに設定します。 |
vbApplicationModal | 0 | (既定値)アプリケーション モーダルに設定します。 |
vbSystemModal | 4096 | システム モーダルに設定します。 |
vbMsgBoxHelpButton | 16384 | ヘルプ ボタンを追加します。 |
VbMsgBoxSetForeground | 65536 | 最前面のウィンドウとして表示します。 |
vbMsgBoxRight | 524288 | テキストを右寄せで表示します。 |
vbMsgBoxRtlReading | 1048576 | テキストを、右から左の方向で表示します。 |
もし定数がなかったら・・・
ここで問題ですが、もしこの定数が用意されていなかったらどうでしょうか?たとえば、
・[はい] ボタンと [いいえ] ボタンを表示します。
・警告メッセージ アイコンを表示します。
の2つを設定した時に、以下のように書かなくてはいけません。
ret = MsgBox("例です。", 4+64, "タイトル")
この文を読んで、あぁ、[はい] ボタンと [いいえ] ボタンを表示して、かつ警告メッセージなんだ。とわかる人っています?
数字に意味を持たせる定数によって格段にわかりやすくなる。
このように定数にしないとただの数字なのでその意味が全く分かりませんが定数にすることで、そのたとえ数字がわからなくてもプログラミングとしてはちゃんと設定できるようになるのです。この
値に意味を持たせる。
というのがVBAに限らずプログラム上非常に大切なことになります。だってそうしないと意味がわからないもん。
ですので、まず直接数値や値を書く前に、これを読んだ人がこの数字の意味がわかるかな?と考えてもしわからなければ事前に定数化しておくと良いでしょう。定数は1つの標準モジュールにまとめて書いておけば良いのです。
例えば、標準モジュールにdefineというモジュールを追加して、そこに定数を書いておきます。
値をすべてPublicにしておけば他のどのモジュールでも使えますし、値に意味を持った言葉として記述することができるので非常にわかりやすくなります。
非常に簡単な例だと、人の性別をたとえば男を1女を2とプログラム上では扱っている時に、
If sex = 1 Then ・・・・
などと書いてるとそれが男性の場合なのか?女性の場合なのか?わからないですよね?ですので、さっき作ったdefine上で定義しておくのです。
Public Const MALE = 1 Public Const FEMALE = 2
ですね、こうしておけば、さっきの記述は・・・
If sex = MALE Then ・・・・
となります。これならこの文を見た人は簡単に「あぁもし性別が男性だったら」と訳すことができますよね?
定数はこのようにプログラムを読みやすくする上で非常に重要な役割を持っています。
定数にすることで管理が楽になる。
さて、定数のもう1つの役割はこれです。例えばさっきの定数化していない判断の文章が、100か所あったらどうでしょうか?(※この際それ自体が問題とかそういうのは置いといて・・・)そして、その後男性を意味する数値が0になり女性が1に変更になりました。
上の例では100か所すべてを1→0へ変更しなければいけませんが、定数化していると、defineに記述したMALE = 1を0にするだけです。非常に簡単になりますよね?変更や修正を楽にしてくれるのもこの定数のおかげなのです。
どうでしょうか?定数化するといいことがたくさんあります。
是非、やってみてください。