2015-04-14 15 views
5

Używam funkcji, która pozwala mi sprawdzić ciąg tekstu i ocenić, czy składa się z liter. Jest on umieszczony w module o nazwie "Ogólne". Moduł ogólny istnieje tylko w celu przechowywania publicznych funkcji i zmiennych. Kod funkcji znajduje się na liście poniżej:Jak mogę sprawdzić, czy ciąg zawiera tylko litery?

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 

Następny Mam dwa „czy” procedur, które oceniają pierwsze 2 znaki pola tekstowego w moim UserForm. Pierwsza rutyna pyta, czy pierwszy znak jest numeryczny, a druga podpowiada, czy drugi znak jest alfą. Obecnie druga rutyna "if" wyrzuca mnie z podprocedury, kiedy IsAlpha testuje True, zamiast generować MsgBox. Czy funkcja IsAlpha nie jest poprawnie wywoływana?

Jeśli kod procedury wymienione poniżej:

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

Jak powinien wyglądać kod DX? –

+3

imię i nazwisko Funkcja "isalpha" .. twoje zadanie wyjście: "IsLetter" .. to nie będzie działać dobrze .. – Ditto

+0

@MaciejLos Char1 = Alpha Char2 = numeryczna Dodatkowe znaki = alfa + numeryczna –

Odpowiedz

8

Dlaczego nie można używać wyrażeń regularnych zamiast? To nie ma pętle zaangażowany:

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

Również podczas tworzenia funkcji zdefiniowanej przez użytkownika (UDF), należy się upewnić, że wartość zwracana jest przypisany do nazwy rzeczywistej funkcji, w tym przypadku IsAlpha - nie IsLetter w przeciwnym razie wartość nigdy nie zostanie zwrócona.

+0

Ponieważ obecnie nie wiem, jaka jest różnica. –

+2

Wyrażenia regularne są używane w prawie każdym języku programowania - jest to sposób "dopasowywania wzorców" i jest przeznaczony do użycia dokładnie w tym celu. VBA oferuje ** bardzo ** podstawowe wyrażenia regularne, ale możesz ustawić odwołanie i uzyskać bardziej złożone, jeśli chcesz. Szybki google powinien zacząć, jest na nim dużo –

2

Spróbuj na 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

Heh, dostaję to za kopiowanie kodu, którego nie znam. –

+0

Tak. To naprawiło to. –

0

Left(Me.TxtDxCode.Text, 2) zwraca pierwsze dwa znaki ciągu. Więc jeśli Me.TxtDxCode.Text był 7ZABC, to wyrażenie zwróciłoby "7Z". Spowoduje to niepowodzenie testu IsAlpha.

Jak chcesz zbadać tylko 2nd znak, użyj Mid $ zamiast:

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

To wróci "Z", a test IsAlpha powinien teraz uda

(The wersje STRING $, Mid $ etc są nieco szybsze niż wersje wariantowe Left, Mid itp. - patrz here)

Powiązane problemy