| 
    
     |  | コードをあらためてよく拝見しました。 ご指摘のとおりですね。
 こんな感じですか?
 
 単一セルの変更時だけ実行することとしています。
 なお、入力規則の内容は見ていません。
 
 Private Sub Worksheet_Change(ByVal Target As Range)
 If Target.Count > 1 Then Exit Sub
 If Intersect(Target, Range("E23:E60")) Is Nothing Then Exit Sub
 If Target.Value Like "*○○○*" Then
 With Target.Offset(0, 3).Validation
 .Delete
 .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
 Operator:=xlBetween, Formula1:="=$X:$X"
 .IgnoreBlank = True
 .InCellDropdown = True
 .InputTitle = ""
 .ErrorTitle = ""
 .InputMessage = ""
 .ErrorMessage = ""
 .IMEMode = xlIMEModeNoControl
 .ShowInput = True
 .ShowError = True
 End With
 End If
 End Sub
 
 |  |