はじめに
VBAでプログラミングを始めるにあたり、最初に理解すべき最も重要な概念の一つが「変数」と「定数」です。これらは、数値や文字列といったデータを一時的に格納しておくための「箱」のようなものです。
- 変数 (Variable): 中身を自由に入れ替えられる箱 📦
- 定数 (Constant): 一度入れたら中身を変えられない箱 🗃️
さらに、これらの箱が「どこから見えるか、どこで使えるか」という**スコープ(適用範囲)**の概念を理解することで、より構造化された、バグの少ないプログラムを書けるようになります。
この記事では、VBAの基本である変数と定数の使い方、そしてそのスコープについて、初心者の方にも分かりやすく解説します。
1. 変数 (Variable) とは?
変数とは、プログラムの実行中に値が変化する可能性のあるデータを格納するためのものです。
変数の宣言 (Dim
)
VBAでは、Dim
(Dimensionの略) というキーワードを使って変数を宣言するのが基本です。
Dim 変数名 As データ型
- データ型: 変数に入れるデータの種類(整数、文字列など)を指定します。代表的なデータ型には以下のようなものがあります。
String
: 文字列Long
: 整数(大きな数も扱える)Double
: 小数Boolean
:True
かFalse
Range
: セル範囲などのオブジェクトVariant
: あらゆる種類のデータを格納できる(便利な反面、意図しない型になりやすく注意が必要)
サンプルコード
' 変数を使ってみる
Sub UseVariables()
' 変数を宣言
Dim staffName As String
Dim itemCount As Long
Dim targetCell As Range
' 変数に値を代入
staffName = "田中 宏"
itemCount = 150
Set targetCell = Worksheets("Sheet1").Range("A1") ' オブジェクトはSetで代入
' 変数の値をセルに書き込む
targetCell.Value = staffName & "さんの在庫数は " & itemCount & " 個です。"
End Sub
解説: Dim
で3つの異なる型の変数を宣言し、それぞれに値を代入しています。オブジェクト型(Range
など)の変数に値を代入する際は、Set
キーワードが必要になるのがポイントです。
2. 定数 (Constant) とは?
定数とは、プログラムの中で決して変わることのない固定値を格納するものです。消費税率や、特定のファイルパス、会社名など、固定して使いたい値に名前を付けるのに便利です。
定数の宣言 (Const
)
Const
というキーワードを使って宣言します。定数名は、慣習的に大文字のスネークケース(例: TAX_RATE
)で書かれることが多いです。
Const 定数名 As データ型 = 値
サンプルコード
' 定数を使ってみる
Sub UseConstants()
' 定数を宣言
Const COMPANY_NAME As String = "株式会社テックサンプル"
Const SALES_TAX_RATE As Double = 0.1
Dim price As Long
price = 5000
' 定数を使って計算し、メッセージボックスに表示
MsgBox COMPANY_NAME & vbCrLf & _
"税込価格: " & price * (1 + SALES_TAX_RATE) & "円"
' 定数に再代入しようとするとエラーになる
' SALES_TAX_RATE = 0.12 ' <- この行はコンパイルエラーになる
End Sub
解説: 定数として宣言した SALES_TAX_RATE
は、プログラムの途中で変更しようとするとエラーになります。これにより、誤って重要な値を書き換えてしまうのを防げます。
3. 変数のスコープ(適用範囲)
変数がどこからアクセスできるかは、その変数が「どこで宣言されたか」によって決まります。これをスコープと呼びます。
プロシージャレベルの変数
Sub
や Function
の中でDim
を使って宣言された変数です。そのプロシージャが終了すると消滅し、他のプロシージャからはアクセスできません。
Sub ProcedureScopeExample1()
Dim localValue As Long
localValue = 100
MsgBox "プロシージャ1での値: " & localValue
End Sub
Sub ProcedureScopeExample2()
' 下の一行はエラーになる!
' ProcedureScopeExample1のlocalValueは見えないため。
' MsgBox localValue
End Sub
モジュールレベルの変数
モジュールの先頭(Sub
の外)でDim
またはPrivate
を使って宣言された変数です。そのモジュール内に書かれた全てのプロシージャからアクセス可能です。
' モジュールの先頭で変数を宣言
Private moduleValue As Long
Sub ModuleScopeExample1()
moduleValue = 50
MsgBox "プロシージャ1が値を設定しました: " & moduleValue
End Sub
Sub ModuleScopeExample2()
' ProcedureScopeExample1で設定した値が見える
moduleValue = moduleValue + 10
MsgBox "プロシージャ2での値: " & moduleValue ' 結果は60
End Sub
解説: ModuleScopeExample1
で moduleValue
に代入した 50
という値は、ModuleScopeExample2
からも参照・変更できています。このように、複数のプロシージャで同じ値を共有したい場合にモジュールレベルの変数を使います。
まとめ
今回は、VBAプログラミングの基礎となる変数と定数、そしてスコープについて解説しました。
- 変数 (
Dim
): 変わる可能性のある値を入れる箱。 - 定数 (
Const
): 変わらない固定値を入れる箱。 - スコープ:
- プロシージャレベル: そのプロシージャ内だけで有効。
- モジュールレベル: そのモジュール全体で有効。
これらの概念を正しく使い分けることが、バグが少なく、メンテナンスしやすいコードを書くための第一歩です。