【GさんといくさんのVBAラボ】第1話:「Dimって何?」 〜変数と型の世界を完全理解する〜

Excel仕事術ノート

【GさんといくさんのVBAラボ】第1話:「Dimって何?」 〜変数と型の世界を完全理解する〜

「VBAのコードって、なんで最初に Dim がズラッと並ぶんだろう?」

マクロを書き始めた人なら、一度はそう思ったことがあるはずです。

このシリーズでは、見積もりマクロを一緒に育てている いくさん と、VBA側の案内役 Gさん の会話をベースに、実際の開発プロジェクトでつまづいたポイントを「ちゃんと腑に落ちるレベル」で解説していきます。

はじめに:Dimの正体に迫る

いくさん:
Gさん、VBAのコードって最初ぜんぶ Dim から始まるじゃないですか。
あれ、いったい何してるんです?

Gさん:
お、そこに気づきましたね。
Dim はね、VBAの世界でいちばん最初に覚える“召喚の呪文”みたいなものです。
この1行で、変数という名の『小さな入れ物』をこの世に作るんですよ。

例えばこんなコード:

Dim num As Double
num = 10

この2行で何が起きているかというと、

  • Dim num As Double で「num という名前の入れ物(変数)を用意して、数値用の箱にします」と宣言
  • num = 10 で、その箱の中に 10 という数字を入れる

これが、VBAの「変数」と「型」の一番シンプルな姿です。

A. 変数ってそもそも何者?

プログラミングで言う「変数」は、ざっくりいうと「名前がついた箱」です。

  • 箱には「数字」や「文字」や「日付」や「シート」など色々なものが入る
  • その箱に「名前(num, ws, total など)」をつけることで、後からその中身にアクセスできる

VBA では、その箱を作るときに Dim を使います。

Dim x As Double
Dim name As String
Dim ws As Worksheet

ここで重要なのが As の右側、つまり「型(Type)」です。

B. 型(Type)とは? 〜設計図と箱の関係〜

Gさんの表現でいうと、

  • 型(Type) = どんな種類のものか(設計図)
  • 変数(Variable) = その型を使って作った実物の箱

例えば:

Dim num As Double
  • Double … 「数値(小数点あり)を入れるための型」
  • num … Double型の箱、その中に 3.14 や 10 などの数値が入る

同じように、

Dim ws As Worksheet
  • Worksheet … Excelの「シートそのもの」を扱うときの型
  • ws … どのシートを指しているかを保持する変数

型を意識すると、コードがグッと読みやすくなります。

B-1. よく出てくる型の一覧(いくさん向け)

型名 意味 よくある使いどころ
Double 小数点ありの数値 Dim rate As Double 単価、税率、係数など
Long 整数(大きめ) Dim r As Long 行番号カウンタなど
String 文字列 Dim title As String 工事項目名、ファイル名
Boolean True / False Dim flg As Boolean 条件フラグ
Worksheet シートオブジェクト Dim ws As Worksheet 特定のシートを指す
Workbook ブックオブジェクト Dim wb As Workbook 元ファイルやテンプレートファイル
Object オブジェクト全般 Dim anyObj As Object 辞書やCollectionなど汎用
Variant なんでも入る“自由型” Dim v As Variant セルから値を受け取るときに便利

C. 「=」と「Set」の違い 〜値型とオブジェクト型〜

いくさん:
Dim num As Double のときは num = 10 って書きますよね?
でもシートのときは Set ws = ... になるの、なんか気持ち悪いです。

Gさん:
そこに「値」と「モノ」の違いがあるんですよ。
値(数字・文字)は = で代入。
モノ(シート・ブック・レンジ)は Set で“紐づけ”ます。

C-1. 値型の例(Double, Stringなど)

Dim num As Double
num = 10        ' ✅ OK

Dim txt As String
txt = "基本"    ' ✅ OK

ここで使っているのは、どちらも値なので = でそのまま代入できます。

C-2. オブジェクト型の例(Worksheet, Workbookなど)

Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("基本")   ' ✅ OK

ここで ws は「シートというモノへの参照(住所)」を持っています。

ws = "基本" と書いてしまうと、

  • 右側はただの文字列
  • 左側はシートオブジェクト

なので「型がちがう」と怒られます。

C-3. まとめ:どっちを使う?

ケース 正しい書き方 NG例
数値や文字列を入れる num = 10
name = "基本"
Set num = 10
シートやブックを指したい Set ws = Sheets("基本") ws = "基本"

D. Variant と Object の違い

いくさんが気にしていたポイント:

「Object と Variantって同じ“なんでも入る”仲間じゃないの?」

結論から言うと、

  • Variant = なんでも入る「 の箱」
  • Object = なんでも入る「オブジェクト の箱」

D-1. Variant の例

Dim v As Variant
v = 123          ' 数値
v = "hello"      ' 文字
v = #2025/11/10# ' 日付

値であればなんでも入りますが、シートを直接入れるのは普通はしません。

D-2. Object の例

Dim o As Object
Set o = Sheets("基本")                        ' シート
Set o = CreateObject("Scripting.Dictionary") ' 辞書

こちらは「モノ(オブジェクト)」を入れるための箱です。

D-3. 表で整理

中身 代入 用途
Variant 値(数値・文字・日付・空欄など) v = 100 セルの値受け取りに便利
Object オブジェクト(シート・辞書など) Set o = ... 辞書やRangeなど汎用オブジェクト

E. 日本語変数名ってアリ?「数字1」はなぜ動いたのか

いくさん:
Dim 数字1 As Double って書いたら、普通に動いたんですけど?
先頭は英字じゃなくてもいいんですか?

Gさん:
実はVBAは「全角文字(日本語)」も変数名に使えるんです。
仕様上、英字または全角文字から始めればOKなんですよ。

つまり:

  • Dim 数字1 As Double … ✅ 動く
  • Dim 1数字 As Double … ❌ NG(数字から始まるのはダメ)
  • Dim "数字" As Double … ❌ NG(ダブルクォーテーションはただの文字列)

ただし、実務的には以下の理由で英語+アンダースコア命名がおすすめです。

  • 海外版Excelや他ツールで文字化けする可能性
  • 他言語(Python, VB.NET)に移植しづらい
  • 検索や置換がしにくい

F. Variant が“空欄 → 0”を生むカラクリ

見積マクロの開発中に特にハマったのが、

「空欄のはずのセルに、なぜか 0 が入ってしまう」

これは、Variant型+自動変換が原因でした。

Dim x As Variant
x = Empty
Debug.Print CDbl(x)   ' ⇒ 0 になる

空欄(Empty)を CDbl で数値化すると、勝手に 0 に変換されるんです。

対策は「条件をネストして、危ないものを先に除外する」こと:

priceVal = wsSrc.Range(priceCol & r).Value   ' Variantで受け取る

If Not IsError(priceVal) Then          ' エラーは即スキップ
    If Not IsEmpty(priceVal) Then      ' 空欄もスキップ
        Dim s As String, v As Double
        s = Trim(CStr(priceVal))       ' 文字列化して空白を除去
        If s <> "" And IsNumeric(s) Then
            v = CDbl(s)                ' ここで初めて数値に変換
            If v <> 0 Then
                ' ここから安全に計算してOK
            End If
        End If
    End If
End If

この「一段ずつ絞り込む」書き方が、Ver007で安定動作するためのカギになっています。

G. まとめ:今日の「Dim」チェックリスト

  • Dim は “変数という箱” を作る呪文
  • As の右側の「型」は、その箱に何を入れるかを決める設計図
  • 数値や文字は =、シートやブックは Set で代入
  • Variant は便利だが、空欄 → 0 などの落とし穴がある
  • 日本語変数も動くが、英語+アンダースコアが実務向き

Dim がわかると、VBAのコードを「呪文」ではなく「会話」として読めるようになります。

次にコードを開いたとき、ぜひ一番上の Dim を眺めてみてください。 「この人(変数)はどんな型で、どこで活躍してるんだろう?」と想像できるようになったら、 いくさんはもう立派なVBA使いの入口に立っています。

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