2017-01-16 3 views
0

Я хочу окно ввода, которое допускает только 1-3 символа в длину и только буквы A-Z. Я попробовал несколько различных способов, но не могу показаться, чтобы получить что-нибудь работатьExcel VBA только поле ввода и максимальная длина

Я использую этот код сейчас, но это только ограничивает длину

Sub Change_Ticket_Initials() 

Dim strReturn As String 

strReturn = InputBox("Enter Initials", "Change Ticket Initials") 
If strReturn = vbNullString Then Exit Sub 'if "" exit sub 

If Len(strReturn) < 1 Or Len(strReturn) > 3 Then 
    MsgBox "Must Be 1-3 Characters Try Again" 
    Run "Change_Ticket_Initials" 
Else 
    Control_Sheet_VB.Range("C2").Value = UCase(strReturn) 
End If 

End Sub     
+0

Что именно вы хотите? Чтобы проверить ввод, когда пользователь нажимает клавишу или только когда ячейка теряет фокус (например, при нажатии клавиши ENTER)? – FDavidov

+0

@FDavidov Когда пользователь нажимает «ОК», если поле ввода ничего, кроме букв, тогда появляется всплывающее сообщение msgbox, а затем снова открывается окно ввода – luke

+0

попробуйте использовать «RegEx» –

ответ

1

один путь:

Sub Change_Ticket_Initials() 

    Dim strReturn As String 

    Do 
     strReturn = UCase$(InputBox("Enter Initials", "Change Ticket Initials")) 

     Select Case True 
      Case strReturn = "" 
       Exit Sub 
      Case strReturn Like "[A-Z]", _ 
       strReturn Like "[A-Z][A-Z]", _ 
       strReturn Like "[A-Z][A-Z][A-Z]" 

       Control_Sheet_VB.Range("C2").Value = strReturn 
       Exit Do 
      Case Else 
       MsgBox "Must Be 1-3 Characters Try Again" 
     End Select 
    Loop 

End Sub 
+0

Что относительно нижнего регистра? – FDavidov

+0

Принимает буквы любого случая и всегда записывает верхний регистр, как в текущем коде OPs. –

+0

Вы преобразовываете ввод в верхний регистр ('UCase $'), который может и не быть тем, чего хочет OP. Самое простое решение - использовать преобразование только для проверки. Это сделало бы эту работу, сохранив вход как есть. – FDavidov

0

вы можете после этого

Option Explicit 

Sub Change_Ticket_Initials() 
    Dim strReturn As String 
    Dim Control_Sheet_VB As Worksheet 

    Do 
     strReturn = UCase(Application.InputBox("Enter Initials", "Change Ticket Initials", Type:=2)) 
     If strReturn = vbNullString Then Exit Sub 'if "" exit sub 
     If strReturn Like "[A-Z]" Or strReturn Like "[A-Z][A-Z]" Or strReturn Like "[A-Z][A-Z][A-Z]" Then Exit Do 
     MsgBox "Must Be 1-3 Characters" & vbCrLf & vbCrLf & "Try Again" 
    Loop 
    Control_Sheet_VB.Range("C2").Value = strReturn 
End Sub 
0

Вы можете использовать функцию ниже, чтобы легко проверить, содержит ли строка только алфавиты

Public Function CheckIfAlpha(strValue As String) As Boolean 
    CheckIfAlpha = strValue Like WorksheetFunction.Rept("[A-ZA-Z]", Len(strValue)) 
End Function 

И вся реализация будет как в сочетании с вашими, если условия:

Sub Change_Ticket_Initials() 

Dim strReturn As String 
strReturn = InputBox("Enter Initials", "Change Ticket Initials") 

    If strReturn = vbNullString Then Exit Sub 'if "" exit sub 

If Len(strReturn) < 1 Or Len(strReturn) > 3 Or Not CheckIfAlpha(strReturn) Then 
MsgBox "Must Be 1-3 Alphabet Characters Try Again" 
Run "Change_Ticket_Initials" 

    Else 
Control_Sheet_VB.Range("C2").Value = UCase(strReturn) 
    End If 

End Sub 
Public Function CheckIfAlpha(strValue As String) As Boolean 
    CheckIfAlpha = strValue Like WorksheetFunction.Rept("[A-ZA-Z]", Len(strValue)) 
End Function 

PS: испытанный код :)

1

Я думаю, что именно поэтому они придумали RegEx объект.

Вы можете проверить символы, которые являются A-Z (или a-z), путем ввода в RegEx.Pattern = "[a-zA-Z]" . Вы можете развернуть его, чтобы иметь размер 1-3 символа, добавив .Pattern = "[a-zA-Z]{1,3}".

Благодаря @Slai, необходимо добавить ^ и $ в начале и в конце, чтобы закрыть его.

Код

Sub Change_Ticket_Initials() 

Dim strReturn As String 
Dim RegEx As Object, Match As Object 

strReturn = InputBox("Enter Initials", "Change Ticket Initials") 

Set RegEx = CreateObject("vbscript.regexp") 
With RegEx 
    .MultiLine = False 
    .Global = True 
    .IgnoreCase = True 
    .Pattern = "^[a-zA-Z]{1,3}$" ' <-- does it all in 1 line : Match 1-3 consecutive letters 
End With 

Set Match = RegEx.Execute(strReturn) 

If Match.Count = 1 Then ' <-- make sure there is only 1 match 
    Control_Sheet_VB.Range("C2").Value = UCase(strReturn) 
Else 
    MsgBox "Must Be 1-3 Characters Try Again" 
    Run "Change_Ticket_Initials" 
End If 

End Sub 
+0

Необходимы анкеры '^ [A-Za-z] {1,3} $', потому что 'AAAA' соответствует 1.Установка любого из флагов RegEx в этом случае кажется бессмысленным, но мне нравится рекурсивный подход. – Slai

+0

Это работает с 1-й попыткой, но если вы вводите цифры во 2-ю попытку, она принимает ее. – luke

+0

Вы попробовали этот код? «AAAA» не соответствует, только 1-3, и если вам больше 1, оно отклоняется в «If Match.Count = 1 Then» –

0

Мне нравится этот код, он проверяет, есть ли номера на входе, вы можете попробовать:

Private Sub Change_Ticket_Initials() 

Dim strReturn As String 
Dim strCheck as Boolean 
Dim aChar As Boolean 

strReturn = InputBox("Enter Initials", "Change Ticket Initials") 

For strCheck = 1 To Len(strReturn) 
    aChar = False 
    aChar = IsNumeric(Mid(strReturn, strCheck, 1)) 

    If aChar = True Then 
     MsgBox "No numbers allowed" 
     Exit Sub 
    End If 

Next strCheck 

If strReturn = vbNullString Then Exit Sub 'if "" exit sub 

If Len(strReturn) < 1 Or Len(strReturn) > 3 Then 
    MsgBox "Must Be 1-3 Characters Try Again" 
    Run "Change_Ticket_Initials" 

Else 
    Control_Sheet_VB.Range("C2").Value = UCase(strReturn) 
End If 

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