変数の宣言を強制する
各モジュールの先頭で、下のコードを記述することで、変数の宣言が強制となります。
1 2 |
'変数宣言を強制 Option Explicit |
VBAの設定で、変数の宣言を強制することもできます。
- 【ツール】→【オプション】
- 【編集】タブを選択
- 【変数の宣言を強制する】をチェック
この設定は1回するだけでOKです。
次からモジュールを新規作成した時、自動でOption Explicitが出力されます。
変数定義は型指定をする
変数を定義する場合は、dim strUserName as String のように型まで定義します。
型定義がないと、どんな値でもセットできてしまいます。
数値しかセットしない変数に間違って文字列をセットしたりなど、プログラミングのミスを防止する意味でも大事なポイントです。
できるだけせまい範囲で定義をする
基本的には、イベントやサブルーチン内で変数を定義してください。
必要なものだけをPrivateやPublicで定義します。
Public変数が便利だからと言って、なんでもPublic変数にすると、どこの処理で変数を使用しているかわからなくなります。
変数定義は使う直前でする
少し前までは、処理内で使う変数は先頭エリアでまとめて記述することが正とされていました。
しかし最近では、メンテ性の面などから変数を使う直前で定義することが多くなってきています。
変数にセルの値などをセットする時は型変換する
変数にセルの値そのままセットしても、暗黙の変換でうまく動くことが多いです。
ただ、本当は文字”001″として保存したいのに、0が暗黙の変換でなくなり”1″として保存されるなど、バグの原因になります。
そのため、型変換をして変数にセットしましょう。
型変換の例
1 2 3 4 5 6 7 |
'商品コード Dim strShohinCode As String strShohinCode = CStr(Cells(1, 1).Value) '←文字 '数量 Dim lngSuryo As Long lngSuryo = CLng(Cells(1, 2).Value) '←数値 |
変数の使いまわしはしない
繰返し用の変数や、ワーク用の変数を使いまわすと、プログラムの意図がわかりにくくなり、バグの原因になります。
処理ごとに、きちんと変数を定義しましょう。
NG例
変数idxを使いまわしている
1 2 3 4 5 6 7 8 9 10 11 |
Dim idx As Long '行の移動 For idx = 1 To 10 Cells(idx, 1).Value = "行の値" Next '列の移動 For idx = 1 To 10 Cells(1, idx).Value = "列の値" Next |
OK例
処理それぞれで変数を定義している
1 2 3 4 5 6 7 8 9 10 11 12 |
Dim rowIdx As Long '行移動用 Dim colIdx As Long '列移動用 '行の移動 For rowIdx = 1 To 10 Cells(rowIdx, 1).Value = "行の値" Next '列の移動 For colIdx = 1 To 10 Cells(1, colIdx).Value = "列の値" Next |
Integer型は使わないでLong型を使う
これも少し前までは、メモリ節約するためにデータの大きさに応じて、Integer型とLong型を使い分けることが正とされていました。
しかし最近では、Integer型はLong型よりもパフォーマンスが劣るため、Long型を使うことが推奨されています。
変数の初期化を明示的に行う
Long型など数値の変数を定義した場合、初期値として0がセットされていますが、明示的に0をセットするなどして初期化を行いましょう。
1 2 3 4 |
Dim lngDataCount As Long 'データ件数 '初期化 lngDataCount = 0 |
小数点以下の計算では、Currency型を使う
小数のある計算でSingle型やDouble型を使うと、小数以下の計算結果で誤差が生じることがあります。
Currency型を使うことで、小数以下の計算結果の精度が向上します。
変更の可能性がある値は、定数を使う
消費税率など、今後変更が起こる可能性がある値は、ロジック(計算式)に直接記述しないで、定数として定義します。
もし計算式に直接0.08と記述していると、消費税率が変化した(0.08→0.15)時、各計算箇所すべてを修正しないといけません。。
定数として定義していれば、定数の値を設定している場所1ヶ所のみを修正すればいいので、修正時間の短縮・修正漏れの防止になります。
目的が同じ定数は、列挙型で定義する※数値のみ
例えば、エクセルの列位置を定数で定義すると、次のようになります。
1 2 3 4 5 6 |
'商品一覧エクセルの列位置 Public Const SHOHIN_COL_SHOHINCODE As Integer = 1 '商品コード Public Const SHOHIN_COL_SHOHINNAME As Integer = 2 '商品名 Public Const SHOHIN_COL_GENKA As Integer = 5 '原価 Public Const SHOHIN_COL_BAIKA As Integer = 6 '売価 Public Const SHOHIN_COL_ZAIKO As Integer = 10 '在庫数 |
このままでも問題はないのですが、同じ目的・グループの定数は列挙型を使う事でプログラムの可読性・メンテナンス性が向上します。
列挙型による定義
1 2 3 4 5 6 7 8 |
'商品一覧エクセルの列位置 Public Enum eShohinCol ShohinCode = 1 '商品コード ShohinName = 2 '商品名 Genka = 5 '原価 Baika = 6 '売価 Zaiko = 10 '在庫数 End Enum |
名前の付け方は、一般的にe + 単語(先頭大文字)です。
数値を指定しないと、先頭から0の連番が自動でセットされますが、きちんと数値まで指定してわかりやすくしましょう。
自動入力補完機能(列挙形名.を入力すると入力候補が一覧表示される)が使えるので、早く・確実にプログラミングできます。