【この記事について】本記事のコードは、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つの落とし穴を、実際に動かした結果つきで説明します。

🔎 あわせて確認されている記事
結論:変数の宣言は「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行足してください。
「変数が定義されていません」で止まったときの直し方は、次の記事にまとめています。

落とし穴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 の原因と直し方は、次の記事で詳しく説明しています。

落とし穴3:型に合わない値を入れると止まる
宣言した型に入らない値を入れると、マクロは止まります。本記事の環境で Long の変数に入れてみた結果です。
| 入れた値 | 結果 |
|---|---|
| “123”(数字だけの文字) | 123 として入る(エラーなし) |
| “abc”(文字) | 実行時エラー13「型が一致しません」 |
| 空のセルの値 | 0 として入る(エラーなし) |
セルに「未入力」「-」のような文字が1つ混ざっているだけで、集計マクロが止まるのはこのためです。エラー13 の探し方と直し方は、次の記事にまとめています。

変数が使える範囲(スコープ)と、値を覚えておく 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 の書き方は、それぞれ次の記事で詳しく説明しています。


生成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月時点の情報。各サービスの仕様は変わりやすいので、現時点での目安として読んでください)。

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 型 の形で書きます。配列は使い方の幅が広いので、別の記事にまとめました。

まとめ
- 変数の宣言は
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本開いて、変数に型が付いているかを見てみてください。
次に読む


参考にした一次情報(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


コメント