2015-04-14 26 views
5

Utilizzo una funzione che consente di rivedere una stringa di testo e valutare se è composta da lettere. È ospitato in un modulo chiamato "Generale". Il modulo generale esiste solo per ospitare funzioni pubbliche e variabili. Codice funzione è elencato di seguito:Come posso verificare se una stringa contiene solo lettere?

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 

successivo ho due "se" routine che valutano i primi 2 caratteri di una casella di testo nella mia userform. La prima routine chiede se il 1 ° carattere è numerico e la seconda routine chiede se il 2 ° carattere è alfa. Attualmente, la seconda routine "if" mi sta espellendo dalla sub-routine quando IsAlpha verifica True, piuttosto che generare MsgBox. La funzione IsAlpha non viene chiamata correttamente?

Se il codice routine elencati di seguito:

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

Come deve apparire il codice DX? –

+3

il tuo nome di funzione "IsAlpha" .. il tuo incarico uscita: "IsLetter" .. che non funziona bene .. – Ditto

+0

@MaciejLos char1 = Alpha char2 = numerico Caratteri aggiuntivi = Alpha Numeric + –

risposta

8

Perché non usare le espressioni regolari, invece? Poi c'è nessun cicli coinvolti:

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

Inoltre, quando si crea una funzione definita dall'utente (UDF) è necessario assicurarsi che il valore di ritorno viene assegnato il nome della funzione reale, in questo caso IsAlpha - non IsLetter altrimenti il ​​valore non verrà mai restituito.

+0

Perché al momento, non so quale sia la differenza. –

+2

Le espressioni regolari vengono utilizzate in quasi tutti i linguaggi di programmazione: è un modo di "abbinamento di modelli" ed è progettato per essere utilizzato esattamente a questo scopo. VBA offre nativamente ** espressioni regolari * molto ** di base, ma puoi impostare un riferimento e diventare più complesso se lo desideri. Un rapido google dovrebbe iniziare, ce ne sono molte là fuori –

2

Prova questo per 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, questo è quello che ottengo per copiare il codice che non so come decodificare. –

+0

Sì. Questo l'ha risolto. –

0

Left(Me.TxtDxCode.Text, 2) restituisce i primi due caratteri della stringa. Quindi, se Me.TxtDxCode.Text era 7ZABC, questa espressione restituirebbe "7Z". Ciò farebbe fallire il test IsAlpha.

Come si desidera esaminare solo il 2 ° carattere, utilizzare Mid $ invece:

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

Ciò restituirà "Z" e il test IsAlpha dovrebbe ora riuscire

(Le versioni stringa Sinistra $, Mid $ etc sono leggermente più veloci rispetto alle versioni varianti Left, Mid ecc. - vedi here)

Problemi correlati