VBAのマクロは一度実行すると元に戻せない操作(削除・上書きなど)があるため、実行前のコード確認がとても大切です。特に「範囲指定が正しいか」「削除・上書き処理に確認ダイアログが入っているか」「対象シートを変数で明示しているか」の3点を確認する習慣をつけましょう。
この記事では、次の内容を順番に解説します。
- 範囲指定のミスを防ぐ書き方
- 削除・上書き処理に確認ダイアログを入れる方法
- 対象シートを変数で明示する方法
- 処理の順番に注意すべきパターン
範囲指定のミスを防ぐには?
範囲を固定で指定すると、データが増減したときに意図しない範囲を処理してしまうことがあります。
' 固定範囲の指定(データが増えても1000行目まで消えてしまう)
Range("A1:A1000").ClearContents
最終行を自動で取得してから処理する方が安全です。
' 最終行を取得してから処理する(おすすめ)
Dim lastRow As Long
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
Range(Cells(2, 1), Cells(lastRow, 1)).ClearContents
データの行数が変わっても、常に正しい範囲だけを処理できます。
削除・上書き処理に確認ダイアログを入れるには?
元に戻せない処理(削除・上書き)の前に確認ダイアログを入れておくと、誤操作を防げます。
If MsgBox("本当に実行してよろしいですか?", vbYesNo) = vbNo Then
Exit Sub
End If
' ここから削除・上書き処理を書く
Range(Cells(2, 1), Cells(lastRow, 1)).ClearContents
「いいえ」を選ぶと Exit Sub でマクロが終了します。大切なデータを扱う処理には必ず入れておきましょう。
対象シートを変数で明示するには?
Range("A1") とだけ書いたコードは、今開いているシートを対象にします。意図しないシートが開いていると、間違ったシートに書き込んでしまうことがあります。
' シートを変数で明示する(おすすめ)
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("集計")
ws.Range("A1").Value = "確認済"
シートを変数に入れておくと、どのシートを対象にしているかがコードを読んですぐわかり、意図しないシートへの書き込みを防げます。
処理の順番に注意が必要なパターンは?
コピーと削除の順番を間違えると、元データが消えてしまいます。
' NG:先に削除してからコピーしても、すでに空っぽ
Range("A1:A10").ClearContents
Range("A1:A10").Copy Destination:=Sheets("履歴").Range("A1")
' OK:先にコピーしてから削除する
Range("A1:A10").Copy Destination:=Sheets("履歴").Range("A1")
Range("A1:A10").ClearContents
「コピーしてから削除」の順番が正しいです。処理の流れを日本語で書き出してから、コードに落とし込む習慣をつけると順番ミスを防げます。
まとめ
「動けばいい」ではなく「安全に動かせるか」を意識することが、実務でVBAを使ううえでの大切な心構えです。
- 範囲指定:固定ではなく最終行を取得して動的に指定する。
- 削除・上書き:MsgBoxで確認ダイアログを入れて誤操作を防ぐ。
- 対象シート:変数で明示してどのシートを処理するかを明確にする。
- 処理の順番:コピーしてから削除など、順番ミスに注意する。
よくある質問
誤って実行してしまったときに元に戻す方法はある?
VBAで実行した処理はCtrl+Zで元に戻せないことが多いです。特に ClearContents や Delete はExcelの「元に戻す」でも戻せません。重要なファイルを扱うときは、実行前にバックアップを取っておくのが確実です。
MsgBoxのYes/Noはどう判定する?
MsgBox("メッセージ", vbYesNo) の戻り値が vbYes なら「はい」、vbNo なら「いいえ」です。If MsgBox(...) = vbNo Then Exit Sub のように書くと、「いいえ」を選んだときに処理を中止できます。
シートが存在するかどうか確認してから処理したい場合は?
On Error Resume Next でSetを試みて、Is Nothing で確認するのが定番です。
On Error Resume Next
Set ws = ThisWorkbook.Sheets("集計")
On Error GoTo 0
If ws Is Nothing Then
MsgBox "シートが見つかりませんでした"
Exit Sub
End If
シートが存在しない場合は ws がNothingのままになるので、それを確認してから処理を進めます。
処理の前にデータをバックアップしておく方法は?
処理対象のシートを別のシートにコピーしておく方法がシンプルです。Sheets("データ").Copy After:=Sheets(Sheets.Count) でシートのコピーが作れます。処理が問題なければコピーを削除、ミスがあればコピーから復元できます。
他の人も使うマクロで特に注意すべきことは?
確認ダイアログを必ず入れること、エラーが出たときにわかりやすいメッセージを表示すること、対象シートを変数で明示することの3点が特に重要です。作った本人以外が使う場合は、想定外の操作が起きることを前提にしてコードを書きましょう。
動画で学びたい方へ
「記事を読んでも、実際に自分で書けるか不安…」という方には、動画で基礎からじっくり学べる講座がおすすめです。
VBAが初めての方を前提に、つまずきやすいポイントを先回りして解説しています。サンプル動画は無料でご覧いただけます。



