如何检查一个字符串是否只包含字母?

10

我正在使用一个函数,它允许我检查一串文本是否由字母组成。它存放在一个名为“General”的模块中。这个通用模块只存在于公共函数和变量的存储。以下是函数代码:

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  

接下来我有两个“if”例程,评估用户窗体中文本框的前2个字符。第一个例程询问第一个字符是否为数字,第二个例程询问第二个字符是否为字母。目前,当IsAlpha测试为True时,第二个“if”例程会将我弹出子例程,而不是生成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

DX代码应该长什么样? - Maciej Los
3
你的函数名为"IsAlpha",你的退出赋值为"IsLetter",但这样不太合适。 - Ditto
@MaciejLos Char1 = 字母 Char2 = 数字 Additional Characters = 字母+数字 - Isaac Rothstein
@IsaacRothstein,还有长度? - Maciej Los
4个回答

15

你为什么不使用正则表达式呢?这样就不需要涉及到循环:

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

此外,当您创建用户定义的函数(UDF)时,需要确保返回值被分配给实际函数的名称,例如在这种情况下是IsAlpha而不是IsLetter,否则该值将永远无法传回。


因为目前我不知道它们的区别是什么。 - Isaac Rothstein
3
正则表达式在几乎所有编程语言中都被使用,它是一种"模式匹配"的方式,专门设计用于此目的。VBA本身提供了非常基础的正则表达式,但如果您愿意,可以设置引用并获得更复杂的功能。您可以通过快速的谷歌搜索开始学习,网络上有大量相关资料。 - SierraOscar

6

检查一个字符串是否只包含字母的最直接、简洁和高效的方法是使用以下函数:

Function IsAlpha(s) As Boolean
    IsAlpha = Len(s) And Not s Like "*[!a-zA-Z]*"
End Function

实际上,这稍微好一些...

Function IsAlpha(s$) As Boolean
    IsAlpha = Not s Like "*[!a-zA-Z]*"
End Function

5
尝试使用以下内容来使用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

呵呵,这就是我抄袭不知道如何逆向工程代码的下场。 - Isaac Rothstein

1
< p > Left(Me.TxtDxCode.Text, 2)会返回字符串的前两个字符。所以,如果Me.TxtDxCode.Text是7ZABC,这个表达式将返回"7Z"。这将导致IsAlpha测试失败。

因为您只想检查第二个字符,所以使用Mid$:

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

这将返回"Z",并且IsAlpha测试现在应该成功。

(字符串版本Left$,Mid$等比变体版本Left、Mid等略快-请参见此处


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接