こんにちは!VBAの基本をマスターして、次のステージへ進もうとしているあなたへ。
マクロの記録ボタンを押して生成されたコードを覗いてみると、なんだかよく分からないけれど動くものが出来上がりますよね。最初はそれで感動するものですが、少しずつコードを自分で書くようになると、こんな疑問や不安が湧いてきませんか?
「なんだか最近、処理が重い気がする…」
「意図しないところで変なデータが入って、突然エラーで止まるんだけど…」
その原因、もしかすると「Variant(バリアント)型の悪癖」にあるかもしれません。
今回は、すべての変数を`Dim x As Variant`で済ませてしまう魔界の住人から抜け出し、「型指定」によってメモリを最適化し、実行時エラーを未然に防ぐプロの技術を伝授します。ここをクリアすれば、あなたのVBAスキルは一気にワンランク上のエンジニア領域へ到達しますよ。さあ、一緒に扉を開けましょう!
—
1. なぜ「Variant型」を撲滅しなければならないのか?
VBAで変数を宣言するとき、型を指定しない(または `Variant` と書く)と、その変数は「何でも入れられる万能ボックス(Variant型)」になります。
一見すると「型を気にしなくていいから楽じゃん!」と思えますが、裏側では大変なことが起きています。
Variant型が抱える2大悪
1. メモリの無駄遣い(肥満化)
数字を入れるのか、文字を入れるのか、オブジェクトを入れるのか分からないため、Excelは「いつ、どんなデカいデータが来てもいいように」最初から特大のスペースを確保します。これが数千、数万回のループで積み重なると、PCのメモリを圧迫し、処理が重くなる原因になります。
2. 「おせっかい機能」による予期せぬバグ
例えば、本当は「数値」を入れて計算したい変数に、うっかり「文字列」が混ざってしまったとします。Variant型は「おっ、文字と数字を足すんだな!よし、勝手に文字として結合しといたるわ!」と、エラーを出さずに間違った結果を返します。 これが実務で一番怖い「サイレントエラー(沈黙のバグ)」です。
図解:型指定なし vs 型指定あり
【Variant型(何でもBOX)】
[ 何が入るか不明 ] ──> 常に特大メモリ消費 & 勝手に解釈して誤作動の危険!
【適切な型指定(専用BOX)】
[ Long型:整数専用 ] ──> スリムで最速 & 違うデータが入ると即座にVBAが怒ってくれる!
プログラミングの世界では、「変数は、入れるデータが決まった専用の箱に入れる」のが鉄則です。
—
2. 厳選!これだけは覚えるべき基本データ型
VBAで実務をこなす上で、最初からすべてを覚える必要はありません。まずは以下の「一軍メンバー」だけを確実に使いこなせるようにしましょう。
| データ型名 | 意味・用途 | 代入できるものの例 | メモリの重さ |
| :— | :— | :— | :— |
| Long (ロング) | 整数(カウンターや行番号など) | `10`, `-500`, `100000` | 軽(4バイト) |
| Double (ダブル) | 小数点を含む数値 | `3.14`, `-0.001`, `100.5` | 中(8バイト) |
| String (ストリング) | 文字列 | `”山田太郎”`, `”A1″` | 可変 |
| Boolean (ブーリアン) | 真偽値(フラグ管理) | `True`(はい), `False`(いいえ) | 超軽(2バイト) |
| Worksheet など | オブジェクト(表やセル) | `ActiveSheet` など | 重(参照を保持) |
> 💡 先輩からのアドバイス:Integerを使うな!
> 昔の教科書には「整数ならInteger」と書いてありましたが、現代の32bit/64bit環境では、より高速に処理できる `Long` を使うのがデファクトスタンダード(常識)です。整数を扱うときは、迷わず `Long` を選びましょう。
—
3. 実践!型指定で安全かつ爆速なコードを書く
百聞は一見にしかず。実際のコードを見比べてみましょう。
以下のサンプルは、「A列の数値をすべて2倍にしてB列に出力する」というよくある処理です。
❌ 悪い例(Variantだらけの爆弾コード)
Sub BadExample()
Dim i, total, val ‘ 型を指定していないので、すべてVariant型になる
total = 0
For i = 1 to 10000
val = Cells(i, 1).Value
Cells(i, 2).Value = val 2
total = total + val
Next i
MsgBox “合計: ” & total
End Sub
- ここがダメ!: `Dim i, total, val` と書いても、`i` と `total` はVariant型になります(VBAの仕様の罠です)。メモリを食ううえに、もしセルの中に文字列が混ざっていたら、途中で計算がおかしくなります。
⭕ 良い例(型指定されたプロのコード)
Sub GoodExample()
‘ 変数ごとにしっかりと型を明示する(型ごとにDimを書くのがプロ流)
Dim i As Long
Dim targetValue As Double
Dim totalSum As Double
totalSum = 0
‘ ループ処理
For i = 1 To 10000
‘ セルから値を取得
targetValue = CDbl(Cells(i, 1).Value) ‘ 数値に変換を保証
‘ 計算結果を書き込む
Cells(i, 2).Value = targetValue 2
‘ 合計に加算
totalSum = totalSum + targetValue
Next i
MsgBox “安全な処理が完了しました。合計: ” & totalSum, vbInformation
End Sub
—
4. さらに鉄壁にする魔法の呪文:「Option Explicit」
「でも、うっかり型を書き忘れてしまいそう……」
そんなあなたに最強の機能を紹介します。それがVBAのモジュールの一番上に書くこの一文です。
Option Explicit
これを記述しておくと、「変数を宣言し忘れたり、スペルミスしたりすると、コードを実行すらさせてくれない(エラーで教えてくれる)」ようになります。
【Option Explicitの効果】
うっかり「Dim cmt As Long」と書くべきところを「cnt = 1」と打ち間違えた!
↓
Option Explicitが「おい!cntなんて変数、宣言されてないぞ!」と赤ペン先生のように即座に怒ってくれる。
マクロの記録からステップアップした人ほど、この `Option Explicit` をオフにしていることが多いですが、プロの現場では「全モジュールへの記述義務化(VBEの設定で「変数の宣言を強制する」にチェック)」が鉄則です。
設定方法:
VBE(Visual Basic Editor)を開き、上部メニューの [ツール] > [オプション] を開き、[編集]タブにある [変数の宣言を強制する] にチェックを入れてください。これだけで、新しく作るすべてのモジュールに自動で `Option Explicit` が入るようになります。
—
まとめ:今日からあなたのコードは生まれ変わる
いかがでしたでしょうか? 今回のポイントをギュッと凝縮します。
1. Variant型は「何でも入る代わりに、メモリを食い、バグを生む万能ボックス」なので撲滅する。
2. 整数は `Long`、小数は `Double`、文字は `String` と、適切な専用の型を指定する。
3. モジュールの先頭に必ず `Option Explicit` を置き、宣言漏れを防ぐ。
最初は「わざわざ型を書くのめんどくさいな」と感じるかもしれませんが、慣れてくると「型が決まっていないコードなんて、怖くて書けない」と思えるようになります。エラーを未然に防ぎ、動作も軽快な、美しいVBAコードを手に入れましょう!
ここをクリアしたあなたなら、もう「初心者マーク」は卒業です。明日からのマクロ作成が、もっと楽しく、もっと自信に満ちたものになりますよ。バッチリですね!
