【问题标题】:Validating a string format in VBA Access在 VBA Access 中验证字符串格式
【发布时间】:2015-03-28 17:07:58
【问题描述】:
  • 我想编写一个布尔函数来检查 Medicaid ID 的格式是否符合要求。
  • 即 2 个字母字符后跟 5 个数字后跟 1 个字母字符。
  • 如果 Medicaid ID 不可用,则应在文本框中手动输入 99999999。

因此,返回 True 值的是 9999999 或所需的 Medicaid 格式字符串。

样本:

AZ12345Z
NP54321J
EM17345P

到目前为止,我有 2 个函数一起工作,但我把逻辑搞砸了!!

谢谢

Public Function isAlpha(cChar As Integer) As Boolean
'returns true if its a alphabetic character
    isAlpha = IIf((cChar >= 65 And cChar <= 90) Or (cChar >= 97 And cChar <= 122), True, False)   
End Function

Public Function CheckMedicaidIDFormat(strMedicaidID As String) As Boolean
    Dim blnResult As Boolean
    If strMedicaidID = "99999999" or If Len(strMedicaidID) = 8 And isAlpha(Left(strMedicaidID, 2)) = True And IsNumeric(Mid(strMedicaidID, 3, 5)) = True And isAlpha(Right(strMedicaidID, 1)) = True Then 

        blnResult = True
    Else
        blnResult = False
    End If
    CheckMecicaidIDFormat = blnResult
End Function

【问题讨论】:

    标签: regex string vba ms-access


    【解决方案1】:

    虽然RegEx 是解决此类问题的一个很好的通用解决方案,但在这种情况下,一个简单的Like 比较就可以了

    Function IsValid(strIn As String) As Boolean
        IsValid = (strIn Like "[A-Z][A-Z]#####[A-Z]") Or strIn = "99999999"
    End Function
    

    【讨论】:

    • 太棒了!非常感谢!
    【解决方案2】:

    类似的东西

    Sub Test()
    MsgBox IsValid("AZ12345Z")
    MsgBox IsValid("1AZ12345Z")
    End Sub
    

    测试功能

    Function IsValid(strIn As String) As Boolean
    If strIn = "99999999" Then
    IsValid = True
    Else
    Dim objRegex As Object
    Set objRegex = CreateObject("vbscript.regexp")
    With objRegex
    .Pattern = "^[A-Z]{2}\d{5}[A-Z]$"
    IsValid = .Test(strIn)
    End With
    End If
    End Function
    

    【讨论】:

    • Beginning of stringEnd of string 模式需要同时应用于这两种选择。此外,OP 希望替代为 8 x 9。也许^(?:([A-Z]{2}\d{5}[A-Z])|([9]{8}))$(^[A-Z]{2}\d{5}[A-Z]$)|(^[9]{8}$)
    • @chrisneilsen 公平点。我已经剥离了简单的测试,而不是添加到正则表达式中。
    【解决方案3】:

    VBA 支持使用 COM VBScript.RegExp 对象的正则表达式,如下所示:

    Dim regex As VBScript.RegExp
    Set regex = New VBScript.RegExp ' or CreateObject("VBScript.RegExp")
    regex.Pattern = "^[A-Za-z][A-Za-z]\d\d\d\d\d[A-Za-z]$"
    
    If medicId = "99999999" Or regex.Test( medicId ) Then
        ' code to handle valid Medicaid ID here
    End If
    

    【讨论】:

    • 我认为 OP 希望在开始和结束时使用字母字符而不是字母数字。
    • 我从未在我的任何 Access 数据库中使用过 VBScript。非常有趣的解决方案。非常感谢!
    • @Maria6460 这不是 VBScript。您仍在使用 VBA,但使用了最初为 VBScript 设计的组件(即 regex 类),但仍与 VBA 完全兼容。
    【解决方案4】:

    Regex 非常适合这种情况,但如果您不想使用它(很多人出于各种原因这样做),则很有可能不使用它。

    您在 CheckMediacaidIDFormat 函数的 if 语句中犯了一个小错误。 'If' 被提到了两次,你忘记了一些括号。我会这样制定:

    Public Function CheckMedicaidIDFormat(strMedicaidID As String) As Boolean
        Dim blnResult As Boolean
        If strMedicaidID = "99999999" Or _
                (Len(strMedicaidID) = 8 And _
                isAlpha(Left(strMedicaidID, 2)) = True And _
                IsNumeric(Mid(strMedicaidID, 3, 5)) = True And _
                isAlpha(Right(strMedicaidID, 1)) = True) _
                Then
    
            blnResult = True
        Else
            blnResult = False
        End If
        CheckMecicaidIDFormat = blnResult
    End Function
    

    请注意,我使用换行符(vba 中的空格后跟下划线)以提高可读性,并在“And”条件周围使用括号。如果您愿意,可以不使用换行符,但不能不使用括号。

    【讨论】:

    • 干得好。我想我需要使用 mid 函数来检查第二个字符是否也是 alpha。感谢您的时间和精力。
    猜你喜欢
    • 2022-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-20
    • 2013-05-28
    • 1970-01-01
    相关资源
    最近更新 更多