No.1です
>>VBAでも関数でも構いません。
ということでしたので、ある程度のサンプルさえあればいいのだろうと思って、回答したのですが…
*M列をクリアした時(=4桁の数字ではない)をエラーとするのかどうか
不明ですが、とりあえずこれはOKということにしてあります。
*前回同様、セル範囲のペーストに対しても、有効となるようにしてあり
ますので、少々長くなっています。
(1セルのみの対応にすれば、もっと間単になります)
*不明な部分は適当に推測して作成していますので、質問者様が
思っている動作とは違うかも知れません。
Private Sub Worksheet_Change(ByVal Target As Range)
Dim RE As Object, msg As String, flg As Boolean
Dim rng As Range, c As Range, c2 As Range
'// M列N列に変更が無ければ終了
If Intersect(Target, Range("M:N")) Is Nothing Then Exit Sub
Set RE = CreateObject("VBScript.RegExp")
'// M列に関するチェック
RE.Pattern = "\D"
flg = False
Set rng = Intersect(Target, Range("M:M"))
If Not (rng Is Nothing) Then
For Each c In rng
msg = c.Value
If msg <> "" And (Len(msg) <> 4 Or RE.test(msg)) Then flg = clValue(c, c2)
Next c
msg = ""
If flg Then msg = "M列は4桁の数字でなければなりません"
End If
'// N列に関するチェック
RE.Pattern = "[^!-~|\s]+"
RE.Global = True
flg = False
Set rng = Intersect(Target, Range("N:N"))
If Not (rng Is Nothing) Then
For Each c In rng
If RE.test(c.Value) Then flg = clValue(c, c2)
Next c
If flg Then
If msg <> "" Then msg = msg & vbCrLf
msg = msg & "N列には日本語の入力はできません"
End If
End If
'// 結果の表示
Set RE = Nothing
If msg <> "" Then
c2.Activate
flg = MsgBox(msg, vbCritical)
End If
End Sub
Function clValue(c As Range, c2 As Range) As Boolean
If c2 Is Nothing Then Set c2 = c
clValue = True
'// ClearContentsでChangeイベントが発生することが
'// あるようなので、イベント発生を回避
Application.EnableEvents = False
c.ClearContents
Application.EnableEvents = True
End Function
お礼
本当にどうもありがとうございました。 ばっちり動いてます。 大変助かりました。