Excel VBA:データ型と変数の使い方
音声
目次
主要なデータ型(String、Integer、Long、Double、Boolean、Date)
今回できるようになることとして、主要なデータ型を使い分けて安全に値を扱えるようになります。
Excel VBAでは文字列はString、整数はInteger/Long、実数はDouble、真偽はBoolean、日付はDateとして扱います。
Integerは-32,768〜32,767の範囲で、行数や金額の累積がそれを超える可能性がある場合はLongを使うのが一般的です。
Doubleは小数の計算や統計計算向けで、誤差については浮動小数点の特徴があることを理解すると便利です。
Dateは内部的には数値なので計算やフォーマット変換が可能です。
マクロを保存する際はブックを「マクロ有効ブック(.xlsm)」で保存し、Excelの設定でマクロを有効にしてから実行することを先回りして説明します。
最小マクロ:
Option Explicit
Sub 最小サンプル()
Dim s As String
Dim i As Integer
Dim l As Long
Dim d As Double
Dim f As Boolean
Dim dt As Date
s = "Hello"
i = 10
l = 100000
d = 3.14
f = (i > 5)
dt = Date
Range("A1").Value = s & " " & CStr(i)
Range("A2").Value = l
Range("A3").Value = d
Range("A4").Value = IIf(f, "True", "False")
Range("A5").Value = dt
End Sub
貼り付け場所:標準モジュール(VBEで「挿入」→「標準モジュール」)に貼り付けると扱いやすいです。
ThisWorkbookやシートモジュールは用途が違うため、まずは標準モジュールをおすすめします。
変数のスコープ(プロシージャレベル、モジュールレベル、パブリック)
プロシージャ内で宣言した変数(Dim)は、そのプロシージャ内だけで有効です(プロシージャレベル)ので、名前の衝突が起きにくくなります。
モジュールの先頭にDimやPrivateを置くと、そのモジュール内のすべてのプロシージャで共有できます(モジュールレベル)です。Publicで宣言するとプロジェクト全体で使えるため、複数のモジュールやシートから参照できるようになりますが、管理が難しくなるので最小限にするのが実務ではよいです。
例えば、処理回数を複数プロシージャで使うときはモジュールレベルやPublicを使いますが、局所的な計算用はプロシージャレベルに留めるのが混乱を避けるコツです。
実行方法は、VBE(Alt+F11)でマクロ名を選んでF5キーで実行するか、ワークシート上のボタンに割り当てることができます。ボタンに割り当てる場合はフォームコントロールやActiveXを使う方法がありますが、まずはVBE内で実行して動作確認するのが早いです。
' モジュール先頭に記述する例(標準モジュール)
Public gCounter As Long
Private mLastRun As Date
Const VERSION As String = "1.0"
Sub 増やす()
gCounter = gCounter + 1
mLastRun = Now
MsgBox "回数: " & gCounter & " 実行時刻: " & CStr(mLastRun)
End Sub
定数(Const)の活用方法
定数(Const)はプログラム内で値を固定して使いたいときに有効です。税率やAPIのエンドポイント、処理の上限値などをConstで定義しておくと、後から修正箇所を探す手間が減ります。
定数はモジュールレベルやPublicで宣言可能で、再代入ができないため安全性が上がります。複数シートや複数モジュールで使う値はPublic Constで宣言しておくと可読性が高まります。
定数名は大文字とアンダースコアを混ぜた読みやすい名前にすると変更履歴が追いやすくなります。
確認方法:処理後にセルやMsgBoxで定数を参照している値が反映されているかを確認します。例えばA1に税抜価格、A2に税込価格を表示するなどで結果を視認できます。デバッグ中はDebug.Printでイミディエイトウィンドウに出力すると繰り返し確認が楽になります。
型変換関数(CStr、CInt、CLng、CDbl)の使い分け
型変換関数は入力が文字列で来る場合や、Variant型から明示的に型を変えたい場合に使います。CStrは文字列変換、CIntは整数(Integer)への変換、CLngはLongへの変換、CDblはDoubleへの変換です。数値が大きくなり得る場合はCIntでオーバーフローするリスクがあるため、CLngを使うと安全です。Doubleへの変換は小数点を保ちたい場合に使いますし、Booleanへの変換は直接CBoolを使うと明確になります。外部入力やセルの値はVariantで来ることが多いため、適切に変換してから計算に使うと型エラーを避けられます。
よくあるミスは、Integerで大きなカウントを扱ってオーバーフローが発生するケースです。原因はIntegerの範囲超過で、直し方は宣言をLongに変更するか、CLngで明示的に変換することです。
使い分けの基準は、RangeとCellsの使い分けは可読性と動的参照で判断します。セル範囲を直接指定する固定処理ならRange("A1")が読みやすく、行列をループで扱うならCells(row, col)が便利です。ValueとValue2の違いは細かい型の扱いで、Value2は日付をDoubleで返すため処理が速い一方、通貨型や日付の厳密な型を保持したいときはValueを使うと安全です。データ型そのものは、整数カウントはLong、見た目はString、少数計算はDouble、真偽判定はBoolean、日付はDateと選ぶ基準に従うと混乱が減ります。
注意(ここだけ)
最小マクロ:マクロを動かすにはブックを「.xlsm」で保存し、Excelの「ファイル」→「オプション」→「セキュリティセンター」→「マクロの設定」で必要に応じて有効化したうえで実行してください。
要約
- String、Integer、Long、Double、Boolean、Dateは用途に応じて使い分けることが安定動作の鍵です。
- 変数のスコープは局所化を基本にし、共有が必要な場合だけモジュールレベルやPublicを使うと管理しやすくなります。
- Constで変更点を集中管理すると保守性が上がります。
- 型変換は入力の性質に合わせてCStr/CInt/CLng/CDblを使い、オーバーフローや型エラーを防ぎます。
- 最初は標準モジュールにコードを置き、.xlsmで保存してVBEから実行し、MsgBoxやセルで結果を確認する流れを身につけると効率的です。