セルに関数で文字が入った時にマクロを実行させる方法を教えて下さい。
今回行いたいのは、C9~C19セルにNGと表示された場合にメッセ―ジを表示したいです。
Private Sub Worksheet_Change(ByVal Target As Range)
'変化のあったセルがA1セルか?
If Intersect(Target, Range("C9:C19")) Is Nothing Then Exit Sub
'条件判定:A1セルの値は 1 か?
If Target.Value = "NG" Then
MsgBox "NGです"
End If
End Sub
このような場合C9~C19セルにNGと打ち込めばメッセ―ジが表示されるのですが
あらかじめ、関数で
=IF(M9="","",IF(Q9<M9,"OK","NG"))
というような式がそれぞれのC9、C10、C11・・・・セルに入ってしまっています。
これだと、例えばC9セルにNGと表示されてもマクロは起動せず、メッセージが表示されません。
関数をマクロに盛り込むか、このままでもマクロが起動できるような書き方があるか
教えてください。
すみません。補足でQ9セルには
=IF(I9="","",I9+"07:01")のような関数が
入力されています。
Worksheet_Changeイベントは、セルが「編集された時」に編集されたセルをトリガとして起動します。
(C列の)関数の計算結果が変わっても、それ自体は「C列のセルの編集」ではないので、C9からのセルはイベントをトリガしません。
でも
>あらかじめ、関数で
>=IF(M9="","",IF(Q9<M9,"OK","NG"))
>というような式がそれぞれのC9、C10、C11・・・・セルに入ってしまっています。
:
>補足でQ9セルには
>=IF(I9="","",I9+"07:01")のような関数が
>入力されています。
Q列がそうならM列はどうなんでしょうね。
いずれにしてもC列の関数は、具体的に「I列(あるいはM列)のセルが編集された時に再計算」されます。
ならばNGあるいはOK(あるいは空白)の計算結果がC列に現れるのは、まさにそれらのI9:I19(もしかするとM9:M19)のセルが「編集された」時です。
private sub Worksheet_Change(byval Target as excel.range)
dim h as range
if application.intersect(target, range("I9:I19,M9:M19")) is nothing then exit sub
for each h in application.intersect(target.entirerow, range("C:C"))
if h.value = "NG" then msgbox "NG"
next
end sub
#補足
この手の多くのご相談は、「セルが一個ずつしか編集されない」ことを暗黙の前提に置いているようです。
でも実際には、I列等の「複数のセル範囲をまとめて編集する(たとえばDeleteキーを押す、オートフィルドラッグする、コピー貼り付ける)」事が行われます。
自動起動マクロは、そういった起こり得ることに対しても適切に対応できるよう、仕込んでおかなければいけません。
補足下さい。
どこのデータが手動で変化するのでしょうか?
Worksheet_Change(ByVal Target As Range)なのでユーザーが指定セル範囲内の数値やテキストを入力変更させる事を前提としていますよね。
M9やI9が手動が手動で入力があるのであれば、その値が変動した時に
OK、NGの判断式をVBAで判断すれば良いわけです。
仮にM9~M19、I9~I19の値が手動変動するとしたら下記方法で良いかと思います。
M列とI列をUNIONで集合させています。
Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Union(Range("M9:M19"), Range("I9:I19"))) Is Nothing Then Exit Sub
If Range("M" & Target.Row) <= Range("Q" & Target.Row) Then
MsgBox "NGです"
End If
End Sub
お礼
ありがとうごさいました。 目的の事が果たせました! 補足でアドバイスまで頂きありがとうございます。 また何かあったらよろしくお願いします。