2015-03-20 3 views
0

Я пытаюсь разработать маску для своих ячеек, которая в качестве требования должна быть только текстовой или цифровой.Формат маски ячейки

У меня также есть чистая кнопка для сброса соответствующих ячеек. Это моя проблема. Маска проверки макросов работает хорошо, но если я использую мою чистую кнопку, и они становятся пустыми, тот же контрольный макрос говорит, что пустая строка не принимается.

После моего кода:

Private Sub Worksheet_Change(ByVal Target As Range) 
    On Error GoTo Whoa 

    Application.EnableEvents = False 


    If Not Intersect(Target, Range("C5")) Is Nothing Then 


     If Not IsNumeric(Range("C5").Value) Then 
      MsgBox "Valor inválido." 
      Application.Undo 
      GoTo LetsContinue 
     End If 

     Range("C5").Value = "" & Format(Range("C5").Value, "") 
    End If 

    If Not Intersect(Target, Range("C7")) Is Nothing Then 
     'apaga se nao for o numero 
     If Not IsNumeric(Range("C7").Value) Then 
      MsgBox "Valor inválido." 
      Application.Undo 
      GoTo LetsContinue 
     End If 

     Range("C7").Value = "'" & Format(Range("C7").Value, "") 
    End If 

    If Not Intersect(Target, Range("I9")) Is Nothing Then 
     'apaga se nao for o numero 
     If Not IsNumeric(Range("I9").Value) Then 
      MsgBox "Valor inválido." 
      Application.Undo 
      GoTo LetsContinue 
     End If 


    End If 

    If Not Intersect(Target, Range("I11")) Is Nothing Then 
     'apaga se nao for o numero 
     If Not IsNumeric(Range("I11").Value) Then 
      MsgBox "Valor inválido." 
      Application.Undo 
      GoTo LetsContinue 
     End If 


    End If 


    If Not Intersect(Target, Range("I13")) Is Nothing Then 
     'apaga se nao for o numero 
     If Not IsNumeric(Range("I13").Value) Then 
      MsgBox "Valor inválido." 
      Application.Undo 
      GoTo LetsContinue 
     End If 


    End If 


    If Not Intersect(Target, Range("E15")) Is Nothing Then 
     'apaga se nao for o numero 
     If Not IsNumeric(Range("E15").Value) Then 
      MsgBox "Valor inválido." 
      Application.Undo 
      GoTo LetsContinue 
     End If 
      End If 

If Not Application.IsText(Worksheets("Formulário").Range("C9")) Then 
MsgBox "Valor inválido." 
      Application.Undo 
      GoTo LetsContinue 
End If 



LetsContinue: 
    Application.EnableEvents = Truea 
    Exit Sub 
Whoa: 
    MsgBox Err.Description 
    Resume LetsContinue 
End Sub 

Function IsAlpha(str As String) As Boolean 
Dim c As String 
Dim I As Integer 

    For I = 1 To Len(str) 
     c = Mid(str, I, 1) 

     Select Case Asc(c) 

      Case 32, 65 To 90, 97 To 122 
       IsAlpha = True 
      Case Else 
       IsAlpha = False 
     End Select 

     If Not IsAlpha Then Exit For 
    Next I 
End Function 

ответ

0

Try следующую процедуру вместо этого, с помощью VBA-стиля регулярных выражений для проверки ваших правил:

Private Sub Worksheet_Change(ByVal Target As Range) 

If Intersect(Target, Union(Range("C5"),Range("C7"), Range("I9")) Is Nothing Then Exit Sub 

Application.EnableEvents = False 

If Not Target.Value Like "[a-zA-Z0-9]+" Then 
    MsgBox "Valor inválido." 
    Application.Undo 
End If 

Application.EnableEvents = True 

End Sub 

Тогда в макрос для «очистки» клеток , убедитесь, что вы используете Application.EnableEvents = False в начале и Application.EnableEvents = True в конце, это останавливает события от стрельбы, что означает, что приведенный выше код не запускается, когда ваш макрос меняет значение ячейки.

Смежные вопросы