Why not like this?
Private Sub Worksheet_change(ByVal Target As Range)
    If Target.Cells.Count > 1 Then
        Exit Sub
    End If
    On Error GoTo ErrHandler:
    
    If Not Application.Intersect(Me.Range("B2:D65535"), Target) Is Nothing Then
        If IsNumeric(Target.Value) = False Then
            Application.EnableEvents = False
            Target.Value = StrConv(Target.Text, vbUpperCase)
            Application.EnableEvents = True
        End If
    End If
    
ErrHandler:
    Application.EnableEvents = True
    
End Sub