突然ですが、あなたが一生懸命書いたコードを動かしている最中にうっかりマウスで別のシートをクリックしたら…「あ!違うシートのデータが消えちゃった!」なんて経験、ありませんか?
これは、ActiveSheet(アクティブシート)を使っていることが原因であるケースが非常に多いです。
ActiveSheet = 「今、画面で見えているシート」
これ、人間で言うと「あそこにいる人」と呼んでいるようなものです。
あなたがAさんの方を向いていればAさんですが、Bさんの方を向けばBさんになってしまいますよね。
パソコンも同じです。処理中に画面が切り替わると、パソコンは「あ、今見ているのはこっちのシートか」と判断し、意図しないシートを書き換えてしまいます。
これ、致命的なミスになりかねません。怖いですよね。
救世主「Me」キーワードの正体
そこで登場するのが「Me」です。
これは、「私自身」という意味です。
Me = 「このコードが書かれている場所(自分自身)」
例えば、「請求書シート」のモジュール(シートの裏側にあるコード記述欄)や、ユーザーフォームの中に書くコードで使います。
もし「請求書シート」の中に Me と書けば、ユーザーがどのシートを見ていようと、必ず「請求書シート」のことを指します。
「あそこにいる人」ではなく、「私(請求書シート)」と名乗るわけですから、絶対に間違いようがありません。
使い分けルール
「じゃあ、全部 Me にすればいいの?」
と思うかもしれませんが、標準モジュール(Module1など)では Me は使えません。 コンパイルエラーになります。
使い分けをまとめるとこうなります。
- ユーザーフォーム・シートモジュールの場合
- 迷わず Me を使う!
- 絶対に参照先がブレないから。
- 標準モジュールの場合
- ActiveSheet は極力使わない!
- 代わりにWorksheets(“シート名”) と名前を指名する。
これだけで、シートの指定ミスによる事故はほぼゼロにできます。
コピペで使える!安全なコード比較
実際にコードを見てみましょう。
どちらも「A1セルに日付を入れる」コードですが、安全性が段違いです。
❌ 操作ミスしやすいコード(ActiveSheet利用)
Sub DangerCode()
' マクロ実行時に表示されているシートに書き込まれます
ActiveSheet.Range("A1").Value = Date
End Sub
実行中にうっかり別のシートをクリックすると、そっちに書き込まれます…!
⭕ 安心・安全なコード(Me利用)
※これは「シートモジュール」や「ユーザーフォーム」に貼り付けてください。
Sub SafeCode_Me()
' どのシートが開かれていても、必ず「このコードが書かれているシート」に書き込みます
Me.Range("A1").Value = Date
End Sub
⭕ 標準モジュールで書く場合
Sub SafeCode_Standard()
' シート名で指定します
Worksheets("Sheet1").Range("A1").Value = Date
End Sub
適切なシートの指定方法を選べば、他のPC作業に支障をきたさないようにすることは可能です。
よければ上記のコードをコピペで使ってみて、ぜひ使い分けをマスターしてください。
VBAを独学で学び、業務自動化に5年以上携わってきた私が、「本当に実務で役立った!」と感じた2冊を紹介します。 もう本選びで失敗したくない方は、よければ参考にしてみてください。

コメント