Excelマクロで型宣言しない気持ちもわからなくもない4つの理由



Excelマクロで型宣言すべきかどうかでよく議論になりますが、基本型宣言した方が速度面やバグ防止の面でメリットがあるのですが、型宣言しないで使う気持ちもかわらなくはありません。そんな人たちの代弁をしたいと思います。

宣言と同時に値の入力ができない 

一般的なプログラミング言語では型宣言と値代入が同時にできます。以下はC言語の例。
int i=0;

ところがVBAではこれができないのです。型宣言の後ろに値を代入するとエラーが出ます。どういうわけか定数宣言(Const)の場合はできるんですが変数ではできないのです。型宣言と値代入を2行で書かなければいけないわけで、これが割とストレスで、型宣言を省略してしまう理由の1つなんじゃないかなって思いますね。
 
' エラー'
Dim i As Integer = 1
' なぜかConstはOK'
Const i As Integer = 1

型推論の時点で型を固定化してくれればいいんですけどね。数値を入れた後に文字列の代入ができてしまうのでややこしいことになっていると思います。(スクリプト言語全般に言えることですが) 

for文中に宣言できない 

プログラミングしている人ならわかると思うけど、「やり捨てポイ変数」ってどうしてもあるわけです(言葉が悪くてすみません..)。典型的なものとしてforループで使う変数です。 以下のようにC言語やJava(C#も)、変数iはfor分内で使うのみでforループから外れたら不要になります。

for(int i=0; i>5; i++) 

VBAではこれができません。For文の前に宣言しておかなければなりません。このようなやり捨てポイ変数をfor外でわざわざ型宣言するってことに結構な抵抗があんですよね。Forループが終わったらいらなくなるんだから。たぶんこの違和感は僕だけじゃないはず。
 
' エラー'
For Dim i As Integer=0 to 4
' 正しい'
Dim i As Integer
For i=0 to 4

スコープが雑 

CやJavaなどではスコープ(変数の有効範囲)が細かくて、{ }内で宣言した変数は{ }内のみで有効なんです。以下のようにif外の変数iとif内の変数iは別物です。

int i=1;
if(...){
 char i='a';
}
printf(i); //出力1 

VBAだとスコープがプロシージャ内という雑な範囲なのでうまく行きません。

Dim i As Integer
i=1
IF ... Then
 i="a" 'エラー'
EndIF

これが型宣言をしない直接的な原因にはならないとは思いますが、狭いスコープ内でちょっとだけ変数を使いたい時なんかに前後関係を気にしなきゃいけないという点はストレスになりますね。

VBA以外のスクリプト言語はそんなにうるさくないぞ

VBAはスクリプト言語の範疇かと思いますが、一般的にスクリプト言語ではあまり型宣言に対してうるさく言われないんですよね。PyrthonにしろPHPにしろ。少なくともこの2つの言語のプログラム例で型宣言しているケースは見たことないです。Javascriptだと宣言しているケースが多いけどほとんどがvarやletで宣言していますね。VBAのVariantみたいなもんでやはり風潮として緩いです。

そんなスクリプト言語の一般的な風潮を考えると、VBAで型宣言しないユーザーはいてもおかしくないなって気はします。

じゃあ僕はどうしているのか?

じゃあ僕自信はどうなのかって言うと、自分だけが使うちょっとしたプロラムは型宣言しません。一方で複数人が使うそこそこ大きいプログラムの場合は型宣言するようにしています。

これは速度面で型宣言した方が有利だからです。

ちなみに、前者ではセル参照で.Valueすら入れません。後者は入れるしSheets("Sheet1")とシートも指定します。複数人が使うケースでは誤動作の元ですからね。最近はWorkbooksまで記述しています。Excelファイルが複数開いている状態ではこれを入れた方が速いみたいです。

まあ、僕的には型宣言しない人たちの気持ちはわかりますね。