【2026年7月最新】VBAのDim変数宣言完全ガイド|データ型・スコープ・Option Explicit・Claude Code活用法
この記事の内容
VBAでマクロを書く際に「変数って何?」「Dimって何のこと?」という疑問を持つ方は多いです。変数とDim文はVBAプログラミングの基礎中の基礎ですが、データ型の選び方・Option Explicitの設定・スコープの考え方まで理解しないと、後々バグが発生したり処理が遅くなったりする原因になります。
この記事ではVBAの変数とDim文に関する全知識を体系的に解説します。さらにClaude CodeでVBAコードの作成・デバッグを効率化する方法も紹介します。
01 VBA VARIABLE VBAの変数とは?基本と役割 データを一時的に格納して処理で繰り返し使うための「ラベル付き箱」
VBAの変数とは、データを一時的に格納するためのメモリ上の場所に付けた名前です。プログラムの実行中に値を入れたり取り出したりして使います。
例えば「全従業員の給与の合計を計算する」場合、毎回Cells(1,1) + Cells(2,1) + Cells(3,1)...と書くより、変数「totalSalary」に合計値を貯めていく方がコードが読みやすく・修正もしやすくなります。
📚 用語解説
変数(Variable):プログラムで計算途中の値や処理で繰り返し使う値を格納するための名前付きメモリ領域。「変数名 = 値」で値を格納し、「変数名」として参照する。VBAではDim文で変数を宣言してから使うのが正しいルール。変数に格納できるデータの種類(整数・文字列・日付等)を「データ型」と呼ぶ。変数はプロシージャ(Sub/Function)が終了すると内容が消える(スコープに依存)。
' 変数を使わない場合(読みにくい) Sheet1.Cells(1, 1).Value = Sheet1.Cells(2, 1).Value + Sheet1.Cells(3, 1).Value + Sheet1.Cells(4, 1).Value ' 変数を使った場合(読みやすい) Dim totalSalary As Long totalSalary = Sheet1.Cells(2, 1).Value + Sheet1.Cells(3, 1).Value + Sheet1.Cells(4, 1).Value Sheet1.Cells(1, 1).Value = totalSalary
Dim 変数名 As 型
メモリを確保
変数名 = 値
データを格納
計算・比較・出力
値を参照して処理
変数の中身が
メモリから解放
02 DATA TYPES VBAのデータ型一覧:Integer・Long・String・Boolean等 変数に格納できるデータの種類とデータ型の選び方
VBAの変数は宣言時に「どの種類のデータを格納するか」を指定します。これをデータ型と呼びます。適切なデータ型を選ぶことで、処理の安全性・速度・メモリ効率が変わります。
| データ型 | 格納できる値 | メモリ | 使う場面 |
|---|---|---|---|
| Integer | -32,768〜32,767の整数 | 2バイト | 小さい整数のカウンタ・ループ変数 |
| Long | -2,147,483,648〜2,147,483,647の整数 | 4バイト | 大きな整数・行数・件数(Integerが溢れる時) |
| Single | 単精度浮動小数点(約7桁) | 4バイト | 大まかな小数計算 |
| Double | 倍精度浮動小数点(約15桁) | 8バイト | 精度が必要な小数計算・統計 |
| String | 文字列 | 10バイト+文字数 | 名前・住所・テキスト |
| Boolean | True/False | 2バイト | フラグ・条件の結果 |
| Date | 日付と時刻 | 8バイト | 日付・時刻の計算 |
| Object | オブジェクト参照 | 4バイト | WorksheetやRangeの参照 |
| Variant | どんな型でも格納可能 | 16バイト以上 | 型不明の変数(多用を避ける) |
📚 用語解説
IntegerとLongの違い:どちらも整数を格納するデータ型だが、扱える数値の範囲が違う。Integerは-32,768〜32,767(約3万)、Longは-2,147,483,648〜2,147,483,647(約20億)。Excelの最大行数は1,048,576(約100万)なので、行番号を格納する変数はIntegerではオーバーフローするためLongを使う必要がある。VBAの実行速度は32bit環境ではIntegerよりLongの方が速いとも言われ、迷ったらLongを使うのが実務の経験則。
' データ型の宣言例 Dim i As Integer ' ループカウンタ(小さい整数) Dim rowCount As Long ' 行数(Integerでは溢れる可能性) Dim price As Double ' 金額(小数点が必要な場合) Dim userName As String ' 氏名 Dim isActive As Boolean ' フラグ(True/False) Dim targetDate As Date ' 対象日付 Dim ws As Worksheet ' ワークシートへの参照 Dim anything As Variant ' 型不明(多用を避ける)
VBAの変数宣言でデータ型を省略(「Dim x」のみ)すると自動的にVariant型になります。Variantは便利ですが最も多くのメモリを使い、実行速度が遅くなります。大量データを扱うループでVariantを使うと著しく遅くなるため、可能な限り適切なデータ型を明示してください。
03 DIM SYNTAX Dim文で変数を宣言する基本構文 Dim 変数名 As データ型 の書き方と複数変数の宣言方法
VBAで変数を宣言するにはDim文(Dimension文)を使います。「Dim 変数名 As データ型」が基本構文です。
' 基本構文 Dim 変数名 As データ型 ' 例 Dim userName As String Dim count As Long Dim price As Double Dim isValid As Boolean ' 初期値(宣言直後のデフォルト値) ' Numeric型: 0 ' String: "" (空文字) ' Boolean: False ' Date: #00:00:00# ' Object: Nothing
' 複数の変数を宣言する方法 ' 方法1: 1行ずつ宣言(推奨・読みやすい) Dim firstName As String Dim lastName As String Dim age As Integer ' 方法2: カンマ区切りで1行に(簡潔だが長くなりがち) Dim firstName As String, lastName As String, age As Integer ' 注意: 型を省略するとVariantになる Dim a, b As String ' a は Variant(Stringではない!) Dim c As String, d As String ' c も d も String(正しい書き方)
「Dim a, b As String」と書くと「aとbをStringで宣言」しているように見えますが、VBAではaがVariant(型指定なし)、bがStringになります。全てStringにするには「Dim a As String, b As String」と各変数に型を明示する必要があります。VBA初心者が最もよく犯すミスの1つです。
VBAでは変数宣言をSub/Function内のどこでも書けますが、プロシージャの先頭にまとめて書くのがベストプラクティスです。「どんな変数が使われるか」を最初に把握できるため、コードの読みやすさが向上します。
04 NAMING RULES 変数名の命名規則とベストプラクティス VBAの変数名で使える文字・使えない文字と読みやすい命名の方法
VBAの変数名には使える文字と使えない文字があります。また、読みやすいコードにするための命名規則(命名ルール)を守ることも重要です。
| ルール | 詳細 | OK例 | NG例 |
|---|---|---|---|
| 使える文字 | 英数字・アンダースコア(_) | count, user_name, totalAmount | |
| 先頭文字 | 英字またはアンダースコアのみ | total, _count | 1total, 123abc |
| 禁止文字 | スペース・記号(.、,、$等) | user name, total.count | |
| 予約語禁止 | VBAキーワードと同じ名前は不可 | Dim, If, Sub, End | |
| 大文字小文字 | 区別なし(totalとTotalは同じ) | ||
| 文字数上限 | 255文字まで |
📚 用語解説
キャメルケース(camelCase)とスネークケース(snake_case):プログラミングで複数の単語を組み合わせた変数名を書くときの表記ルール。キャメルケースは「totalSalary」「userName」のように2語目以降の先頭を大文字にする(ラクダのこぶのように見えるから)。スネークケースは「total_salary」「user_name」のようにアンダースコアで区切る。VBAではキャメルケースが一般的に使われる。「i」「j」「k」は伝統的にループカウンタに使われる短縮変数名。
' 良い変数名の例(キャメルケース) Dim totalSalary As Long ' 合計給与 Dim customerName As String ' 顧客名 Dim isDataValid As Boolean ' データが有効かフラグ Dim lastUpdatedDate As Date ' 最終更新日 Dim rowCount As Long ' 行数カウンタ ' 悪い変数名の例 Dim x As Long ' 何を表すか不明 Dim a1 As String ' 意味が分からない Dim data As Variant ' 「data」は広すぎて曖昧 Dim tmp As Double ' tmpは何の一時変数か分からない
変数名は「3ヶ月後の自分が読んでも分かるか」を基準に付けてください。「i」はループカウンタという文脈があるので許容されますが、「x」や「a」のような単文字変数名は何を格納しているか分かりません。「totalAmount(合計金額)」「isEmailValid(メールが有効かフラグ)」のように、変数名自体が説明になるのが理想です。
05 OPTION EXPLICIT Option Explicitで変数宣言を強制する 変数名のタイポバグを防ぐOption Explicitの設定方法と効果
VBAのデフォルト設定では、変数をDimで宣言せずにいきなり使うことができます。しかし、これはタイポ(誤字)によるバグの温床になります。Option Explicitを設定すると、宣言していない変数を使用した時点でコンパイルエラーになり、バグを防げます。
📚 用語解説
Option Explicit(変数宣言の強制):VBAモジュールの先頭に書く命令。「Option Explicit」が設定されているモジュールでは、Dim/Public/Private等で宣言していない変数を使うとコンパイルエラー「変数が定義されていません」が発生する。スペルミスによる暗黙の変数生成(タイポバグ)を防ぐことができる。VBAを業務で使う全てのプログラマーが設定すべきベストプラクティス。
' Option Explicitなし(デフォルト)の場合
Sub BadExample()
totalSalary = 100000 ' 宣言なしで使える(タイポのリスク)
ttalSalary = 200000 ' タイポ! totalSalaryに反映されない
MsgBox totalSalary ' 「100000」が表示(ttalSalaryは別変数)
End Sub
' Option Explicitあり(推奨)の場合
Option Explicit ' モジュールの先頭に書く
Sub GoodExample()
Dim totalSalary As Long
totalSalary = 100000
ttalSalary = 200000 ' コンパイルエラー!「変数が定義されていません」
MsgBox totalSalary
End Sub
Option Explicitを全てのモジュールに自動で追加する方法:
' 自動追加の設定方法 ' VBE(Visual Basic Editor)を開く: Altキー + F11 ' メニュー: ツール > オプション > 変数の宣言を強制する にチェック ' → 新規モジュール作成時に自動でOption Explicitが追加される
Alt + F11
エディタを開く
ツール > オプション
を選択
「変数の宣言を強制する」
にチェック
Option Explicitが
自動で挿入される
06 ASSIGNMENT 変数の初期化と代入:値を入れて使う方法 値の代入・型変換関数・Set文によるオブジェクト代入の実例
変数に値を入れる操作を代入と呼び、「=」演算子を使います。VBAの「=」は「等しい」ではなく「左辺に右辺の値を格納する」という意味です。
Sub AssignmentExamples()
' 数値の代入
Dim count As Long
count = 0
count = count + 1 ' 現在の値に1を加算
' 文字列の代入
Dim userName As String
userName = "山田太郎"
userName = "名前: " & userName ' & で文字列を連結
' セルの値を変数に代入
Dim cellValue As String
cellValue = ThisWorkbook.Sheets(1).Cells(1, 1).Value
' 日付の代入
Dim targetDate As Date
targetDate = Date ' 今日の日付
targetDate = #2026/12/31# ' 特定の日付(# で囲む)
' Boolean(True/False)の代入
Dim isValid As Boolean
isValid = True
isValid = (count > 0) ' 比較式の結果を代入
End Sub
' オブジェクト型はSet文で代入する
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("Sheet1") ' Set が必要!
' オブジェクト参照を解放する時はNothing
Set ws = Nothing
📚 用語解説
Set文(オブジェクト代入):VBAでオブジェクト(Worksheet・Range・Workbook等)を変数に代入する時はSetキーワードが必要。「Dim ws As Worksheet」で変数を宣言した後、「Set ws = ThisWorkbook.Sheets(1)」でSetを使って代入する。Setを忘れると「オブジェクト変数またはWithブロック変数が設定されていません(エラー91)」が発生する。String・Long等の通常のデータ型にはSetは不要で「変数名 = 値」で代入できる。
' 型変換関数(型が一致しない時に変換) Dim strNum As String Dim intNum As Integer strNum = "123" intNum = CInt(strNum) ' String → Integer strNum = CStr(intNum) ' Integer → String ' 主な型変換関数 ' CInt() → Integer ' CLng() → Long ' CDbl() → Double ' CStr() → String ' CBool() → Boolean ' CDate() → Date
07 SCOPE 変数のスコープ(有効範囲):プロシージャ・モジュール・Public Dim・Static・Private・Publicの違いと使い分け
変数のスコープ(有効範囲)とは「変数がどの範囲から参照できるか」を指します。VBAでは変数を「どこで・何のキーワードで宣言するか」によってスコープが変わります。
| 宣言方法 | スコープ | 有効期間 | 使う場面 |
|---|---|---|---|
| Sub内でDim | プロシージャ内のみ | Sub開始〜終了まで | 通常の変数(推奨デフォルト) |
| Sub内でStatic | プロシージャ内のみ | プロジェクト全体(値が保持) | Sub呼び出し間で値を保持したい時 |
| モジュール先頭でPrivate(またはDim) | 同じモジュール内のSub/Function全体 | プロジェクト全体 | モジュール内で複数Subが共有する値 |
| モジュール先頭でPublic | 全モジュールからアクセス可 | プロジェクト全体 | 全体で共有するグローバル変数 |
' === プロシージャスコープ(Dim - 最も一般的) ===
Sub ProcedureScope()
Dim localVar As Long ' このSub内のみ有効
localVar = 100
' Sub終了でlocalVarの中身が消える
End Sub
' === Staticで値を保持する ===
Sub CountClicks()
Static clickCount As Long ' 呼び出し間で値が保持される
clickCount = clickCount + 1
MsgBox "クリック回数: " & clickCount
End Sub
' === モジュールスコープ(モジュール先頭に書く) ===
Option Explicit
Private moduleVar As String ' このモジュール内の全Sub/Functionで使える
Sub FirstSub()
moduleVar = "値を設定"
End Sub
Sub SecondSub()
MsgBox moduleVar ' FirstSubで設定した値を参照できる
End Sub
' === グローバルスコープ(Public - 標準モジュールに書く) ===
Public globalVar As Long ' 全モジュールから参照可能
変数のスコープは「必要な範囲だけに限定する」のがベストプラクティスです。プロシージャ内だけで使う変数はDim(ローカル)、複数のSubで共有するならPrivate(モジュール)、本当に全体で必要ならPublic(グローバル)と段階的に広げていきます。Publicを乱用すると「どこで値が変わったか」を追うのが困難になります。
08 ARRAY 配列変数の宣言と使い方 固定長配列・動的配列・ReDimの使い方と実例
VBAの配列変数は、同じデータ型の複数の値をインデックス(番号)で管理できる変数です。「100人分の名前」のようなデータを扱う場合、「name1・name2・name3...」と100個の変数を宣言するより配列が効率的です。
' === 固定長配列(要素数が決まっている場合) ===
Dim scores(4) As Integer ' 0〜4の5要素(0始まり)
scores(0) = 80
scores(1) = 75
scores(4) = 90
' 開始インデックスを1にする場合
Dim names(1 To 5) As String ' 1〜5の5要素(1始まり)
names(1) = "山田太郎"
names(5) = "田中花子"
' For Each でループ
Dim i As Long
For i = 0 To 4
Debug.Print scores(i)
Next i
' === 動的配列(実行時に要素数を決める) ===
Dim items() As String ' サイズ未定で宣言
Dim n As Long
n = Sheets(1).Cells(Rows.Count, 1).End(xlUp).Row ' データ行数を取得
ReDim items(1 To n) ' 実行時にサイズを設定
Dim i As Long
For i = 1 To n
items(i) = Sheets(1).Cells(i, 1).Value
Next i
' サイズ変更しても中身を保持する
ReDim Preserve items(1 To n + 10) ' Preserveで既存データを保持
📚 用語解説
ReDimとReDim Preserve:ReDimは動的配列のサイズを変更するVBAの命令。「ReDim items(1 To 100)」でitemsを100要素に変更できるが、既存の中身は消えてしまう(初期化される)。「ReDim Preserve items(1 To 100)」とすればPreserveキーワードによって既存データを保持したままサイズを変更できる。ただしPreserveはVBAの仕様上、多次元配列の最後の次元のみ変更できるという制約がある。
09 VBA ERRORS VBA変数でよく起きるエラーとデバッグ方法 型不一致・未定義変数・オーバーフローなどの原因と対処法
VBAの変数周りで発生する典型的なエラーとその対処方法をまとめます。
| エラー | 発生する状況 | 原因 | 対処方法 |
|---|---|---|---|
| 型が一致しません(エラー13) | 文字列をInteger変数に代入しようとした時 | データ型の不一致 | CInt()等の型変換関数を使う |
| 変数が定義されていません | Option Explicit設定時に未宣言の変数を使った時 | タイポまたは宣言漏れ | Dim文で変数を宣言する |
| オーバーフロー(エラー6) | Integer型に32,767超の値を代入した時 | データ型の上限超過 | IntegerをLongに変更する |
| オブジェクト変数が設定されていません(エラー91) | Setなしでオブジェクト型変数を使った時 | Set文を忘れた | Set ws = ... のようにSetを付ける |
| インデックスが有効範囲にありません(エラー9) | 配列の範囲外にアクセスした時 | インデックスが配列の宣言サイズ外 | UBound()で上限を確認してループ |
コンパイルエラー
実行時エラー
エラーメッセージの
番号をメモ
VBEでエラー行が
ハイライト表示
ウォッチウィンドウ
またはMsgBox
型変換・宣言追加
等で対処
10 CLAUDE CODE VBA Claude CodeでVBAの変数設計・マクロ生成を効率化する 日本語でVBAの要件を説明するだけでマクロとデータ型が自動設計される
VBAの変数・データ型・Dim文を理解したところで、Claude CodeがVBAコードの作成・デバッグをどう効率化するかを紹介します。
| あなたの依頼 | Claude Codeが生成するもの |
|---|---|
| 「Sheet1のA列の全データをLong配列に読み込んで合計を計算して」 | 動的配列+ReDim+ループ+合計計算のVBAコード |
| 「このVBAコードでエラー13が出る原因を教えて」 | 型不一致の原因特定とCInt/CLng等の修正提案 |
| 「変数名をより分かりやすくリファクタリングして」 | i→rowIndex等の意味のある変数名への書き換え |
| 「Option Explicit対応に書き直して未使用変数も削除して」 | Option Explicit追加+全変数のDim宣言+不要変数削除 |
VBAの業務自動化もClaude Codeで効率化できます
「Excelの集計作業を自動化したい」「VBAのデバッグが難しい」「適切なデータ型の選び方が分からない」——こうしたVBA・Excel自動化の課題はClaude Codeで解決できます。まずは無料相談でどのような業務効率化が必要かをヒアリングさせてください。
NEXT STEP
この記事の内容を、あなたのビジネスで
実践してみませんか?
AI活用を自社で回せるようになりたい方へ
AI鬼管理
Claude Code・Cowork導入支援から業務設計・社内浸透まで実践ベースで伴走。「自社で回せる組織」を90日で作る経営者向けトレーニング。
よくある質問
Q. VBAでDimとは何ですか?
A. DimはDimensionの略で、VBAで変数を宣言(メモリ領域を確保)するためのキーワードです。「Dim 変数名 As データ型」の形で書き、例えば「Dim count As Long」で「countという名前のLong型(長整数)変数」を宣言します。Dim宣言された変数はSub/Functionの中で使える「値を入れる箱」になります。
Q. VBAのIntegerとLongの違いは何ですか?
A. 両方とも整数を格納するデータ型ですが、扱える数値の範囲が異なります。Integerは-32,768〜32,767(約3万)、Longは-2,147,483,648〜2,147,483,647(約20億)です。Excelの最大行数(1,048,576)はIntegerでは格納できないため、行番号を扱う場合はLongを使います。迷ったらLongを使うのが実務の経験則です。
Q. Option Explicitとは何ですか?なぜ必要ですか?
A. Option ExplicitはVBAモジュールの先頭に書く命令で、変数の宣言(Dim)を必須にします。これによりスペルミスで誤った変数名を使った場合(例:totalをtaotalとタイポ)にコンパイルエラーが発生して早期にバグを発見できます。VBE(エディタ)の「ツール > オプション > 変数の宣言を強制する」にチェックすると、新規モジュール作成時に自動でOption Explicitが追加されます。
Q. VBAで変数のスコープとは何ですか?
A. 変数のスコープとは「変数が参照できる有効範囲」のことです。Sub/Function内でDim宣言した変数は「プロシージャスコープ」でそのSub内のみ有効です。モジュールの先頭でPrivate宣言した変数は「モジュールスコープ」でそのモジュール内の全Sub/Functionから参照できます。Publicで宣言した変数は「グローバルスコープ」で全モジュールから参照できますが、多用は避けてください。
Q. VBAの配列変数(Dynamic Array)の使い方を教えてください。
A. 動的配列は「Dim items() As String」のように要素数なしで宣言し、実行時に「ReDim items(1 To n)」でサイズを設定します。既存の内容を保持したまサイズを変更するには「ReDim Preserve items(1 To n+10)」のようにPreserveキーワードを使います。固定長配列(Dim scores(4) As Integer等)はサイズが宣言時に決まっています。
Q. VBAで「型が一致しません(エラー13)」が出る原因と解決方法は?
A. 文字列を数値型変数に代入しようとした時などに発生します。例えばセルに「abc」という文字が入っているのにIntegerに代入しようとした場合です。CInt()・CLng()・CDbl()等の型変換関数で変換するか、変数の型を適切に変更してください。IsNumeric()やIsDate()で変換前に型チェックするのもよい方法です。
Q. Claude CodeでVBAのコードを自動生成できますか?
A. できます。「Sheet1のA列のデータを全て読み込んで合計を計算してSheet2のA1に出力するVBAマクロを書いて。Option Explicit使用、変数の型は適切に選んで」のように日本語で要件を説明するとマクロが生成されます。既存のコードを貼り付けてデバッグを依頼したり、「このマクロを配列を使って高速化して」とリファクタリングを依頼することも可能です。
Claude Codeで業務自動化を90日で叩き込む
経営者向けの伴走型パーソナルトレーニング
Claude Code を業務に落とし込む
専門研修コース一覧
受講者本人の業務を題材に、「使いこなせる」状態になるまで伴走する研修プログラム。1対1特化型・ハンズオン・法人講座の3コースを展開中。業務特化・実装まで踏み込むタイプのClaude Code研修です。
研修コース一覧を見る →AI鬼管理へのお問い合わせ
この記事を読んで気になった方へ。
AI鬼管理の専門スタッフが、御社に最適な
業務自動化プランを無料でご提案します。




