VBAの定数とは
<< VBAの配列とは :前の記事
前回は、配列について解説しました。配列には静的配列と動的配列がありますが、どちらも非常に使用頻度が高いものです。動的配列をうまく利用することができれば、複雑なプログラミングもできますしコードも簡素化できる場合もあります。ここまで値を変化できる変数や配列を解説しましたが、今回は値を固定する定数について解説します。
目次
定数とは
定数とは値や文字列を変更できない箱のようなものです。固定した値に別名をつける機能として定数を利用します。定数は、常に同じ値を保持するため、プログラムの実行中に値を変更することはできません。
複雑なプログラムほど多くの変数を利用しますが、規模が大きければ大きいほどバグも多数発生しますので、バグをなるべく少なくするためにも値を変える必要のない変数は定数として設定しておいた方が確実です。
定数の使い方
定数を設定するにはConstステートメントを利用して記述します。記述方法としては、データ型宣言の後に「=(イコール)」を記述し設定値を代入します。データ型の詳細については、変数のデータ型をご確認ください。
Const 定数名 As データ型 = 値
例えば、定数TAXに消費税の8%を設定する場合は以下になります。8%は0.08ですので、小数点に対応した単精度浮動小数点数型(Single)で宣言しています。定数名は一般的に、すべて大文字で記述するのが慣例となっていますので、こちらでも大文字で記述します。
事例を確認するとみかん100円に対して定数TAXである0.08を乗算しています。
Sub sample()
Const TAX As Single = 0.08
MsgBox "みかんの消費税は" & 100 * TAX & "円"
End Sub
定数のメリット
定数を利用するメリットとしては、上記でも説明したバグを無くす以外にもいくつかあります。
宣言以外では値の変更ができない
定数では、宣言時に設定した値を途中で変更することができません。消費税率のような固定値の場合は、変数を利用するより定数として利用するほうが途中で誤って値を変更してしまうこともありません。
入力ミスが軽減される
プログラムの中では数値がよく利用されます。そういった場合に数値を直接利用するよりは定数TAXのように値を代入しておけば、定数TAXを記述するだけ済みます。こちらは可読性もあがるため、入力ミスが軽減されます。
値の変更が一括で行える
消費税率のように改変される可能性があるものを変更する場合は、定数宣言時の設定値を変更するだけですべての定数TAXに反映されます。修正の手間も省けるので効率化にも繋がります。
Sub sample()
'消費税8%から10%に変更した場合
Const TAX As Single = 0.1
End Sub
定数の命名規則
定数の名前は基本的に自由に命名できますが、いくつかの命名ルールがあります。定数名を命名する際は以下に注意しましょう。
- 使用できる文字は、英字、ひらがな、全角カタカナ、漢字、数字、アンダースコア(_)
- 先頭は文字でなければならない(数字または記号以外の文字)
- 記号やスペースは使用できない
- 定数名は半角255文字(全角127文字)以内にする
- Excelの関数、ステートメント、メソッドと同じ名前(予約語)を使用することは出来ない
- 同一の適用範囲内で同じ名前の定数を宣言することはできない
定数の種類
定数には、いくつか種類があります。それぞれ処理の内容にあった定数で利用しましょう。
- 組み込み定数
- 条件付きコンパイラ定数
- 特殊な文字列定数
組み込み定数
エクセルVBAにはプロパティやメソッドに代入するために、あらかじめ用意されている定数があります。そのような定数を組み込み定数と言います。例えば、以下の例をあげるとMsgBox関数には「vbYesNo」という組み込み定数があります。「vbYesNo」を指定すると「はい・いいえ」のメッセージボックスが表示されます。
Sub sample()
MsgBox "組み込み定数", vbYesNo
End Sub
ちなみに組み込み定数vbYesNoには「4」の値が代入されていますので、「4」を指定しても同じ結果となります。
Sub sample()
MsgBox "組み込み定数", 4
End Sub
こちらはMsgBox関数の定数一覧です。このように様々な定数が組み込み定数として存在します。
定数 | 値 | 内容 |
---|---|---|
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 | テキストを、右から左の方向で表示します。 |
条件付きコンパイラ定数
条件付きコンパイラ定数は、条件付きコンパイルで利用される定数です。条件付きコンパイルとは、設定値に応じて、実行される部分を変更することができる記述方法で、本番・テスト環境の切り替えやOfficeのビット数判定などで利用されます。
Officeのビット数判定は、「VBAのIE制御」で利用されるSleep関数でも利用されます。簡単に説明するとSleep関数はoffice2010で32bit版と64bit版で記述方法が異なるので、その判定として条件付きコンパイルを利用しています。
条件付きコンパイルが行われる部分には「#(シャープ)」を記述することで利用できます。以下は実際にSleep関数のビット数判定の記述になります。ちなみに以下のような分岐を「#If...Then...#Else ディレクティブ」と言います。
#If VBA7 Then
Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal ms As LongPtr)
#Else
Private Declare Sub Sleep Lib "kernel32" (ByVal ms As Long)
#End If
条件付きコンパイラ定数を設定する場合は、「#Constディレクティブ」を利用します、ディレクティブとは、プログラミングにおいてコマンドのような意味で使われる用語のことを言います。記述方法は以下になりますが、通常の定数設定のようにデータ型を指定する必要はありません。条件付きコンパイラ定数は、プロシージャ内で記述したとしても、すべてモジュールレベルで利用することができます。
#Const 定数名 = 値
以下は、本番・テスト環境の切り替えの事例です。
'#Const ENV = 0 '本番環境
#Const ENV = 1 'テスト環境
Sub sample()
#If ENV = 1 Then
MsgBox "現在、テスト環境です。"
#Else
MsgBox "現在、本番環境です。"
#End If
End Sub
特殊な文字列定数
エクセルVBAには特殊な動作を表すための文字列定数があります。以下がその文字列定数になります。
改行コードのvbCrLfはよく事例の中でMsgBox関数に利用しているのでなじみがあるかと思いますが、他にも特殊な文字列定数があることを覚えておきましょう。ちなみに改行コードはOS環境やファイル形式によって異なります。それぞれに併せた改行コードを利用しなければいけませんので、注意が必要です。
定数 | 説明 |
---|---|
vbCr | キャリッジリターン文字で改行を表します。主にMacOSの改行で利用されます。 |
vbLf | ラインフィード文字で改行を表します。主にExcelセル内の改行で利用されます。 |
vbCrLf | キャリッジリターン文字とラインフィード文字で改行を表します。主にWindowsの改行で利用されます。 |
vbNewLine | プラットフォームで指定した改行文字で現在のプラットフォームで適切ないずれかを使用します。 |
vbTab | タブ文字を表します。 |
vbBack | バックスペース文字を表します。 |
vbNullChar | NULL文字(文字なしで値0を持つ文字)を表します。 |
定数の適用範囲(スコープ)
定数も変数の適用範囲(スコープ)と同様に適用範囲があります。定数で利用できるキーワードは「Private」と「Public」の2種類になります。キーワードはConstステートメントの先頭に記述することで利用できます。それでは、それぞれどのように処理されるか確認してみましょう。
キーワードPrivate
Module1
Private Const TAX As Single = 0.08
Sub sampleA()
MsgBox "みかんの消費税は" & 100 * TAX & "円
End Sub
Module2
Sub sampleB()
MsgBox "ばななの消費税は" & 200 * TAX & "円
End Sub
Module2のsampleBプロシージャを実行した結果です。
キーワードPrivateで宣言した定数はモジュール内のみで有効となります。Module2のsampleBプロシージャは他のモジュールですので、sampleBプロシージャを実行するとエラーは起こりませんが、TAXは変数扱いで0となってしまいます。よって計算結果は「0円」となります。
尚、定数の既定値はキーワードPrivateになりますので、キーワードを記述しない場合は常にキーワードPrivateが適用されます。
キーワードPublic
Module1
Public Const TAX As Single = 0.08
Sub sampleA()
MsgBox "みかんの消費税は" & 100 * TAX & "円
End Sub
Module2
Sub sampleB()
MsgBox "ばななの消費税は" & 200 * TAX & "円
End Sub
Module2のsampleBプロシージャを実行した結果です。
キーワードPublicで宣言した定数はすべてのモジュール内で有効となります。ですので、Module2のsampleBプロシージャを実行するとTAXは定数TAX扱いとなり、0.08が代入され、計算結果は「16円」となります。
まとめ
今回は、定数や定数の有効範囲について解説しました。複雑なプログラムほど多くの変数を利用します。規模が大きければ大きいほどバグも多数発生しますので、バグをなるべく少なくするためにも値を変える必要のない変数は定数として設定するようにしましょう。次回は、エクセルVBAの演算子について解説します。
次の記事: VBAの演算子とは >>
近田 伸矢, 植木 悠二, 上田 寛
IEのデータ収集&自動操作のプログラミング本はこの1冊だけ!IEの起動やポップアップウィンドウ、表示を制御する基本的なコードはもちろん、テキストボックスやラジオボタン、表、ハイパーリンクなどのHTML部品を制御する方法など、自動操作に欠かせないノウハウを丁寧に解説。