Excel

VBA Dimの使い方|変数宣言の基本・データ型一覧をコード例で解説

しんたろ。

VBAのコードを見ると「Dim」って書いてあるけど、これって何だろう?と思ったことはありませんか?

VBAでマクロを書くとき、必ずと言っていいほど登場するのが「Dim」です。Dimは変数を宣言するためのステートメントで、VBAの基礎中の基礎にあたります。

この記事では、VBA初心者の方でもDimの使い方が完全に理解できるよう、基本構文からデータ型の一覧、変数のスコープまでをコード例付きで丁寧に解説します。

なお、VBAマクロの基礎をこれから学びたい方は、先にExcelVBAおすすめ入門ガイドをご覧いただくとスムーズです。

この記事の目次
  1. VBAのDimとは?変数宣言の基本を理解しよう
  2. Dimの基本的な書き方と構文
  3. LINEでExcelを気軽に学べる
  4. VBAのデータ型一覧と使い分け【早見表】
  5. Variant型は使うべき?メリットと注意点
  6. 変数の初期化と値の代入方法
  7. Option Explicitで変数宣言を強制する方法
  8. 変数のスコープ(適用範囲)を理解しよう
  9. VBA Dimでよくあるエラーと対処法
  10. Dim宣言の動作をデモで確認
  11. まとめ:VBA Dim変数宣言のベストプラクティス
  12. よくある質問(FAQ)

VBAのDimとは?変数宣言の基本を理解しよう

Dimは「Dimension(次元)」の略

Dimは「Dimension(ディメンション=次元)」の略語です。もともとはFORTRAN言語で配列の次元を宣言するために使われていたキーワードで、それがBASIC言語に引き継がれ、VBAでは変数全般を宣言するステートメントとして定着しました。

つまり「Dim」と書くことで、「これから使う変数の名前と型を宣言しますよ」とVBAに伝えているのです。

変数とは「データを一時的に入れる箱」

変数とは、プログラムの実行中にデータを一時的に格納しておく「箱」のようなものです。

日常の例VBAの変数
名前を書くメモ帳String型の変数
計算結果を控える電卓Long型・Double型の変数
Yes/Noで答えるチェックリストBoolean型の変数

変数を使うことで、セルの値を一時的に保持したり、計算結果を次の処理に渡したりできます。

なぜ変数宣言が必要なのか

変数宣言には次の3つの重要なメリットがあります。

  • メモリの効率化: データ型を指定することで、必要最小限のメモリだけを確保できます
  • バグの防止: タイプミスがあった場合にエラーで教えてくれます(Option Explicit使用時)
  • コードの可読性向上: 変数の用途が明確になり、他の人がコードを読みやすくなります

変数宣言をサボると、後から原因不明のバグに悩まされることがあります。必ず宣言する習慣をつけましょう!

Dimの基本的な書き方と構文

「Dim 変数名 As データ型」の基本構文

Dimの構文はとてもシンプルです。

Dim 変数名 As データ型

具体的な例を見てみましょう。

Sub SampleBasicDim()
    ' 文字列型の変数を宣言
    Dim userName As String

    ' 整数型の変数を宣言
    Dim rowCount As Long

    ' 真偽値型の変数を宣言
    Dim isComplete As Boolean

    ' 値を代入して使う
    userName = "田中太郎"
    rowCount = 100
    isComplete = True

    ' メッセージ表示
    MsgBox userName & "さんのデータ: " & rowCount & "行"
End Sub

Dimのあとに変数名、Asのあとにデータ型を書くだけです。

複数の変数を1行で宣言する方法と注意点

カンマ区切りで1行に複数の変数を宣言できます。ただし、よくある間違いがあるので注意してください。

Sub SampleMultipleDim()
    ' --- 正しい書き方 ---
    Dim i As Long, j As Long, k As Long

    ' --- 間違いやすい書き方(注意!) ---
    Dim a, b, c As Long
    ' ↑ aとbはVariant型になり、cだけがLong型
    '   各変数にAsで型を指定する必要がある
End Sub

「Dim a, b, c As Long」と書くと全部Long型になりそうですが、実はaとbはVariant型です。VBA特有の落とし穴なので気をつけてください!

書き方aの型bの型cの型
Dim a, b, c As LongVariantVariantLong
Dim a As Long, b As Long, c As LongLongLongLong

変数名の命名規則

VBAの変数名には以下のルールがあります。

  • 先頭は英字(アルファベット)で始める必要がある
  • 使える文字は英数字アンダースコア(_)
  • 半角255文字以内(日本語変数名も使えるが非推奨)
  • VBAの予約語(Sub、Dim、If など)は使えない
  • 大文字・小文字は区別されない(myVar と MyVar は同じ変数)

実務では、変数の役割がわかる名前をつけるのがベストプラクティスです。

悪い例良い例理由
xrowCount何の数値かわかる
auserName何の文字列かわかる
flgisComplete真偽値であることが明確
期間限定でChatGPT✖️Googleスプレットシートのコンテンツ配布中!

LINEでExcelを気軽に学べる

しんたろ。
しんたろ。
Excel歴10年以上 → アプリ開発者
Profile
大手メーカーに15年以上勤務。製造部門で海外拠点の立ち上げ支援や、現場責任者として採算管理・納期管理・設備オペレートを経験。 2023年にDX人材育成プログラム第1期生として活動後、現在は製造現場のスケジュール運用を支えるアプリの企画・開発をメインに活動中。工程表示表作成の内製化SaaSを構築し、年間1,300万円のコスト改善を実現。 Excelによる業務改善で年間240時間の残業削減を達成した経験を活かし、ブログやSNSでも情報発信しています。
プロフィールを読む

VBAのデータ型一覧と使い分け【早見表】

よく使うデータ型3選(Long・String・Boolean)

VBAにはさまざまなデータ型がありますが、実務で使う頻度が高いのは次の3つです。

  • Long(長整数型): 整数を扱うときはほぼLong一択
  • String(文字列型): セルのテキストやファイルパスの格納に
  • Boolean(ブール型): 条件フラグ(True / False)の管理に

まずはこの3つを押さえておけば、多くの場面に対応できます。

以下がVBAの主要データ型の一覧表です。

データ型格納できる値サイズ値の範囲主な用途
Byte正の整数1バイト0〜255バイナリデータ
Integer整数2バイト-32,768〜32,767※Long推奨
Long整数4バイト約-21億〜21億行番号・カウンタ
Single小数4バイト有効桁数7桁簡易的な小数計算
Double小数8バイト有効桁数15桁精密な小数計算
Currency通貨8バイト小数4桁固定金額計算
String文字列可変最大約20億文字テキスト全般
Boolean真偽値2バイトTrue / Falseフラグ・条件判定
Date日付・時刻8バイト100/1/1〜9999/12/31日付処理
Objectオブジェクト参照4バイト任意のオブジェクトシート・ブック操作
Variant何でも16バイト以上すべての型に対応型不定の場合のみ

数値型の使い分け(Integer / Long / Double / Currency)

整数を扱う場合はLong型を使ってください。Integer型は範囲が狭い(-32,768〜32,767)うえ、VBAの内部処理ではInteger型もLong型に変換されるため、パフォーマンス上のメリットがありません。

Sub SampleNumericTypes()
    Dim rowNum As Long       ' 行番号(Longを使う)
    Dim price As Currency    ' 金額(通貨型で誤差防止)
    Dim rate As Double       ' 割合・税率(小数を扱う)

    rowNum = Cells(Rows.Count, 1).End(xlUp).Row
    price = 1980
    rate = 0.1

    MsgBox "最終行: " & rowNum & vbCrLf & _
           "税込価格: " & price * (1 + rate)
End Sub

文字列型(String)の特徴

String型はセルのテキスト取得やファイルパスの格納など、最も幅広く使われる型のひとつです。宣言時の初期値は空文字列("")です。

日付型(Date)・ブール型(Boolean)の使いどころ

  • Date型: 日付や時刻の計算(経過日数の算出など)に便利です。VBAの日付操作について詳しくはVBAで今日の日付を取得する方法も参考にしてください。
  • Boolean型: 処理の実行フラグやIF文の条件判定に使います。TrueまたはFalseの2値のみ格納できます。

Variant型は使うべき?メリットと注意点

Variant型とは(型指定を省略した場合の挙動)

Variant型は「何でも入る万能型」です。データ型を省略してDim xと書くと、自動的にVariant型になります。

Sub SampleVariant()
    ' 以下はすべてVariant型になる
    Dim value1            ' As を省略 → Variant
    Dim value2 As Variant ' 明示的にVariant

    ' 何でも代入できる
    value1 = 100          ' 数値
    value1 = "テスト"      ' 文字列に変わる
    value1 = #2026/1/1#   ' 日付に変わる
End Sub

Variant型のデメリット(メモリ・速度・バグの温床)

Variant型には以下のデメリットがあります。

  • メモリ消費が大きい: 16バイト以上(Long型の4倍)
  • 処理速度が遅い: 実行時に型判定が発生する
  • バグを見逃しやすい: 型の不一致でエラーにならないため、意図しない動作を見つけにくい

Variant型を使ってもよいケース

ただし、以下のケースではVariant型が適切です。

  • セルの値を取得するとき(セルには数値・文字列・エラー値など様々な型が入り得る)
  • 配列を動的に扱うとき
  • ワークシート関数の戻り値を受け取るとき

変数の初期化と値の代入方法

各データ型の初期値

VBAでは、変数を宣言した時点で自動的に初期値が設定されます。

データ型初期値
Long / Integer / Double 等の数値型0
String“”(空文字列)
BooleanFalse
Date1899/12/30(シリアル値0)
ObjectNothing
VariantEmpty

値の代入(=による代入)

通常の変数(数値・文字列・日付など)には、=(イコール)で値を代入します。

オブジェクト変数とSet文の使い方

ワークシートやセル範囲などのオブジェクト型の変数には、Setキーワードを使って代入する必要があります。Setを使わないとエラーになります。

Sub SampleSetStatement()
    ' オブジェクト変数の宣言
    Dim ws As Worksheet
    Dim rng As Range
    Dim wb As Workbook

    ' Setで代入(オブジェクトはSetが必要)
    Set ws = ThisWorkbook.Sheets("Sheet1")
    Set rng = ws.Range("A1:D10")
    Set wb = ThisWorkbook

    ' オブジェクトのプロパティにアクセス
    MsgBox "シート名: " & ws.Name & vbCrLf & _
           "セル数: " & rng.Cells.Count

    ' 使い終わったらNothingを代入(推奨)
    Set ws = Nothing
    Set rng = Nothing
    Set wb = Nothing
End Sub

DimとSetの違いをまとめると、Dimは「箱を用意する(宣言)」、Setは「箱にオブジェクトを入れる(代入)」です。数値や文字列にはSetは不要です!

Dimとsetの使い分けまとめ
操作通常の変数(数値・文字列)オブジェクト変数
宣言Dim x As LongDim ws As Worksheet
代入x = 100Set ws = Sheets("Sheet1")
解放不要(自動)Set ws = Nothing

VBAのプロシージャ(SubやFunction)の基本構造については、VBAのFunctionとSubプロシージャの違いで詳しく解説しています。

Option Explicitで変数宣言を強制する方法

Option Explicitとは

Option Explicitは、モジュールの先頭に記述するステートメントで、すべての変数にDim宣言を強制するための設定です。

Option Explicitを記述していないと、宣言していない変数名を使ってもエラーにならず、自動的にVariant型として新しい変数が作られます。これが深刻なバグの原因になります。

Option Explicit  ' ← モジュールの一番上に書く

Sub SampleOptionExplicit()
    Dim totalCount As Long
    totalCount = 10

    ' スペルミス: totalCaunt → 宣言されていない変数なのでエラーになる
    ' Option Explicitがなければエラーにならず、0が入ったまま処理が進んでしまう
    MsgBox totalCaunt  ' ← コンパイルエラー「変数が定義されていません」
End Sub

VBEでの設定手順

毎回手動でOption Explicitを書かなくても、VBE(Visual Basic Editor)の設定で自動挿入できます。

  • VBEを開く(Alt + F11)
  • メニューから ツールオプション を選択
  • 編集 タブの「変数の宣言を強制する」にチェックを入れる
  • OKをクリック

この設定を行うと、新規モジュールを作成したときに自動的にOption Explicitが挿入されます。

Option Explicitは必ず設定しておきましょう。VBA開発の基本中の基本です!

宣言を強制するメリット

  • タイプミスを即座に検出: 宣言していない変数名を使うとコンパイルエラーになる
  • 意図しないVariant型を防止: 必ず型を意識して宣言するようになる
  • デバッグ時間の大幅短縮: バグの原因が変数のスペルミスだった、という事態を防げる

変数のスコープ(適用範囲)を理解しよう

変数にはスコープ(有効範囲)があり、宣言する場所やキーワードによって、どこから参照できるかが変わります。

プロシージャレベル変数(Dim)

プロシージャ(Sub / Function)の内部でDimを使って宣言した変数は、そのプロシージャ内でのみ有効です。プロシージャの実行が終わると、変数の値は破棄されます。

Sub ProcedureA()
    Dim localVar As Long
    localVar = 100
    MsgBox localVar  ' → 100が表示される
End Sub

Sub ProcedureB()
    ' localVarはProcedureAの中でだけ有効
    ' ここでlocalVarを使うとエラーになる
    MsgBox localVar  ' → コンパイルエラー
End Sub

モジュールレベル変数(Private / Dim)

モジュールの先頭(プロシージャの外側)で宣言すると、そのモジュール内のすべてのプロシージャから参照できます。PrivateDimはモジュール先頭では同じ意味です。

Option Explicit

' モジュールレベル変数(このモジュール内のどのプロシージャからも使える)
Private moduleVar As String
Dim anotherModuleVar As Long  ' Dimでも同じ効果

Sub SetValue()
    moduleVar = "テストデータ"
    anotherModuleVar = 50
End Sub

Sub GetValue()
    MsgBox moduleVar       ' → "テストデータ"
    MsgBox anotherModuleVar ' → 50
End Sub

グローバル変数(Public)

Publicで宣言した変数は、プロジェクト内のすべてのモジュールから参照できます。

' Module1の先頭
Public globalUserName As String

' --- Module2 ---
Sub UseGlobalVar()
    globalUserName = "鈴木一郎"
End Sub

' --- Module3 ---
Sub ShowGlobalVar()
    MsgBox globalUserName  ' → "鈴木一郎"
End Sub

Dim・Private・Publicの使い分け早見表

キーワード宣言場所有効範囲使いどころ
Dimプロシージャ内そのプロシージャのみ最も基本的。まずはこれを使う
Dim / Privateモジュール先頭そのモジュール全体モジュール内で値を共有したいとき
Publicモジュール先頭プロジェクト全体全モジュール共通の設定値など

スコープは「なるべく狭く」が原則です。まずDimで宣言し、本当に必要な場合だけPrivateやPublicに広げましょう。

VBA Dimでよくあるエラーと対処法

「変数が定義されていません」エラー

原因: Option Explicitが有効な状態で、Dimで宣言していない変数名を使っている。

対処法:

  • 変数名のスペルミスがないか確認する
  • 使用するすべての変数にDim宣言を追加する
  • 他のプロシージャで宣言した変数を使おうとしていないか確認する(スコープの問題)

「型が一致しません」エラー(実行時エラー13)

原因: 変数のデータ型と代入する値の型が合わない。

対処法:

  • 数値型の変数に文字列を代入していないか確認する
  • セルの値を取得する際、セルが空やエラーの可能性がある場合はVariant型で受け取る
  • 型変換関数(CLng()CStr()CDbl()など)を使う

複数変数の1行宣言で型がVariantになる罠

前述のとおり、Dim a, b, c As Longと書くとaとbはVariant型になります。これはVBA特有の仕様で、他の言語(VB.NETなど)とは異なるため特に注意が必要です。

対処法: 必ず各変数にAs句で型を指定してください。

' NG: aとbがVariant型になる
Dim a, b, c As Long

' OK: すべてLong型
Dim a As Long, b As Long, c As Long

' OK: 1行ずつ書くのも明確でよい
Dim a As Long
Dim b As Long
Dim c As Long

Dim宣言の動作をデモで確認

変数宣言と値の代入がどのように動作するか、下のインタラクティブデモで確認できます。

‘ 変数の型と値を確認するマクロ
Sub 変数宣言デモ()
    Dim myName As String
    Dim myAge As Long
    Dim myScore As Double
    Dim isActive As Boolean
    myName = “田中太郎”
    myAge = 30
    myScore = 85.5
    isActive = True
    MsgBox myName & ” / “ & myAge & ” / “ & myScore
End Sub
下のデモで実行結果を確認できます
📊 変数テスト.xlsx – Excel
ABC
1 変数名
2 myName String 田中太郎
3 myAge Long 30
4 myScore Double 85.5
5 isActive Boolean True
準備完了 100%
✅ 4つの変数が宣言され、値が代入されました!
☝ 適切な型を指定することでメモリ効率とバグ防止に役立ちます

まとめ:VBA Dim変数宣言のベストプラクティス

VBAのDim(変数宣言)について、基本構文からデータ型、スコープまで解説しました。最後に、実務で押さえておきたいポイントをまとめます。

  • 変数は必ずDimで宣言する(Option Explicitを設定しておく)
  • データ型は明示的に指定する(Variant型の安易な使用は避ける)
  • 整数にはLong型を使う(Integer型は非推奨)
  • オブジェクト変数にはSetで代入する(通常の=ではエラーになる)
  • スコープは最小限にする(Dim → Private → Publicの順で検討)
  • 変数名は意味のある名前をつける(コードの可読性を高める)

Dimはマクロ開発の土台となる知識です。正しい変数宣言の習慣を身につけることで、バグが少なく読みやすいVBAコードを書けるようになります。

VBAの基礎をさらに固めたい方は、SubとFunctionプロシージャの使い分け今日の日付を取得する方法もあわせてご覧ください。Excel業務の効率化にVBAを活用したい方は、ExcelVBAおすすめ入門ガイドも参考にしてみてください。

よくある質問(FAQ)

Q1. VBAのDimとは何の略ですか?

DimはDimension(次元)の略です。もともとはFORTRAN言語で配列の次元を宣言するために使われていた用語がBASIC言語に引き継がれ、VBAでは変数全般を宣言するステートメントとして使われています。

Q2. VBAで変数を宣言しないとどうなりますか?

変数を宣言せずに使用すると、自動的にVariant型として扱われます。Variant型はメモリ消費が大きく処理速度も遅くなります。また、変数名のタイプミスがあってもエラーにならないため、バグの原因になります。Option Explicitを設定して宣言を強制することを推奨します。

Q3. VBAのInteger型とLong型はどちらを使うべきですか?

Long型を使うべきです。Integer型の範囲は-32,768〜32,767と狭く、現在のVBAでは内部的にInteger型もLong型に変換して処理されるため、パフォーマンス上の利点はありません。整数を扱う場合はLong型を選択してください。

Q4. VBAで複数の変数を1行で宣言できますか?

できます。「Dim a As Long, b As Long, c As String」のようにカンマ区切りで宣言します。ただし「Dim a, b, c As Long」と書くとaとbはVariant型になり、cだけがLong型になるため注意が必要です。各変数にそれぞれAs句で型を指定してください。

Q5. DimとPublicとPrivateの違いは何ですか?

変数の使える範囲(スコープ)が異なります。プロシージャ内のDimはそのプロシージャ内でのみ有効です。モジュール先頭のDim/Privateはそのモジュール内で有効です。Publicは全モジュールから参照できます。基本的にはスコープを最小限にするDimの使用が推奨されます。

Q6. VBAのDimとSetの違いは何ですか?

Dimは変数を宣言するステートメントで、Setはオブジェクト変数にオブジェクトを代入するステートメントです。数値や文字列は「変数名 = 値」で代入しますが、ワークシートやセル範囲などのオブジェクトは「Set 変数名 = オブジェクト」と書く必要があります。

Q7. VBAのVariant型はなぜ避けるべきですか?

Variant型は16バイト以上のメモリを消費し(Long型の4倍)、処理速度が遅くなります。また、どんな値でも格納できるため型の不一致エラーが発生せず、バグが見つかりにくくなります。ただし、セルの値を取得する場合など、型が不定のケースではVariant型が適切です。

ABOUT ME
しんたろ。
しんたろ。
Excel歴10年以上 → アプリ開発者
大手メーカーに15年以上勤務。製造部門で海外拠点の立ち上げ支援や、現場責任者として採算管理・納期管理・設備オペレートを経験。 2023年にDX人材育成プログラム第1期生として活動後、現在は製造現場のスケジュール運用を支えるアプリの企画・開発をメインに活動中。工程表示表作成の内製化SaaSを構築し、年間1,300万円のコスト改善を実現。 Excelによる業務改善で年間240時間の残業削減を達成した経験を活かし、ブログやSNSでも情報発信しています。
記事URLをコピーしました