VBAで「セルを変更したら自動で計算する」みたいな処理、憧れますよね。
でも、いざ作ってみると「関係ないセルを触ったときまでマクロが動いてエラーになる」なんてこと、ありませんか?
ここで登場するのが、今日の主役Intersect(インターセクト)メソッドです。
これを使えば、マクロが動く範囲を「この範囲内だけ!」とピンポイントで指定できるようになります。
Intersect = 「共通の場所」を探す
Intersectは、「2つの範囲が重なっている部分(共通部分)」を見つけてくれる命令です。
- 「マクロを動かしたい範囲(例:A列)」
- 「ユーザーが今触ったセル(Target)」
この2つが重なったときだけ、「あ、ここで動けばいいんですね!」とVBAが反応する。これがIntersectの仕組みです。
逆に、重ならなければ(共通部分がなければ)、VBAは「お呼びじゃないですね」と何もしないで終了します。
【コピペOK】そのまま使えるコード
では、実際に使えるコードを紹介します。
今回は「A1からA10のセル」を変更したときだけメッセージを出すコードです。それ以外のセルを触っても、何も起きません(=安全です)。
シートのモジュール(Sheet1などをダブルクリックした画面)に貼り付けて使ってくださいね。
Private Sub Worksheet_Change(ByVal Target As Range)
' 機能を動かしたい範囲を指定
Dim watchRange As Range
Set watchRange = Range("A1:A10")
' 「今触ったセル(Target)」と「設定した範囲(watchRange)」が重なっているかチェック
If Not Intersect(Target, watchRange) Is Nothing Then
' イベントの連鎖を防ぐ(無限ループ防止)
Application.EnableEvents = False
' 重なっている場合、ここにやりたい処理を書いてください
MsgBox "指定された範囲(" & Target.Address & ")が変更されました!", vbInformation
Application.EnableEvents = True
Else
' 重なっていなければ何もしません
End If
End Sub
どうして「Not … Is Nothing」なのか?
プログラミングを勉強しているとよく出てくる、こういう呪文のような書き方。
If Not Intersect(Target, Range(“A1”)) Is Nothing Then
これ、直訳するとこうなります。
- Intersectの結果が Nothing(重なりがない)では Not(ない) ならば…。
- つまり、「重なりが有るならば」。
ちょっとひねくれてますよね(笑)。
でも、「重なりがないわけじゃない=重なっている」というこの論理式が、プログラミングの世界では「絶対に間違いのない確認方法」として重宝されます。
論理的に抜け漏れがないようになっていないと、安心してプログラムに任せられないですよね。
最初は「こういう決まり文句なんだ」と割り切ってしまって大丈夫です。
焦らず、一つずつ積み上げましょう
Intersectを使うことで、マクロは「どこでも暴走するおっちょこちょい」から、「自分が指示した場所だけで働く機能」に進化させることが可能です。
最初は意味がわからなくても、コピペして動いたときの「あ、できた…!」という小さな感動を大切にしてください。
失敗しても、PCは壊れませんので、ぜひ試してみてください。
VBAを独学で学び、業務自動化に5年以上携わってきた私が、「本当に実務で役立った!」と感じた2冊を紹介します。 もう本選びで失敗したくない方は、よければ参考にしてみてください。

コメント