EXCEL VBAでの安全なプログラミング

VBAの解説で本やネットに載っているコード、あるいは職場で見かけるコードでは、以下のようにCellsやRangeから始まっていたり、よくてもWorksheetsから始まっていることが多い。

もしCellsやRangeから始まるコードがシートモジュールに、Worksheetsから始まるコードがブックモジュールに記載されているのであれば問題ないが、標準モジュールに記載れているとすると、安全なコードとは言えない。
VBAが処理中にユーザが別のブックやシートを操作すると、ActiveWorkbookやActiveSheetが変わってしまうため、意図しない別のシートのセルが操作されてしまう。

EXCEL VBAでの安全なプログラミングをするには、以下を守る必要がある。
・ActiveWorkbook / ActiveSheet / ActiveCell はできるだけ使わない
・Select / Selection はできるだけ使わない
・標準モジュールでは、ThisWorkbook.Worksheets("Sheet1")をつける

そもそもActive系やSelect系をVBAの中で使う必要がある箇所はかなり限られると思う。
プログラムの基本である、INPUT→処理→OUTPUTの流れの中で、セルやシートをセレクトする必要がでてくることはあまりない。ユーザの入力をリアルタイムで検知して処理するようなVBAであれば必要になるが、シートモジュールやブックモジュールに書くことになるので、幾分か安全。

ThisWorkbook.Worksheets("Sheet1").Cells(1, 1)のように毎回書くのは大変なので、Withを使うといい。

しかし、もっといい方法はSetを使って、シート自体をもっと短い名前かつわかりやすい名前の変数に代入して使うこと。

もし変数名がもっと短くできるなら、With自体いらないし、複数のシートを扱うのであれば、Withは無い方がわかりやすい。

-Excel, VBA