VBA Dimの使い方|変数宣言の基本・データ型一覧をコード例で解説

VBAのコードを見ると「Dim」って書いてあるけど、これって何だろう?と思ったことはありませんか?
VBAでマクロを書くとき、必ずと言っていいほど登場するのが「Dim」です。Dimは変数を宣言するためのステートメントで、VBAの基礎中の基礎にあたります。
この記事では、VBA初心者の方でもDimの使い方が完全に理解できるよう、基本構文からデータ型の一覧、変数のスコープまでをコード例付きで丁寧に解説します。
なお、VBAマクロの基礎をこれから学びたい方は、先にExcelVBAおすすめ入門ガイドをご覧いただくとスムーズです。
VBAのDimとは?変数宣言の基本を理解しよう
Dimは「Dimension(次元)」の略
Dimは「Dimension(ディメンション=次元)」の略語です。もともとはFORTRAN言語で配列の次元を宣言するために使われていたキーワードで、それがBASIC言語に引き継がれ、VBAでは変数全般を宣言するステートメントとして定着しました。
つまり「Dim」と書くことで、「これから使う変数の名前と型を宣言しますよ」とVBAに伝えているのです。
変数とは「データを一時的に入れる箱」
変数とは、プログラムの実行中にデータを一時的に格納しておく「箱」のようなものです。
| 日常の例 | VBAの変数 |
|---|---|
| 名前を書くメモ帳 | String型の変数 |
| 計算結果を控える電卓 | Long型・Double型の変数 |
| Yes/Noで答えるチェックリスト | Boolean型の変数 |
変数を使うことで、セルの値を一時的に保持したり、計算結果を次の処理に渡したりできます。
なぜ変数宣言が必要なのか
変数宣言には次の3つの重要なメリットがあります。
- メモリの効率化: データ型を指定することで、必要最小限のメモリだけを確保できます
- バグの防止: タイプミスがあった場合にエラーで教えてくれます(Option Explicit使用時)
- コードの可読性向上: 変数の用途が明確になり、他の人がコードを読みやすくなります

変数宣言をサボると、後から原因不明のバグに悩まされることがあります。必ず宣言する習慣をつけましょう!
Dimの基本的な書き方と構文
「Dim 変数名 As データ型」の基本構文
Dimの構文はとてもシンプルです。
Dim 変数名 As データ型具体的な例を見てみましょう。
Sub SampleBasicDim()
' 文字列型の変数を宣言
Dim userName As String
' 整数型の変数を宣言
Dim rowCount As Long
' 真偽値型の変数を宣言
Dim isComplete As Boolean
' 値を代入して使う
userName = "田中太郎"
rowCount = 100
isComplete = True
' メッセージ表示
MsgBox userName & "さんのデータ: " & rowCount & "行"
End SubDimのあとに変数名、Asのあとにデータ型を書くだけです。
複数の変数を1行で宣言する方法と注意点
カンマ区切りで1行に複数の変数を宣言できます。ただし、よくある間違いがあるので注意してください。
Sub SampleMultipleDim()
' --- 正しい書き方 ---
Dim i As Long, j As Long, k As Long
' --- 間違いやすい書き方(注意!) ---
Dim a, b, c As Long
' ↑ aとbはVariant型になり、cだけがLong型
' 各変数にAsで型を指定する必要がある
End Sub
「Dim a, b, c As Long」と書くと全部Long型になりそうですが、実はaとbはVariant型です。VBA特有の落とし穴なので気をつけてください!
| 書き方 | aの型 | bの型 | cの型 |
|---|---|---|---|
Dim a, b, c As Long | Variant | Variant | Long |
Dim a As Long, b As Long, c As Long | Long | Long | Long |
変数名の命名規則
VBAの変数名には以下のルールがあります。
- 先頭は英字(アルファベット)で始める必要がある
- 使える文字は英数字とアンダースコア(_)
- 半角255文字以内(日本語変数名も使えるが非推奨)
- VBAの予約語(Sub、Dim、If など)は使えない
- 大文字・小文字は区別されない(myVar と MyVar は同じ変数)
実務では、変数の役割がわかる名前をつけるのがベストプラクティスです。
| 悪い例 | 良い例 | 理由 |
|---|---|---|
x | rowCount | 何の数値かわかる |
a | userName | 何の文字列かわかる |
flg | isComplete | 真偽値であることが明確 |
LINEでExcelを気軽に学べる
VBAのデータ型一覧と使い分け【早見表】
よく使うデータ型3選(Long・String・Boolean)
VBAにはさまざまなデータ型がありますが、実務で使う頻度が高いのは次の3つです。
- Long(長整数型): 整数を扱うときはほぼLong一択
- String(文字列型): セルのテキストやファイルパスの格納に
- Boolean(ブール型): 条件フラグ(True / False)の管理に
まずはこの3つを押さえておけば、多くの場面に対応できます。
以下がVBAの主要データ型の一覧表です。
| データ型 | 格納できる値 | サイズ | 値の範囲 | 主な用途 |
|---|---|---|---|---|
| Byte | 正の整数 | 1バイト | 0〜255 | バイナリデータ |
| Integer | 整数 | 2バイト | -32,768〜32,767 | ※Long推奨 |
| Long | 整数 | 4バイト | 約-21億〜21億 | 行番号・カウンタ |
| Single | 小数 | 4バイト | 有効桁数7桁 | 簡易的な小数計算 |
| Double | 小数 | 8バイト | 有効桁数15桁 | 精密な小数計算 |
| Currency | 通貨 | 8バイト | 小数4桁固定 | 金額計算 |
| String | 文字列 | 可変 | 最大約20億文字 | テキスト全般 |
| Boolean | 真偽値 | 2バイト | True / False | フラグ・条件判定 |
| Date | 日付・時刻 | 8バイト | 100/1/1〜9999/12/31 | 日付処理 |
| Object | オブジェクト参照 | 4バイト | 任意のオブジェクト | シート・ブック操作 |
| Variant | 何でも | 16バイト以上 | すべての型に対応 | 型不定の場合のみ |
数値型の使い分け(Integer / Long / Double / Currency)
整数を扱う場合はLong型を使ってください。Integer型は範囲が狭い(-32,768〜32,767)うえ、VBAの内部処理ではInteger型もLong型に変換されるため、パフォーマンス上のメリットがありません。
Sub SampleNumericTypes()
Dim rowNum As Long ' 行番号(Longを使う)
Dim price As Currency ' 金額(通貨型で誤差防止)
Dim rate As Double ' 割合・税率(小数を扱う)
rowNum = Cells(Rows.Count, 1).End(xlUp).Row
price = 1980
rate = 0.1
MsgBox "最終行: " & rowNum & vbCrLf & _
"税込価格: " & price * (1 + rate)
End Sub文字列型(String)の特徴
String型はセルのテキスト取得やファイルパスの格納など、最も幅広く使われる型のひとつです。宣言時の初期値は空文字列("")です。
日付型(Date)・ブール型(Boolean)の使いどころ
- Date型: 日付や時刻の計算(経過日数の算出など)に便利です。VBAの日付操作について詳しくはVBAで今日の日付を取得する方法も参考にしてください。
- Boolean型: 処理の実行フラグやIF文の条件判定に使います。TrueまたはFalseの2値のみ格納できます。
Variant型は使うべき?メリットと注意点
Variant型とは(型指定を省略した場合の挙動)
Variant型は「何でも入る万能型」です。データ型を省略してDim xと書くと、自動的にVariant型になります。
Sub SampleVariant()
' 以下はすべてVariant型になる
Dim value1 ' As を省略 → Variant
Dim value2 As Variant ' 明示的にVariant
' 何でも代入できる
value1 = 100 ' 数値
value1 = "テスト" ' 文字列に変わる
value1 = #2026/1/1# ' 日付に変わる
End SubVariant型のデメリット(メモリ・速度・バグの温床)
Variant型には以下のデメリットがあります。
- メモリ消費が大きい: 16バイト以上(Long型の4倍)
- 処理速度が遅い: 実行時に型判定が発生する
- バグを見逃しやすい: 型の不一致でエラーにならないため、意図しない動作を見つけにくい
Variant型を使ってもよいケース
ただし、以下のケースではVariant型が適切です。
- セルの値を取得するとき(セルには数値・文字列・エラー値など様々な型が入り得る)
- 配列を動的に扱うとき
- ワークシート関数の戻り値を受け取るとき
変数の初期化と値の代入方法
各データ型の初期値
VBAでは、変数を宣言した時点で自動的に初期値が設定されます。
| データ型 | 初期値 |
|---|---|
| Long / Integer / Double 等の数値型 | 0 |
| String | “”(空文字列) |
| Boolean | False |
| Date | 1899/12/30(シリアル値0) |
| Object | Nothing |
| Variant | Empty |
値の代入(=による代入)
通常の変数(数値・文字列・日付など)には、=(イコール)で値を代入します。
オブジェクト変数とSet文の使い方
ワークシートやセル範囲などのオブジェクト型の変数には、Setキーワードを使って代入する必要があります。Setを使わないとエラーになります。
Sub SampleSetStatement()
' オブジェクト変数の宣言
Dim ws As Worksheet
Dim rng As Range
Dim wb As Workbook
' Setで代入(オブジェクトはSetが必要)
Set ws = ThisWorkbook.Sheets("Sheet1")
Set rng = ws.Range("A1:D10")
Set wb = ThisWorkbook
' オブジェクトのプロパティにアクセス
MsgBox "シート名: " & ws.Name & vbCrLf & _
"セル数: " & rng.Cells.Count
' 使い終わったらNothingを代入(推奨)
Set ws = Nothing
Set rng = Nothing
Set wb = Nothing
End Sub
DimとSetの違いをまとめると、Dimは「箱を用意する(宣言)」、Setは「箱にオブジェクトを入れる(代入)」です。数値や文字列にはSetは不要です!
| 操作 | 通常の変数(数値・文字列) | オブジェクト変数 |
|---|---|---|
| 宣言 | Dim x As Long | Dim ws As Worksheet |
| 代入 | x = 100 | Set ws = Sheets("Sheet1") |
| 解放 | 不要(自動) | Set ws = Nothing |
VBAのプロシージャ(SubやFunction)の基本構造については、VBAのFunctionとSubプロシージャの違いで詳しく解説しています。
Option Explicitで変数宣言を強制する方法
Option Explicitとは
Option Explicitは、モジュールの先頭に記述するステートメントで、すべての変数にDim宣言を強制するための設定です。
Option Explicitを記述していないと、宣言していない変数名を使ってもエラーにならず、自動的にVariant型として新しい変数が作られます。これが深刻なバグの原因になります。
Option Explicit ' ← モジュールの一番上に書く
Sub SampleOptionExplicit()
Dim totalCount As Long
totalCount = 10
' スペルミス: totalCaunt → 宣言されていない変数なのでエラーになる
' Option Explicitがなければエラーにならず、0が入ったまま処理が進んでしまう
MsgBox totalCaunt ' ← コンパイルエラー「変数が定義されていません」
End SubVBEでの設定手順
毎回手動でOption Explicitを書かなくても、VBE(Visual Basic Editor)の設定で自動挿入できます。
- VBEを開く(Alt + F11)
- メニューから ツール → オプション を選択
- 編集 タブの「変数の宣言を強制する」にチェックを入れる
- OKをクリック
この設定を行うと、新規モジュールを作成したときに自動的にOption Explicitが挿入されます。

Option Explicitは必ず設定しておきましょう。VBA開発の基本中の基本です!
宣言を強制するメリット
- タイプミスを即座に検出: 宣言していない変数名を使うとコンパイルエラーになる
- 意図しないVariant型を防止: 必ず型を意識して宣言するようになる
- デバッグ時間の大幅短縮: バグの原因が変数のスペルミスだった、という事態を防げる
変数のスコープ(適用範囲)を理解しよう
変数にはスコープ(有効範囲)があり、宣言する場所やキーワードによって、どこから参照できるかが変わります。
プロシージャレベル変数(Dim)
プロシージャ(Sub / Function)の内部でDimを使って宣言した変数は、そのプロシージャ内でのみ有効です。プロシージャの実行が終わると、変数の値は破棄されます。
Sub ProcedureA()
Dim localVar As Long
localVar = 100
MsgBox localVar ' → 100が表示される
End Sub
Sub ProcedureB()
' localVarはProcedureAの中でだけ有効
' ここでlocalVarを使うとエラーになる
MsgBox localVar ' → コンパイルエラー
End Subモジュールレベル変数(Private / Dim)
モジュールの先頭(プロシージャの外側)で宣言すると、そのモジュール内のすべてのプロシージャから参照できます。PrivateとDimはモジュール先頭では同じ意味です。
Option Explicit
' モジュールレベル変数(このモジュール内のどのプロシージャからも使える)
Private moduleVar As String
Dim anotherModuleVar As Long ' Dimでも同じ効果
Sub SetValue()
moduleVar = "テストデータ"
anotherModuleVar = 50
End Sub
Sub GetValue()
MsgBox moduleVar ' → "テストデータ"
MsgBox anotherModuleVar ' → 50
End Subグローバル変数(Public)
Publicで宣言した変数は、プロジェクト内のすべてのモジュールから参照できます。
' Module1の先頭
Public globalUserName As String
' --- Module2 ---
Sub UseGlobalVar()
globalUserName = "鈴木一郎"
End Sub
' --- Module3 ---
Sub ShowGlobalVar()
MsgBox globalUserName ' → "鈴木一郎"
End SubDim・Private・Publicの使い分け早見表
| キーワード | 宣言場所 | 有効範囲 | 使いどころ |
|---|---|---|---|
| Dim | プロシージャ内 | そのプロシージャのみ | 最も基本的。まずはこれを使う |
| Dim / Private | モジュール先頭 | そのモジュール全体 | モジュール内で値を共有したいとき |
| Public | モジュール先頭 | プロジェクト全体 | 全モジュール共通の設定値など |

スコープは「なるべく狭く」が原則です。まずDimで宣言し、本当に必要な場合だけPrivateやPublicに広げましょう。
VBA Dimでよくあるエラーと対処法
「変数が定義されていません」エラー
原因: Option Explicitが有効な状態で、Dimで宣言していない変数名を使っている。
対処法:
- 変数名のスペルミスがないか確認する
- 使用するすべての変数に
Dim宣言を追加する - 他のプロシージャで宣言した変数を使おうとしていないか確認する(スコープの問題)
「型が一致しません」エラー(実行時エラー13)
原因: 変数のデータ型と代入する値の型が合わない。
対処法:
- 数値型の変数に文字列を代入していないか確認する
- セルの値を取得する際、セルが空やエラーの可能性がある場合はVariant型で受け取る
- 型変換関数(
CLng()、CStr()、CDbl()など)を使う
複数変数の1行宣言で型がVariantになる罠
前述のとおり、Dim a, b, c As Longと書くとaとbはVariant型になります。これはVBA特有の仕様で、他の言語(VB.NETなど)とは異なるため特に注意が必要です。
対処法: 必ず各変数にAs句で型を指定してください。
' NG: aとbがVariant型になる
Dim a, b, c As Long
' OK: すべてLong型
Dim a As Long, b As Long, c As Long
' OK: 1行ずつ書くのも明確でよい
Dim a As Long
Dim b As Long
Dim c As LongDim宣言の動作をデモで確認
変数宣言と値の代入がどのように動作するか、下のインタラクティブデモで確認できます。
Sub 変数宣言デモ()
Dim myName As String
Dim myAge As Long
Dim myScore As Double
Dim isActive As Boolean
myName = “田中太郎”
myAge = 30
myScore = 85.5
isActive = True
MsgBox myName & ” / “ & myAge & ” / “ & myScore
End Sub
| A | B | C | |
|---|---|---|---|
| 1 | 変数名 | 型 | 値 |
| 2 | myName | String | 田中太郎 |
| 3 | myAge | Long | 30 |
| 4 | myScore | Double | 85.5 |
| 5 | isActive | Boolean | True |
☝ 適切な型を指定することでメモリ効率とバグ防止に役立ちます
まとめ:VBA Dim変数宣言のベストプラクティス
VBAのDim(変数宣言)について、基本構文からデータ型、スコープまで解説しました。最後に、実務で押さえておきたいポイントをまとめます。
- 変数は必ずDimで宣言する(Option Explicitを設定しておく)
- データ型は明示的に指定する(Variant型の安易な使用は避ける)
- 整数にはLong型を使う(Integer型は非推奨)
- オブジェクト変数にはSetで代入する(通常の
=ではエラーになる) - スコープは最小限にする(Dim → Private → Publicの順で検討)
- 変数名は意味のある名前をつける(コードの可読性を高める)
Dimはマクロ開発の土台となる知識です。正しい変数宣言の習慣を身につけることで、バグが少なく読みやすいVBAコードを書けるようになります。
VBAの基礎をさらに固めたい方は、SubとFunctionプロシージャの使い分けや今日の日付を取得する方法もあわせてご覧ください。Excel業務の効率化にVBAを活用したい方は、ExcelVBAおすすめ入門ガイドも参考にしてみてください。
よくある質問(FAQ)
Q1. VBAのDimとは何の略ですか?
DimはDimension(次元)の略です。もともとはFORTRAN言語で配列の次元を宣言するために使われていた用語がBASIC言語に引き継がれ、VBAでは変数全般を宣言するステートメントとして使われています。
Q2. VBAで変数を宣言しないとどうなりますか?
変数を宣言せずに使用すると、自動的にVariant型として扱われます。Variant型はメモリ消費が大きく処理速度も遅くなります。また、変数名のタイプミスがあってもエラーにならないため、バグの原因になります。Option Explicitを設定して宣言を強制することを推奨します。
Q3. VBAのInteger型とLong型はどちらを使うべきですか?
Long型を使うべきです。Integer型の範囲は-32,768〜32,767と狭く、現在のVBAでは内部的にInteger型もLong型に変換して処理されるため、パフォーマンス上の利点はありません。整数を扱う場合はLong型を選択してください。
Q4. VBAで複数の変数を1行で宣言できますか?
できます。「Dim a As Long, b As Long, c As String」のようにカンマ区切りで宣言します。ただし「Dim a, b, c As Long」と書くとaとbはVariant型になり、cだけがLong型になるため注意が必要です。各変数にそれぞれAs句で型を指定してください。
Q5. DimとPublicとPrivateの違いは何ですか?
変数の使える範囲(スコープ)が異なります。プロシージャ内のDimはそのプロシージャ内でのみ有効です。モジュール先頭のDim/Privateはそのモジュール内で有効です。Publicは全モジュールから参照できます。基本的にはスコープを最小限にするDimの使用が推奨されます。
Q6. VBAのDimとSetの違いは何ですか?
Dimは変数を宣言するステートメントで、Setはオブジェクト変数にオブジェクトを代入するステートメントです。数値や文字列は「変数名 = 値」で代入しますが、ワークシートやセル範囲などのオブジェクトは「Set 変数名 = オブジェクト」と書く必要があります。
Q7. VBAのVariant型はなぜ避けるべきですか?
Variant型は16バイト以上のメモリを消費し(Long型の4倍)、処理速度が遅くなります。また、どんな値でも格納できるため型の不一致エラーが発生せず、バグが見つかりにくくなります。ただし、セルの値を取得する場合など、型が不定のケースではVariant型が適切です。
