🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

Excel VBA のデータ型 — String、Long、Double、Variant(値ごとに正しい箱を選ぶ)

|

Excel VBA のデータ型 — String、Long、Double、Variant(値ごとに正しい箱を選ぶ)

TL;DR — データ型とは、変数の箱の形と大きさです。小さすぎるものを 選べば値はオーバーフローし、怠惰な万能の箱(Variant)に手を伸ばせば、 速度と隠れたバグでその代償を払います。実務コードの 90% は 2 つのルールで カバーできます:すべての整数に Long を使うInteger は 32,767 で オーバーフローし、シートには 1,048,576 行ある)、そして 計算には Double、 お金には Currency か丸めを使うDouble0.1 + 0.2 を正確には保持 できない)。それ以外 — StringBooleanDate — は値に合わせて選び、 本当に必要な少数のケースのために 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,767Long は 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 — テキスト。既定では可変長で、固定長が要ることはめったに ありません。
  • BooleanTrue / False。フラグ(isPaidfound)に最適です。
  • Date — 日付や時刻。内部的には数値(Excel が使うのと同じシリアル値) なので、日付の算術ができます。
  • Long — 既定の整数、前述のとおり。
  • Double — 計算や測定のための、既定の小数。
  • Currency — お金。
  • Variant — 意図的な使用のみ。

ここに属するもう 1 つの罠:Dim i, j As Longj だけを Long にします — iVariant です。各変数には自分の As Type が必要です。その宣言の メカニズムは VBA Dim で詳しく扱っています。

ExcelMaster の活用

型エラー — 大きなシートでの Overflow、1 セントずれる Double、テキスト対 数値のバグを覆い隠す Variant — は、じわじわ効く類のものです:マクロは走り、 間違った答えは下流で現れます。型を正しく選ぶことは本物のエンジニアリングの 規律であり、しかもマクロごとに繰り返さなければならない規律です。

ExcelMaster は、タスクを平易な日本語で受け取り — 「D 列を通貨として合計、行数をカウント、 予算超過に印を付けて」といった具合に — 型の選択を代わりにこなします:カウント には Long、お金には正確な算術、100 万行のシートでも無言のオーバーフロー なし。細かな制御が要るところでは、これからも型付きのマクロを書き続けるでしょう。 日々の仕事では、結果を説明し、型が防ぐためにある一群のバグを飛ばせます。

よくある質問

VBA の Integer と Long の違いは何ですか?

Integer32,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 位まで正確な固定小数点型なので、Double0.1 + 0.2 を正確に保存できない)の丸め誤差を避けられます。お金に Double を 使うなら、比較や保存の前に Round() で明示的に丸め、2 つの Double 値を正確な 等値で比較しては決していけません。

VBA の既定のデータ型は何ですか?

Variant です。As Type なしで宣言された変数 — あるいはまったく宣言せずに 使われた変数 — はすべて Variant です。便利ですがバグを生みやすく、だからこそ Option Explicit と明示的な型が推奨される規律なのです。

なぜ「型が一致しません (エラー 13)」が出るのですか?

変数の型に収まらない値を代入したからです — たとえばテキストの "abc"Long に入れる、あるいはエラー値の入ったセルを Double に入れる、といった具合です。 セルや変数に実際に何が入っているかを確認し(数値に見えるテキストがよくある 犯人です)、代入の前に CLngCDblCStr で明示的に変換しましょう。

検証環境

検証環境: Excel 365(Windows 11)、VBA 7.1 — 最終確認 2026-07-31。

関連ガイド: VBA Dim · VBA Const · VBA CStr · VBA Array · VBA For Loop