変数の宣言を強制する設定

VBA画面のオプション画面の編集タブで「変数の宣言を強制する」のチェックを付けると、モジュールの先頭に「Option Explicit」が記述され、VBAの処理で使う変数のDim宣言などが必須になります。チェックを付けずにモジュールの先頭に「Option Explicit」を記述しても同じ意味になります。

新規ブックのVBAの初期状態ではチェックはついていません。よって、初期状態では変数の宣言はしなくてよい状態になっています。

そのため、Dim変数の宣言が強制されていなければ以下のような変数宣言がないコード(変数宣言をコメントアウト)も許可されます。

上のコードでは変数をa,b,rと3つ使っていますが、「変数の宣言を強制する」にチェックを付けていない場合はDimステートメントは使ってなくてもエラーにならず正しく動作します。

ただ、上のコードのように変数宣言を省略することは避けた方がよいです。

変数の強制はした方がいい

変数の強制をした方がいいかどうかについてですが、VBAに限って言えば強制した方がよいでしょう。

正確に言うと、変数宣言を必ず行うために、「変数の宣言を強制する」にチェックを付けた方がよいです。

VBAは「初心者用」とか「簡単」とか言われがちで、その視点で書かれている書籍やサイトも少なくありません。その流れで変数宣言を省略する話が出てくることがあるようなのですが、「初心者用」であることと「変数宣言を省略する」ことに相関関係はありません。

なぜ変数宣言をした方がいいのか

変数宣言はした方がいいのにはもちろん理由があります。

それは、変数宣言している方がしていない場合よりも有利だからです。

「変数の宣言を強制する」にチェックを付けると存在しない変数などのチェックが効きますが、それは副次的な話でしかありません。本質的なことをコードに書く際に、変数チェックを機械的にしてくれる、という手助けをしてくれるに過ぎません。

本質的に必要なのは、そのコードが読みやすいか、拡張や保守しやすいか、シンプルであるか、意図を明確に伝えているか、やりたいことを充足しているか、などです。そこに初心者かどうかは関係ありません。初心者であっても可能な限りよりよいコードを書いた方がいいです。

変数宣言をすることは「ソースコードを書くルール」の一つに過ぎませんが、コーディングルールをきちんと決めて守ることが、後で見てもわかりやすかったり機能追加などの変更がしやすかったりと、結果としてわかりやすいコードになります。

変数宣言の位置

変数宣言を行う位置は、その変数を使う前であれば関数の先頭でも変数を使う直前でもどこでも構いません。当サイトで紹介しているコードの変数宣言は説明に都合がいいため関数の先頭にまとめて書いています。

ただ、ループカウンタなど変数の利用範囲が限定されている場合は使う直前に宣言した方がいい場合もあります。

上のコードの変数宣言を利用の直前に書いた場合は以下のようになります。

VBAとシステムハンガリアン記法

変数の書き方で、当サイトでは変数の命名はシステムハンガリアン記法(変数の先頭に変数型などを示す1字を付ける書き方)で書いているコードが結構あります。sFilePath(Stringのs)とかiCount(Integerのi)とかの変数です。このように書いているのには理由があります。

それはVBAが良くも悪くも古い言語だからです。

現在主流のオブジェクト指向型のプログラミング言語はクラスを多用します。プリミティブ型と言われる単純な数値や文字列を格納する変数型を完全に排除している言語もあります。

そのような言語ではいろんなクラスを1字で示すことが困難で、そこにシステムハンガリアン記法を採用しようとしても「似たようなクラス名があった場合にどうしたらいいのか」という話に必ずなります。その状態でのシステムハンガリアン記法はむしろ邪魔で害悪な場合が多くなります。

ですが、VBAはJavaや.NETのようにクラスを多用しません。RangeやWorksheetやFileSystemObjectなど、使うクラスは限定されます。その場合、システムハンガリアン記法でも衝突することがほとんどありません。そういう理由から当サイトではシステムハンガリアン記法を採用しています。

Javaだけ経験したプログラマーが古い言語も新しい言語も一緒くたにして「システムハンガリアン記法は断固反対」「読みにくい」などと言う現場を見たことがありますが、開発状況によって何が便利なのかは異なりますので、単純にシステムハンガリアン記法がダメということにはなりません。

ちなみに私自身はVBAやC言語以外の言語を使う場合はシステムハンガリアン記法は使わず、アプリケーションハンガリアン記法(変数の性格を識別子にする記法)を使っています。