2015-04-14 14 views
5

Я использую функцию, которая позволяет мне просматривать строку текста и оценивать, состоит ли она из букв. Он размещается в модуле под названием «Генерал». Общий модуль существует только для размещения публичных функций и переменных. Код функции приведен ниже:Как проверить, содержит ли строка только буквы?

Public Function IsAlpha(strValue As String) As Boolean 
Dim intPos As Integer 

    For intPos = 1 To Len(strValue) 
     Select Case Asc(Mid(strValue, intPos, 1)) 
      Case 65 To 90, 97 To 122 
       IsLetter = True 
      Case Else 
       IsLetter = False 
       Exit For 
     End Select 
    Next 
End Function 

Далее у меня есть два «если» подпрограммы, которые оценивают первые 2 символов текстового поля в моей UserForm. Первая процедура запрашивает, является ли первый символ числовым, а вторая - запрашивает, является ли второй символ альфа. В настоящее время вторая процедура «if» выталкивает меня из подпрограммы, когда IsAlpha проверяет True, а не генерирует MsgBox. Неправильно ли вызывается функция IsAlpha?

Если подпрограммы код, перечисленные ниже:

Private Sub CmdMap_Click() 

    With TxtDxCode 
     If IsNumeric(Left(Me.TxtDxCode.Text, 1)) Then 
      MsgBox "Incorrect DX Code format was entered. ", vbExclamation, "DX Code Entry" 
      TxtDxCode.Value = "" 
      TxtDxCode.SetFocus 
      Exit Sub 
     End If 

     If IsAlpha(Left(Me.TxtDxCode.Text, 2)) Then 
      MsgBox "Incorrect DX Code format was entered. ", vbExclamation, "DX Code Entry" 
      TxtDxCode.Value = "" 
      TxtDxCode.SetFocus 
      Exit Sub 
     End If 
    End With 
+0

Как должен выглядеть DX-код? –

+3

ваше имя функции «IsAlpha» .. Ваше назначение выхода: «IsLetter» .. это не будет хорошо работать .. – Ditto

+0

@MaciejLos char1 = Альфа char2 = Числовой Дополнительные символы = Альфа + Числовой –

ответ

8

Почему бы вам не использовать регулярные выражения вместо этого? Тогда нет никаких петель не участвует:

Public Function IsAlpha(strValue As String) As Boolean 
    IsAlpha = strValue Like WorksheetFunction.Rept("[a-zA-Z]", Len(strValue)) 
End Function 

Кроме того, при создании пользовательской функции (UDF), вы должны убедиться, что возвращаемое значение присваивается имя фактической функции, в данном случае IsAlpha - не IsLetter иначе значение никогда не будет передано обратно.

+0

Потому что в настоящее время я не знаю, в чем разница. –

+2

Регулярные выражения используются почти на каждом языке программирования - это способ «сопоставления с образцом» и предназначен для использования именно для этой цели. VBA изначально предлагает ** очень ** основные регулярные выражения, но вы можете установить ссылку и усложнитесь, если хотите. Быстрый google должен вас начать, там много чего есть –

2

Попробуйте для IsAlpha

Public Function IsAlpha(strValue As String) As Boolean 
Dim intPos As Integer 

    For intPos = 1 To Len(strValue) 
     Select Case Asc(Mid(strValue, intPos, 1)) 
      Case 65 To 90, 97 To 122 
       IsAlpha = True 
      Case Else 
       IsAlpha = False 
       Exit For 
     End Select 
    Next 
End Function 
+0

Хех, вот что я получаю за копирование кода, который я не знаю, как перепроектировать. –

+0

Да. Это исправило это. –

0

Left(Me.TxtDxCode.Text, 2) возвращает первые два символа строки. Итак, если Me.TxtDxCode.Text был 7ZABC, это выражение вернет «7Z». Это приведет к сбою теста IsAlpha.

Как вы хотите, чтобы изучить только 2-й символ, используйте Mid $ вместо:

If IsAlpha(Mid$(Me.TxtDxCode.Text, 2, 1)) Then

Это будет возвращать "Z" и тест IsAlpha теперь должны быть успешными

(Строка версии Left $, Mid $ и т. Д. Немного быстрее, чем варианты версий Left, Mid и т. Д. - см. here)