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
VBAの定数

定数のメリット

定数を利用するメリットとしては、上記でも説明したバグを無くす以外にもいくつかあります。

宣言以外では値の変更ができない

定数では、宣言時に設定した値を途中で変更することができません。消費税率のような固定値の場合は、変数を利用するより定数として利用するほうが途中で誤って値を変更してしまうこともありません

入力ミスが軽減される

プログラムの中では数値がよく利用されます。そういった場合に数値を直接利用するよりは定数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関数の定数一覧です。このように様々な定数が組み込み定数として存在します。

定数内容
vbOKOnly0[OK] ボタンのみを表示します。
vbOKCancel1[OK] ボタンと [キャンセル] ボタンを表示します。
vbAbortRetryIgnore2[中止]、[再試行]、および [無視] の 3 つのボタンを表示します。
vbYesNoCancel3[はい]、[いいえ]、および [キャンセル] の 3 つのボタンを表示します。
vbYesNo4[はい] ボタンと [いいえ] ボタンを表示します。
vbRetryCancel5[再試行] ボタンと [キャンセル] ボタンを表示します。
vbCritical16警告メッセージ アイコンを表示します。
vbQuestion32問い合わせメッセージ アイコンを表示します。
vbExclamation48注意メッセージ アイコンを表示します。
vbInformation64情報メッセージ アイコンを表示します。
vbDefaultButton10第 1 ボタンを標準ボタンにします。
vbDefaultButton2256第 2 ボタンを標準ボタンにします。
vbDefaultButton3512第 3 ボタンを標準ボタンにします。
vbDefaultButton4768第 4 ボタンを標準ボタンにします。
vbApplicationModal0アプリケーション モーダルに設定します。メッセージ ボックスに応答するまで、現在選択中のアプリケーションの実行を継続できません。
vbSystemModal4096システム モーダルに設定します。メッセージ ボックスに応答するまで、すべてのアプリケーションが中断されます。
vbMsgBoxHelpButton16384ヘルプ ボタンを追加します。
VbMsgBoxSetForeground65536最前面のウィンドウとして表示します。
vbMsgBoxRight524288テキストを右寄せで表示します。
vbMsgBoxRtlReading1048576テキストを、右から左の方向で表示します。

条件付きコンパイラ定数

条件付きコンパイラ定数は、条件付きコンパイルで利用される定数です。条件付きコンパイルとは、設定値に応じて、実行される部分を変更することができる記述方法で、本番・テスト環境の切り替えや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バックスペース文字を表します。
vbNullCharNULL文字(文字なしで値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キーワード

キーワード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キーワード

キーワードPublicで宣言した定数はすべてのモジュール内で有効となります。ですので、Module2のsampleBプロシージャを実行するとTAXは定数TAX扱いとなり、0.08が代入され、計算結果は「16円」となります。

まとめ

今回は、定数や定数の有効範囲について解説しました。複雑なプログラムほど多くの変数を利用します。規模が大きければ大きいほどバグも多数発生しますので、バグをなるべく少なくするためにも値を変える必要のない変数は定数として設定するようにしましょう。次回は、エクセルVBAの演算子について解説します。

次の記事: VBAの演算子とは >>

Excel VBAでIEを思いのままに操作できるプログラミング術 Excel 2013/2010/2007/2003対応

近田 伸矢, 植木 悠二, 上田 寛

IEのデータ収集&自動操作のプログラミング本はこの1冊だけ!IEの起動やポップアップウィンドウ、表示を制御する基本的なコードはもちろん、テキストボックスやラジオボタン、表、ハイパーリンクなどのHTML部品を制御する方法など、自動操作に欠かせないノウハウを丁寧に解説。

  • このエントリーをはてなブックマークに追加
ExcelのVBAについてのQ&A掲示板

↑ExcelのVBA全般について分からない事があればこちらの掲示板よりご質問ください^^

VBAのInternetExplorer操作入門

↑ExcelのVBAをマスターできたら、エクセルVBAのIE(InternetExplorer)操作にも挑戦してみてください^^

VBAのIE制御入門RSS

RSSフィードを登録すると最新記事を受け取ることができます。

VBAIE操作のスカイプレッスン

エクセルVBAのステートメント

こちらでは、エクセルVBAの事例で利用したステートメントをまとめたものです。ExcelのVBAには様々な機能が用意されていますので一度ご確認ください。

エクセルVBAのオブジェクト

こちらでは、エクセルVBAの事例で利用したオブジェクトをまとめたものです。ExcelのVBAには様々な機能が用意されていますので一度ご確認ください。

エクセルVBAのプロパティ

こちらでは、エクセルVBAの事例で利用したオブジェクトのプロパティをまとめたものです。ExcelのVBAには様々な機能が用意されていますので一度ご確認ください。

エクセルVBAのメソッド

こちらでは、エクセルVBAの事例で利用したオブジェクトのメソッドをまとめたものです。ExcelのVBAには様々な機能が用意されていますので一度ご確認ください。

エクセルVBAのイベント

こちらでは、エクセルVBAの事例で利用したオブジェクトのイベントをまとめたものです。ExcelのVBAには様々な機能が用意されていますので一度ご確認ください。