回答No.4は制限文字がリストの順にメッセージで表示されますが、こちらはA2に入力した文字列で出てくる順にメッセージに表示します。
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address <> Range("A2").Address Then
Exit Sub
End If
Dim mRng As Range
Dim flg As Boolean, i As Long
Dim mStr As String, mCha As String
Dim ListStr As String
Application.EnableEvents = False
flg = False
mStr = "": mCha = "": ListStr = ""
For Each mRng In Sheets("Sheet3").Range("A5:A12")
ListStr = ListStr & mRng.Value
Next
For i = 1 To Len(Range("A2").Value)
mCha = Mid(Range("A2").Value, i, 1)
If InStr(ListStr, mCha) >= 1 Then
mStr = mStr & mCha & " "
flg = True
End If
Next
If flg = True Then
MsgBox "制限された文字 [ " & mStr & "] が含まれています", vbCritical
Range("A2").Value = ""
Range("A2").Select
End If
Application.EnableEvents = True
End Sub
リストがSheet3で全ての文字を表示するパターンです。
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address <> Range("A2").Address Then
Exit Sub
End If
Dim mRng As Range
Dim flg As Boolean
Dim mStr As String
Application.EnableEvents = False
flg = False
mStr = ""
For Each mRng In Sheets("Sheet3").Range("A5:A12")
If InStr(Range("A2").Value, mRng.Value) >= 1 Then
mStr = mStr & mRng.Value & " "
flg = True
End If
Next
If flg = True Then
MsgBox "制限された文字 [ " & mStr & "] が含まれています", vbCritical
Range("A2").Value = ""
Range("A2").Select
End If
Application.EnableEvents = True
End Sub
VBAのChangeイベントで対応すると値貼り付けでも反応する感じです。
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address <> Range("A2").Address Then
Exit Sub
End If
Dim mRng As Range
Application.EnableEvents = False
For Each mRng In Range("A5:A12")
If InStr(Range("A2").Value, mRng.Value) >= 1 Then
MsgBox "制限された文字が含まれています", vbCritical
Range("A2").Value = ""
Range("A2").Select
Exit For
End If
Next
Application.EnableEvents = True
End Sub
質問者
お礼
再度のご回答ありがとうございます。
なるほど、マクロでも制御できるのですね。こちらの方がいいですね。
わがままを言って申し訳ありませんが、リストを別シート(設定用)に用意した場合「For Each mRng In Range("A5:A12")」の部分はどのようになりますか?
お礼
ご回答ありがとうございました。 できました!! 別シートのリストからの参照もOKでした。 こちらを採用させていただきます。