2015-04-14 21 views
5

Ich benutze eine Funktion, mit der ich eine Textfolge überprüfen und bewerten kann, ob sie aus Buchstaben besteht. Es ist in einem Modul namens "General" untergebracht. Das allgemeine Modul existiert nur, um öffentliche Funktionen und Variablen aufzunehmen. Funktionscode wird im Folgenden aufgeführt:Wie kann ich prüfen, ob eine Zeichenfolge nur Buchstaben enthält?

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 

Next Ich habe zwei „if“ Routinen, die die ersten zwei Zeichen einer Textbox in meiner Userform zu bewerten. Die erste Routine fragt, ob das erste Zeichen numerisch ist und die zweite Routine fragt, ob das zweite Zeichen Alpha ist. Derzeit wirft die zweite "if" Routine mich aus der Subroutine, wenn IsAlpha True testet, anstatt die MsgBox zu generieren. Wird die IsAlpha-Funktion nicht korrekt aufgerufen?

Wenn Code-Routinen im Folgenden aufgeführt:

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

Wie sollte der DX-Code aussehen? –

+3

Ihre Funktionsnamen "IsAlpha" .. Ihre Exit-Zuordnung: "IsLetter" .. das wird nicht gut funktionieren .. – Ditto

+0

@MaciejLos Char1 = Alpha Char2 = Numeric Zusätzliche Zeichen = Alpha + Numeric –

Antwort

8

Warum Sie nicht reguläre Ausdrücke verwenden Sie stattdessen? Dann gibt es keine Schleifen beteiligt: ​​

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

Auch, wenn Sie eine benutzerdefinierte Funktion (UDF) erstellen müssen Sie sicherstellen, dass der Rückgabewert auf den Namen der eigentlichen Funktion zugeordnet ist, in diesem Fall IsAlpha - nicht IsLetter andernfalls wird der Wert nie zurückgegeben.

+0

Denn derzeit weiß ich nicht, was der Unterschied ist. –

+2

Reguläre Ausdrücke werden in fast jeder Programmiersprache verwendet - es ist eine Art "Mustervergleich" und wurde entwickelt, um genau für diesen Zweck verwendet zu werden. VBA bietet nativ ** sehr ** einfache reguläre Ausdrücke, aber Sie können einen Verweis festlegen und komplexer werden, wenn Sie möchten. Eine schnelle Google sollte Sie beginnen, es gibt viele da draußen –

2

die Sie interessieren für 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, das bekomme ich, wenn ich Code kopiere, von dem ich nicht weiß, wie man einen Reverse-Engineer macht. –

+0

Ja. Das hat es behoben. –

0

Left(Me.TxtDxCode.Text, 2) gibt die ersten zwei Zeichen der Zeichenfolge zurück. Also, wenn Me.TxtDxCode.Text 7ZABC war, würde dieser Ausdruck "7Z" zurückgeben. Dies würde dazu führen, dass der Test IsAlpha fehlschlägt.

Wie Sie gerade das 2. Zeichen untersuchen möchten, verwenden Sie Mid $ statt:

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

Dies wird zurückkehren "Z" und der IsAlpha Test sollte nun

(die Zeichenfolge Versionen Links folgen $, Mid $ etc sind etwas schneller als die Variantenversionen Left, Mid usw. - siehe here)

Verwandte Themen