エクセルVBAで使うコードの備忘録。VBAにおける定数を宣言する方法について。特にグローバル・パブリック定数をうまく使ってプログラムの変更を柔軟にできるようにしましょう(ローカル・グローバル・パブリックの違いについてはこちらを参照)。
定数とは?
まず、VBAにおける定数とは何かですが、簡単に言うと「当初に決めた値を変更することができない変数」のようなもののことです。ある特定の値に自分で名前を付けるような感じです。定数を使用することのメリットは、「プログラムの可読性を上げられること」やプ「ログラムの変更を行いやすくすること」などが挙げられます。
定数宣言の方法
VBA内で定数を宣言する方法は、通常の変数宣言とほとんど同じですが、(1)「Dim」の代わりに「Const」を使用する点と、(2)宣言時に値を与える点、が異なります。
定数の宣言
Const [変数名] As [変数型] = [定数の値]
「Long型値100を持つ定数Hundred」を宣言する具体例を下記で見てみましょう。
'--- Long型値100を持つ定数Hundredを宣言 ---'
Const Hundred As Long = 100
定数を利用してプログラムの変更を容易にする
VBAを使用したExcelツールの作成では、エクセルシート上に入力した値をVBAで読み込んで計算しその結果をまたエクセルシート上に出力するといったことを頻繁に行います。通常、シートからVBAでデータを読み込むセルの場所は変わらないように設計することが望ましいですが、どうしても柔軟に読み込みセルを変更できるように設計したい場合もあります。そのようなときにはグローバル定数としてデータの読み込みセルのアドレスを宣言しておくとのちの変更が容易に行えます。
グローバル定数を利用する例
'--- グローバル定数の宣言(データ読み込みシート名とセルのアドレス) ---'
Private Const DATA_SHEET_NAME = "sheet1"
Private Const DATA_ADDRESS = "C3"
'--- TestFunction1と2でそれぞれ上記のセルからデータを読み込む ---'
Private Sub TestFunction1()
'--- valにデータを取得 ---'
Dim val as Variant
val = Thisworkbook.Worksheets(DATA_SHEET_NAME).Range(DATA_ADDRESS).Value
...
End Sub
Private Sub TestFunction2()
'--- valにデータを取得 ---'
Dim val as Variant
val = Thisworkbook.Worksheets(DATA_SHEET_NAME).Range(DATA_ADDRESS).Value
...
End Sub
このようにしておけば、後々データを取得するシートの名前をsheet1から例えば「data」という名前のシートに変更したとしても、モジュール冒頭に宣言されているグローバル定数の値を変更するだけですべての変更が終わります。
もし、グローバル定数を利用せずに各プロシージャごとに直接”sheet1″という値を与えていたらどうなるか。シート名の変更に合わせて複数個所の変更が必要になります。上記の例では定数を使用しなくても変更箇所は2ヶ所だけですが、これがもっと多くなると管理しきれなくなります。1っか所でも変更を忘れるとプログラムの誤作動につながるので、このようなリスクを少しでも軽減するために定数を活用することをお勧めします。
ちなみに、各モジュールごとにグローバル定数を宣言して使用するのもよい方法ですが、場合によっては定数の宣言のみがなされているモジュールを別途作成して、モジュール横断的に使用できる定数を使うこと一考の価値ありです。