PR
アフィリエイト広告を利用しています
アフィリエイト広告を利用しています

VBA 変数の宣言の書き方|Dim と型の選び方、Option Explicit と3つの落とし穴

VBA 変数の宣言の書き方 EXCEL VBA講座
スポンサーリンク

【この記事について】本記事のコードは、2026年10月15日に Windows 版 Excel(Microsoft 365・バージョン 16.0/ビルド 20430)で実際に実行し、結果を確かめたものです。文法の説明は Microsoft Learn の公式ドキュメント(記事末尾に出典)にもとづいています。Mac 版の Excel・Excel 2016 以前では試していません。表示される日付の形(2026/10/15 など)は、Windows の地域の設定によって変わります。マクロは元に戻せない変更をすることがあるため、必ずファイルのコピーで試してからお使いください。

対象環境:Windows 版 Excel(Microsoft 365)の VBA。2026年10月15日に動作確認。

VBA の変数の宣言は、Dim 変数名 As 型 の1行です。整数なら Long、小数なら Double、文字なら String、はい/いいえなら Boolean、日付なら Date を選びます。そしてモジュールのいちばん上に Option Explicit を1行書いておけば、変数名の打ち間違いをマクロが動く前に見つけてくれます。注意したいのは Dim a, b As Long の書き方で、型が付くのは b だけです。この記事では、型の選び方と、初心者がつまずきやすい3つの落とし穴を、実際に動かした結果つきで説明します。

VBA 変数の宣言:型の選び方と3つの落とし穴の早見図

スポンサーリンク

結論:変数の宣言は「Dim 名前 As 型」の1行

変数は「値を入れておく名前つきの箱」です。宣言とは、マクロの最初に「この名前の箱を、この種類(型)で使います」と書いておくことです。

まずはコピーして動かしてみてください。VBE(Alt+F11 で開く画面)で[挿入]→[標準モジュール]を選び、次のコードを貼って、カーソルをコードの中に置いて F5 キーを押します。結果は[表示]→[イミディエイト ウィンドウ](Ctrl+G)に出ます。

Sub DeclareBasics()
    Dim customerName As String   ' 文字
    Dim qty As Long              ' 整数
    Dim price As Double          ' 小数
    Dim isPaid As Boolean        ' True か False
    Dim orderDate As Date        ' 日付

    customerName = "山田商店"
    qty = 12
    price = 1250.5
    isPaid = True
    orderDate = #10/15/2026#

    Debug.Print customerName & " / " & qty * price & " / " & isPaid & " / " & orderDate
End Sub

本記事の環境では、イミディエイト ウィンドウに 山田商店 / 15006 / True / 2026/10/15 と表示されました。

日付の #10/15/2026# は「月/日/年」の順で書く決まりです。日本の並び(年/月/日)とは逆なので気をつけてください。


スポンサーリンク

どの型を選べばいいか(早見表)

迷ったら、次の表のいちばん上の5つから選べば足ります。「最初に入っている値」は、宣言しただけで何も入れていないときの値です(本記事の環境で確認)。

入れたいもの 型 最初に入っている値 ひとこと
件数・行番号・金額(整数) Long 0 整数はこれ一択でよい
単価・割合(小数) Double 0 小数点以下を持てる
名前・コード(文字) String “”(空の文字) 数字でも、先頭の0を残したいなら String
はい/いいえ Boolean False True か False だけ
日付・時刻 Date 0:00:00 日付の計算ができる
シート Worksheet Nothing(空) 入れるときは Set が必要(後述)
セル・セル範囲 Range Nothing(空) 同じく Set が必要
何でも入る Variant Empty(空) 型を書かないとこれになる

Integer ではなく Long を使う理由

古い入門書では、整数に Integer がよく使われています。ただ Integer は 32,767 までしか入りません。本記事の環境で Integer の変数に 32,767 を入れて 1 を足すと、実行時エラー6「オーバーフローしました」で止まりました。40,000 を入れても同じエラーです。Long なら同じ計算で 32,768 になり、止まりません。

Excel のシートは100万行以上あるので、行番号を Integer にすると、データが3万行を超えた日にいきなり止まります。整数は最初から Longにしておくのが安全です。

小数を Long に入れると、四捨五入とは少し違う丸め方になる

Long の変数に小数を入れると、整数に丸められます。本記事の環境では、2.6 → 3、3.5 → 4 なのに、2.5 → 2 でした。ちょうど .5 のときは「偶数のほうへ寄せる」丸め方になるためです。金額の端数を扱うときは、小数のまま Double で持っておき、丸め方を自分で決めてください。

最初に入れる1行:Option Explicit

VBA は、宣言していない名前を書いても、そのまま動いてしまいます。これが一番こわいところです。次のコードは、2行目で total と書いたのに、3行目で totl と打ち間違えています。

Sub TypoWithoutOptionExplicit()
    total = 1000
    Debug.Print "合計:" & totl
End Sub

本記事の環境で動かすと、エラーは出ず、「合計:」のあとが空のまま表示されました。totl という新しい空の変数が、黙って作られたからです。実務の表なら「合計が0になる」「空欄になる」という形で出てきて、原因を探すのに時間がかかります。

防ぎ方は、モジュールのいちばん上(どの Sub よりも前)に、次の1行を書くことです。

Option Explicit

これがあると、宣言していない名前を使った時点で、マクロが動く前にコンパイル エラー「変数が定義されていません」で止めてくれます(Microsoft Learn の Option Explicit の説明より)。止まるのは悪いことではありません。打ち間違いを、データを書き換える前に見つけてくれた合図です。

毎回書くのを忘れないように、VBE の[ツール]→[オプション]→[編集]タブで「変数の宣言を強制する」にチェックを入れておくと、新しく作るモジュールに自動で入ります。公式の説明のとおり、すでにあるモジュールには入らないので、そちらは手で1行足してください。

「変数が定義されていません」で止まったときの直し方は、次の記事にまとめています。

【動く前に止まる】VBAのコンパイルエラー7パターンと直し方|変数が定義されていません・構文エラー・End If がありません
VBAのコンパイルエラーは、マクロが動き出す前に出るエラーです。番号が出ず該当箇所が青く反転するのが目印で、原因はデータではなくコードの書き方。変数名のスペルミス・全角文字・End Ifの閉じ忘れ・参照設定など7パターンを、Microsoft公式ドキュメントの記載にもとづいて順に潰します(2026年9月12日確認)。

落とし穴1:「Dim a, b As Long」は a に型が付かない

1行にまとめて宣言するとき、多くの人が引っかかります。

Sub OneLineTrap()
    Dim a, b As Long
    Debug.Print TypeName(a), TypeName(b)
End Sub

本記事の環境では Empty Long と表示されました。Long になったのは b だけで、a は型の無い Variant です。実際に a へ文字を入れるとそのまま入り、b へ文字を入れると実行時エラー13 で止まりました。

正しくは、1つずつ As を付けます。

Dim a As Long, b As Long

読みやすさを考えると、1行に1つずつ宣言するのがいちばん確実です。

落とし穴2:シートやセルを入れる変数には Set が要る

Worksheet や Range のような「もの(オブジェクト)」を入れる変数は、代入のときに Set を付けます。

Sub UseSet()
    Dim ws As Worksheet
    Dim r As Range

    Set ws = ThisWorkbook.Worksheets(1)
    Set r = ws.Range("A1")
    r.Value = "Setで代入"
End Sub

これは本記事の環境で、A1 に「Setで代入」と入りました。一方、Set を付けずに r = ws.Range("A1") と書くと、実行時エラー91「オブジェクト変数または With ブロック変数が設定されていません」で止まりました。エラー91 の原因と直し方は、次の記事で詳しく説明しています。

【止まらない】VBA「実行時エラー91」の原因7つと直し方|オブジェクト変数またはWithブロック変数が設定されていません
VBAで『実行時エラー91:オブジェクト変数またはWithブロック変数が設定されていません』が出て止まる原因を7つに整理。Set忘れ・Find・Withブロックなど、コピペで直せる修正コードつきで解説します。

落とし穴3:型に合わない値を入れると止まる

宣言した型に入らない値を入れると、マクロは止まります。本記事の環境で Long の変数に入れてみた結果です。

入れた値 結果
“123”(数字だけの文字) 123 として入る(エラーなし)
“abc”(文字) 実行時エラー13「型が一致しません」
空のセルの値 0 として入る(エラーなし)

セルに「未入力」「-」のような文字が1つ混ざっているだけで、集計マクロが止まるのはこのためです。エラー13 の探し方と直し方は、次の記事にまとめています。

VBA「実行時エラー13」の原因7つと直し方【型が合わない】|型が一致しませんの正体はセルの中身
VBAの「実行時エラー13 型が一致しません」は、コードではなくセルの中身が原因で出ます。文字混じり・#N/Aエラー値・Application.Matchの戻り値・配列・オブジェクトなど原因7つを、[デバッグ]で止まった行から30秒で切り分ける手順で解説。IsNumeric/IsError/IsDateを使った再発しない書き方まで。

変数が使える範囲(スコープ)と、値を覚えておく Static

変数は、どこで宣言したかで使える範囲が変わります。

書く場所と書き方 使える範囲 値はいつまで残るか
Sub の中で Dim その Sub の中だけ Sub が終わると消える
Sub の中で Static その Sub の中だけ 次に呼ばれたときまで残る
モジュールの先頭で Private(または Dim) 同じモジュールのすべての Sub Sub が終わっても残る(ブックを閉じるまで)
モジュールの先頭で Public ほかのモジュールからも使える 同上

Dim と Static の違いは、動かすとすぐ分かります。

Sub CountWithDim()
    Dim cnt As Long
    cnt = cnt + 1
    Debug.Print "Dim:"; cnt
End Sub

Sub CountWithStatic()
    Static cnt As Long
    cnt = cnt + 1
    Debug.Print "Static:"; cnt
End Sub

それぞれ3回ずつ実行すると、本記事の環境では Dim は 1・1・1、Static は 1・2・3 でした。Dim は呼ばれるたびに0から始まり、Static は前回の値を覚えています。

モジュールの先頭に置く変数は、複数の Sub で値を受け渡したいときに使います。

Private lastMessage As String   ' モジュールのいちばん上に書く

Sub SetMessage()
    lastMessage = "保存しました"
End Sub

Sub ShowMessage()
    Debug.Print lastMessage
End Sub

SetMessage のあとに ShowMessage を実行すると、「保存しました」と表示されました。ただし、モジュールの先頭の変数を増やしすぎると、どこで値が変わったのか追えなくなります。基本は Sub の中の Dim、必要なときだけ外に出す、と覚えておけば十分です。

変わらない値は Const(定数)にする

税率のように途中で変えない値は、Const で名前を付けておくと、あとで直す場所が1か所で済みます。

Const TAX_RATE As Double = 0.1   ' モジュールのいちばん上に書く

Sub WithTax()
    Dim price As Long
    price = 1980
    Debug.Print price * (1 + TAX_RATE)
End Sub

本記事の環境では 2178 と表示されました。

実務の形:宣言つきで集計マクロを書く

ここまでの内容を全部使うと、次のような形になります。B列の金額を2行目から最終行まで足して、D1 に書き出すマクロです。文字が混ざった行は飛ばします。

Option Explicit

Sub SumSales()
    Dim ws As Worksheet
    Dim lastRow As Long
    Dim i As Long
    Dim total As Double

    Set ws = ThisWorkbook.Worksheets(1)
    lastRow = ws.Cells(ws.Rows.Count, "B").End(xlUp).Row

    For i = 2 To lastRow
        If IsNumeric(ws.Cells(i, "B").Value) Then
            total = total + ws.Cells(i, "B").Value
        End If
    Next i

    ws.Range("D1").Value = total
End Sub

本記事の環境で、B2〜B6 に「1000/2500/未入力/(空)/300」を入れて実行すると、D1 は 3800 になりました。「未入力」の行は飛ばされ、エラーで止まりませんでした。

  • 行番号の lastRow と i は Long(3万行を超えても止まらない)
  • 合計の total は、小数の金額にも対応できるよう Double
  • シートの ws は Set で入れる

最終行の求め方と For Next の書き方は、それぞれ次の記事で詳しく説明しています。

【もう迷わない】VBAで最終行を取得する方法5つと使い分け|End(xlUp)が1を返す・途中の空白・UsedRangeのズレ
VBAで最終行を取るなら、まずは ws.Cells(ws.Rows.Count, 1).End(xlUp).Row の1行です。データ0件でも1が返る・シート指定の漏れ・基準列の空白・Integerのオーバーフローという4つのつまずきと、Find・UsedRange・CurrentRegionとの使い分けを、Microsoft公式ドキュメントをもとにまとめました。
【コピペOK】VBAのFor Nextの使い方|基本形・Step -1・入れ子・Exit Forと「1回も回らない」の直し方
VBAのFor Nextを、基本形からStep -1での行削除・入れ子・Exit For・速くする書き方まで、実際にExcelで動かしたコードで解説。「1回も回らない」「Integerで止まる」の原因と直し方も実測つきでまとめました。

生成AIに VBA を書いてもらうときの「宣言」の確かめ方

Claude・ChatGPT・Copilot などの生成AIにマクロを書いてもらう人も増えています。そのときも、この記事の内容がそのまま役に立ちます。頼むときは、チャット欄に次の一文を足してください。

Option Explicit を先頭に付けて、すべての変数を Dim で型つきで宣言してください。
行番号は Long にし、シートやセルの変数は Set で代入してください。

答えが返ってきたら、貼り付ける前に次の4点だけ目で確かめます。

見るところ こうなっていたら直してもらう
先頭の1行 Option Explicit が無い
行番号の変数 As Integer になっている
1行にまとめた宣言 Dim a, b As Long の形になっている
シート・セルの代入 Set が付いていない

生成AIの答えはもっともらしく見えても、ここが抜けていることがあります。そして動かすのは必ずファイルのコピーで。生成AIのサービスごとの料金や無料でできる範囲は、次の記事にまとめています(2026年10月時点の情報。各サービスの仕様は変わりやすいので、現時点での目安として読んでください)。

Claudeの料金はいくら?無料・Pro・Max・Teamの違いと「使用量制限」を公式情報で整理【2026年10月9日確認】
Claudeの料金は、現時点ではFreeが

https://kire-kara.com/2026/10/09/claude-pricing-free-pro-max-team/

、Proが月(年払い・0一括/月払いは)、Maxが0から、Teamが1人(年払い)から。表示はドル建てで10%の日本の消費税込みです。金額より効いてくる「5時間ごとのセッション制限と週ごとの制限」、Free と Pro の分かれ目、解約と払い戻しの決まりまで、2026年10月9日に公式ページとヘルプを実際に開いて整理しました。

よくある質問

Q. 宣言しなくても動くのに、本当に必要ですか?

A. 動くことは動きます。ただ、宣言しない変数はすべて Variant になり、打ち間違いがあっても黙って動き続けます(上の「合計:」の例)。Option Explicit と宣言は、間違いを早く見つけるための道具です。数行のマクロでも入れておくと、あとで自分が助かります。

Q. Dim はどこに書けばいいですか?

A. Sub の中なら、その変数を使う前ならどこでも書けます。ただ、読みやすさのために Sub のいちばん上にまとめて書くのがおすすめです。どんな変数を使うマクロなのかが、最初の数行で分かります。

Q. Variant は使ってはいけないのですか?

A. いけないわけではありません。セルの値がまだ数字か文字か分からないときに、一度 Variant で受け取ってから調べる、という使い方もあります。ただ、型が分かっているものは型を書くほうが、間違いに早く気づけます。

Q. 変数名にはどんな名前を付ければいいですか?

A. 中身が分かる名前にしてください。x や a より、lastRow(最終行)や total(合計)のほうが、1か月後の自分が読めます。VBA の決まりで、先頭は文字にし、途中にピリオド(.)や型宣言文字(! など)は入れられません(Microsoft Learn「変数を宣言する」より)。

Q. 配列の宣言はどう書きますか?

A. Dim 名前(大きさ) As 型 の形で書きます。配列は使い方の幅が広いので、別の記事にまとめました。

【コピペOK】VBAの配列の使い方|Dim・ReDim Preserve・UBoundからセル範囲の一括読み込みまで(2万行が20倍以上速くなった実測つき)
VBAの配列を、Dimでの作り方・Array関数・ReDim Preserve・UBoundから、セル範囲を配列へ一度に読み込んで書き戻す方法まで、実際にExcelで動かしたコードで解説。2万行で20倍以上速くなった実測と、エラー9・13の原因と直し方もまとめました。

まとめ

  • 変数の宣言は Dim 名前 As 型 の1行
  • 型は 整数=Long/小数=Double/文字=String/はい・いいえ=Boolean/日付=Date
  • Integer は 32,767 まで。行番号に使うと3万行を超えた日に止まるので、最初から Long
  • モジュールの先頭に Option Explicit。打ち間違いを動く前に止めてくれる
  • Dim a, b As Long は a が Variant。1つずつ As を付ける
  • シート・セルの変数は Set で代入(付けないとエラー91)
  • 前回の値を覚えておきたいときは Static、変えない値は Const

宣言は、地味ですが「止まらないマクロ」のいちばんの土台です。今日書くマクロの先頭に Option Explicit を1行足すだけで、明日のあなたの手戻りが確実に減ります。まずは手元のマクロを1本開いて、変数に型が付いているかを見てみてください。

次に読む

【動く前に止まる】VBAのコンパイルエラー7パターンと直し方|変数が定義されていません・構文エラー・End If がありません
VBAのコンパイルエラーは、マクロが動き出す前に出るエラーです。番号が出ず該当箇所が青く反転するのが目印で、原因はデータではなくコードの書き方。変数名のスペルミス・全角文字・End Ifの閉じ忘れ・参照設定など7パターンを、Microsoft公式ドキュメントの記載にもとづいて順に潰します(2026年9月12日確認)。
【コピペOK】VBAの配列の使い方|Dim・ReDim Preserve・UBoundからセル範囲の一括読み込みまで(2万行が20倍以上速くなった実測つき)
VBAの配列を、Dimでの作り方・Array関数・ReDim Preserve・UBoundから、セル範囲を配列へ一度に読み込んで書き戻す方法まで、実際にExcelで動かしたコードで解説。2万行で20倍以上速くなった実測と、エラー9・13の原因と直し方もまとめました。

参考にした一次情報(2026年10月15日 確認)

変数を宣言する (VBA)|Microsoft Learn
https://learn.microsoft.com/ja-jp/office/vba/language/concepts/getting-started/declaring-variables

Dim ステートメント (VBA)|Microsoft Learn
https://learn.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/dim-statement

Option Explicit ステートメント (VBA)|Microsoft Learn
https://learn.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/option-explicit-statement

データ型の概要|Microsoft Learn
https://learn.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/data-type-summary

スコープと可視性について (VBA)|Microsoft Learn
https://learn.microsoft.com/ja-jp/office/vba/language/concepts/getting-started/understanding-scope-and-visibility

Static ステートメント (VBA)|Microsoft Learn
https://learn.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/static-statement

Set ステートメント (VBA)|Microsoft Learn
https://learn.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/set-statement


当ブログは、Excel や VBA で手が止まった事務職のみなさんに、その場で直せる手順を届けたい思いで運営しています。
「記事が役に立った」「続きも読んでみたい」と感じていただけたら、下記リンクからのご利用・ご支援で応援してもらえると嬉しいです。

EXCEL VBA講座
スポンサーリンク
シェアする
メリ爺をフォローする

コメント

タイトルとURLをコピーしました