1. はじめに
Excel VBAは導入しやすく、実務でも使用しやすい言語です。
そして比較的ゆるい言語でもあります。
その「ゆるさ」は、
初心者にとっては優しさであり、
一方で実務では 処理対象が曖昧なままコードが動いてしまう
原因にもなります。
本記事では、
Excel VBAでよく行われがちな
Workbook / Worksheet オブジェクトの省略が、
なぜ実務で事故につながりやすいのかを整理します。
2. マクロの記録について
多くの人がVBAに触れる最初の入口は、「マクロの記録」 でしょう。
マクロを記録すると、次のようなコードが生成されます。
Sub macro1()
Range("A1").Select
Selection.Value = "TEST"
End Sub
このコードは動きますし、学習初期では「正しい書き方」に見えます。
しかしここに、実務で事故を生む前提が含まれています。
3. オブジェクトが省略されると何が起きるか
Range や Cells を
Workbook / Worksheet を指定せずに書いた場合、
VBAは暗黙的に次の対象を使います。
-
Range/Cells
→ ActiveSheet -
Worksheets
→ ActiveWorkbook
つまり、
Range("A1").Value = "TEST"
は実際には、
ActiveSheet.Range("A1").Value = "TEST"
と 同義 です。
4. マクロの記録ではできないこと
マクロの記録は、
「今ユーザーが操作している対象」
をそのまま記録します。
- アクティブなブック
- 表示中のシート
- 選択中のセル
これらは 画面操作としては十分 ですが、
ロジックとしては不十分 です。
マクロの記録は
「人の操作」を残す機能であり、
「安全な自動処理」を作る機能ではありません。
実務では操作をコード化して記述方法を確認するための機能であり、
それだけで完成するものではありません。
5. 実務で事故になる典型パターン
実務では次のような状況が普通に起きます。
- ユーザーが別シートを表示したまま実行
- 別ブックをアクティブにした状態で実行
- マクロ実行中に画面を操作してしまう
この状態でオブジェクト省略コードがあると、
- 想定外のシートを書き換える
- 別ブックのデータを破壊する
といった事故につながります。
6. 事故につなげないための書き方①
オブジェクトを明示する
マクロ記録のコードは、
次のように書き換えられます。
ThisWorkbook.Worksheets("Sheet1").Range("A1").Value = "TEST"
これで、
- 対象ブック
- 対象シート
- 対象セル
がすべて明示されます。
ただし、毎度記述するのではコードが長くなりすぎる問題があるので、
変数を用いるのが一般的です。
7. 事故につなげないための書き方②
オブジェクトを変数に保持する
実務では、オブジェクトを変数に持たせるのが基本です。
Sub sample()
Dim wb As Workbook
Dim ws As Worksheet
Set wb = ThisWorkbook
Set ws = wb.Worksheets("Sheet1")
ws.Range("A1").Value = "TEST"
End Sub
この書き方にすると、
- 処理対象が固定される
- 読みやすくなる
- 修正に強くなる
というメリットがあります。
もちろん他のブック、シートの状態に左右されたり、
起動中にユーザーが別の操作をしたとしても影響されません。
8. まとめ
- マクロの記録は省略コードを生成する
- 省略コードは Active 状態に依存する
- Activeの指定は実務では信用できない
- オブジェクトを明示し、変数に持たせる
- マクロの記録は「下書き」、実務コードは必ず書き直す
これを意識するだけで事故は大きく減ります。