TL;DR — データ型とは、変数の箱の形と大きさです。小さすぎるものを 選べば値はオーバーフローし、怠惰な万能の箱(
Variant)に手を伸ばせば、 速度と隠れたバグでその代償を払います。実務コードの 90% は 2 つのルールで カバーできます:すべての整数にLongを使う(Integerは 32,767 で オーバーフローし、シートには 1,048,576 行ある)、そして 計算にはDouble、 お金にはCurrencyか丸めを使う(Doubleは0.1 + 0.2を正確には保持 できない)。それ以外 —String、Boolean、Date— は値に合わせて選び、 本当に必要な少数のケースのためにVariantをとっておきます。
Dim rowCount As Long ' 整数 — 常に Long、決して Integer にしない
Dim price As Double ' 測定値と計算
Dim total As Currency ' お金 — 小数第 4 位まで正確
Dim name As String ' テキスト
Dim isPaid As Boolean ' True / False
Dim dueDate As Date ' 日付/時刻
型を選ぶことは形式的な手続きのように感じられますが、実際には、どんな失敗 パターンにさらされるかを決める判断です。間違った型は必ずしもエラーになりません — ときには、ただ静かに間違った数値を返すだけです。このガイドは罠を軸に構成 しています。それこそが、どの箱を使うかを実際に決めるものだからです。
この記事で学べること
Integerがなぜ罠で、整数にはLongを既定にすべき理由Variantが実際には何であり、それが正しい選択となる狭いケースDoubleがなぜお金を壊すのか、そして代わりに何を使うか- 2 つの型エラーの読み方:オーバーフロー (6) と 型が一致しません (13)
- 迷ったときに型を選ぶための 1 行ルール
考え方の軸:型は箱の形
変数が箱なら、型はその形と容量です。Long は約 20 億までの整数のために
作られた箱。String はテキストに合わせて伸び縮みします。Boolean はちょうど
2 つの状態ぶんの部屋がある箱。Double は小数を保持しますが、2 進数の近似で
保持します。Variant は、放り込まれたものに合わせて形を変える変幻自在の
箱です。
どの型も、トレードオフです。ぴったりした特定の型はミスを早く捕まえ、速く
動きます。緩い型(Variant)は何でも受け入れ、ミスを後回しにします — もっと
見つけにくいどこかへ。ですから「どの型か?」は「何が壊れることを許容するか?」
と同じ問いなのです。
オーバーフローを防ぐルール:Integer ではなく Long を使う
VBA には整数型が 2 つあり、片方は遺物です。Integer は 16 ビットで、その上限は
32,767。Long は 32 ビットで、20 億を超えます。Integer が 32,768 を
保持するよう求められた瞬間、VBA は**「オーバーフローしました (エラー 6)」**を
投げて止まります。
典型的な犠牲者は行カウンターです:
' 脆い — シートが 32,767 行を超えた瞬間にオーバーフローする
Dim r As Integer
For r = 1 To lastRow ' 32,768 行目でエラー 6
' ...
Next r
' 正しい — Long なら 1,048,576 行すべてを扱える
Dim r As Long
For r = 1 To lastRow
' ...
Next r
現代のワークシートには 1,048,576 行あります — Integer の上限の 32 倍
です。行を数える、.Row 番号を保持する、大きな合計を積み上げる — そうした
変数はすべて Long でなければなりません。そして極めつけがこれです:今日の
ハードウェアでは、Integer に速度上の利点はありません — VBA はどのみち
内部で 32 ビット値に変換するからです。ですからこのルールに欠点はありません:
すべての整数に Long を使い、Integer の存在は忘れましょう。
Variant についてのルール:意図的な選択であって、既定ではない
型を付けずに宣言した変数 — Dim x — はすべて Variant であり、宣言していない
変数もすべてそうです。Variant は何でも保持します:今は数値、後でテキスト、
配列、オブジェクト。便利そうに聞こえますし、初心者がこれに頼る理由でもあります。
それはまた、彼らのバグが隠れる理由でもあります。
代償は現実のものです。Variant はより多くのメモリを使い、より遅く動き、
そして — 最も重要なことに — 型のミスを捕まえません。テキストとして届いた
数値は Variant の中でテキストのまま留まり、後の計算で無言で失敗します。
Long なら、ミスのその地点で即座にエラーになっていたはずです。
しかし Variant には、本当に素晴らしい使い道が 1 つあり、速いので知っておく
価値があります:Range 全体を一度にメモリへ読み込むことです。
' 唯一の素晴らしい Variant の使い道:範囲を一度に 2 次元配列へ引き込む
Dim data As Variant
data = ThisWorkbook.Worksheets("Data").Range("A1:C1000").Value
Dim i As Long
For i = 1 To UBound(data, 1)
data(i, 2) = data(i, 2) * 1.1 ' メモリ上で処理する — セルごとの往復なし
Next i
Range("A1:C1000").Value = data ' 一度に書き戻す
このパターンは、セルを 1 つずつ触るより劇的に速く、Variant を必要と
します。Excel が Variant 配列を渡してくるからです。ここでは Variant を
使い、そして本当に値が混在する場合にも使いましょう。それ以外のあらゆる場所
では、本物の型を宣言します。
お金についてのルール:Double は最後の 1 セントで嘘をつく
Double は 2 進浮動小数点なので、すべての小数を正確には表現できません — 有名な
結果が、0.1 + 0.2 が正確には 0.3 にならないことです。グラフや物理計算では、
これは目に見えません。お金では、こうした微小な誤差が積み重なり、合計が 1 セント
ずれます — まさに監査人が気づく類のものです。
Dim a As Double
a = 0.1 + 0.2
Debug.Print (a = 0.3) ' -> False (a は 0.30000000000000004)
Dim m As Currency
m = 0.1 + 0.2
Debug.Print (m = 0.3) ' -> True (Currency は小数第 4 位まで正確)
お金には Currency を使いましょう — これは固定小数点型で、小数第 4 位まで
正確、まさにこのために作られています。どうしても Double を使う必要があるなら
(小数第 4 位より多く必要な場合など)、比較や保存の前に Round() か Format()
で意図的に丸めます。2 つの Double 値を正確な等値で比較しては決していけません
— 代わりに許容誤差の範囲内で比較しましょう。
日常的な型のざっとした一巡
String— テキスト。既定では可変長で、固定長が要ることはめったに ありません。Boolean—True/False。フラグ(isPaid、found)に最適です。Date— 日付や時刻。内部的には数値(Excel が使うのと同じシリアル値) なので、日付の算術ができます。Long— 既定の整数、前述のとおり。Double— 計算や測定のための、既定の小数。Currency— お金。Variant— 意図的な使用のみ。
ここに属するもう 1 つの罠:Dim i, j As Long は j だけを Long にします —
i は Variant です。各変数には自分の As Type が必要です。その宣言の
メカニズムは VBA Dim で詳しく扱っています。
ExcelMaster の活用
型エラー — 大きなシートでの Overflow、1 セントずれる Double、テキスト対
数値のバグを覆い隠す Variant — は、じわじわ効く類のものです:マクロは走り、
間違った答えは下流で現れます。型を正しく選ぶことは本物のエンジニアリングの
規律であり、しかもマクロごとに繰り返さなければならない規律です。
ExcelMaster
は、タスクを平易な日本語で受け取り — 「D 列を通貨として合計、行数をカウント、
予算超過に印を付けて」といった具合に — 型の選択を代わりにこなします:カウント
には Long、お金には正確な算術、100 万行のシートでも無言のオーバーフロー
なし。細かな制御が要るところでは、これからも型付きのマクロを書き続けるでしょう。
日々の仕事では、結果を説明し、型が防ぐためにある一群のバグを飛ばせます。
よくある質問
VBA の Integer と Long の違いは何ですか?
Integer は 32,767 で頭打ちの 16 ビット整数、Long は 32 ビットで 20 億を
超えます。ワークシートには 1,048,576 行あり、現代の Excel では Integer に
速度上の利点がないので、すべての整数に Long を使い、Integer は完全に
避けるべきです。Integer の上限を超えると「オーバーフローしました (エラー 6)」が
出ます。
VBA で Variant を使うべきですか?
意図的なときだけです。Variant はどんな値も保持しますが、より多くのメモリを
使い、より遅く動き、型のバグを隠します(テキストとして保存された数値は、後に
なるまでエラーになりません)。唯一の優れた使い道は、Range 全体を 2 次元配列に
読み込むこと(data = Range("A1:C1000").Value)で、これは非常に速いです。
それ以外のあらゆる場所では、特定の型を宣言しましょう。
VBA でお金にはどのデータ型を使うべきですか?
Currency を使いましょう。小数第 4 位まで正確な固定小数点型なので、Double
(0.1 + 0.2 を正確に保存できない)の丸め誤差を避けられます。お金に Double を
使うなら、比較や保存の前に Round() で明示的に丸め、2 つの Double 値を正確な
等値で比較しては決していけません。
VBA の既定のデータ型は何ですか?
Variant です。As Type なしで宣言された変数 — あるいはまったく宣言せずに
使われた変数 — はすべて Variant です。便利ですがバグを生みやすく、だからこそ
Option Explicit と明示的な型が推奨される規律なのです。
なぜ「型が一致しません (エラー 13)」が出るのですか?
変数の型に収まらない値を代入したからです — たとえばテキストの "abc" を Long
に入れる、あるいはエラー値の入ったセルを Double に入れる、といった具合です。
セルや変数に実際に何が入っているかを確認し(数値に見えるテキストがよくある
犯人です)、代入の前に CLng、CDbl、CStr で明示的に変換しましょう。
検証環境
検証環境: Excel 365(Windows 11)、VBA 7.1 — 最終確認 2026-07-31。
関連ガイド: VBA Dim · VBA Const · VBA CStr · VBA Array · VBA For Loop
