VBA(ExcelやWordのマクロ)のコードを書いていて長くなると変数の入力間違いなどに気付きにくくなります。
この場合、コードの先頭に「Option Explicit」と書きます。こうすると変数の綴りが違うとエラーが発生してすぐに気付きます。
そのためには全ての変数について「Dim」を使って明示的に宣言する必要があります。
変数を拾いだすのは結構、面倒です。
そこでJavaScriptを使って変数を全て拾い出す方法を考えました。
VBAでは変数に使える文字は、半角英数字、アンダースコアの他、全角のひらがな、カタカナ、漢字が使えます。
漢字は、シフトJISだけ想定すればいいので「一-龠」で拾えます。
先頭は数字とアンダースコアは使えません。
変数には何かを代入する場面があるはずなので「文字列 =」という部分を拾い出します。
拾い出した文字列の重複を削除し、タブと「Dim 」を付けて返します。
配列変数はあらかじめ宣言しないと、そもそも使えないので無視します。
ダブルクォートに挟まれた部分、シングルクォート以降は無視します。
function pick_variable_vba(list) {
var words, variable_string, re, ms, i;
list = list.replace(/".*?"/g, "");
list = list.replace(/'.*/g, "");
words = [];
variable_string = "a-zーぁ-んァ-ヶ一-龠";
re = new RegExp("[" + variable_string + "][0-9_" + variable_string + "]* =", "gi");
ms = list.match(re);
if (ms == null) {
return "";
}
for (i = 0; i < ms.length; i++) {
words.push("\tDim " + ms[i].replace(/ =/, ""));
}
words = unique(words);
return words.join("\n");
}
var words, variable_string, re, ms, i;
list = list.replace(/".*?"/g, "");
list = list.replace(/'.*/g, "");
words = [];
variable_string = "a-zーぁ-んァ-ヶ一-龠";
re = new RegExp("[" + variable_string + "][0-9_" + variable_string + "]* =", "gi");
ms = list.match(re);
if (ms == null) {
return "";
}
for (i = 0; i < ms.length; i++) {
words.push("\tDim " + ms[i].replace(/ =/, ""));
}
words = unique(words);
return words.join("\n");
}
なお「unique」という自作の関数を使っています。「GoogleカレンダーからExcelにデータを移行する方法」に書かれています。
例えば次のようなVBAのコードがあったとします。
Function test(a)
x = 0
For i = 1 To a
x = x + i
Next i
test = x
End Function
x = 0
For i = 1 To a
x = x + i
Next i
test = x
End Function
これに対し、上の「pick_variable_vba」を使うと次のようになります。
Dim x
Dim i
Dim test
Dim i
Dim test
コード内の変数がリストアップされます。
関数名である「test」も拾われてしまうので、まだ工夫の余地はありますが、コーディングの補助になればということで、使ってみてください。
Text2Whatで試すことができます。
コメント