我正在对一大列字符串进行数据质量检查(即。姓氏),并想查看它们是否包含数字。
到目前为止,我尝试过的 VBA 代码应该是直截了当的:如果 LastName 字段包含 1 或 2(等),则 ReasonCode = 3。稍后,如果 ReasonCode = 3,结果会吐出"包含一个数字">
但是,在"marshall"等情况下,它仍然填充"包含一个数字">
ElseIf LastName Like "*#*" Or FirstName Like "*#*" Then
ReasonCode = 3
End If
ElseIf ReasonCode = 3 Then
Cells(RowT, 16).Value = "Contains a number"
ReasonCode = 0
End If
BigBen 几乎回答了您关于Like
运算符使用#
的问题,所以我不会真正讨论这个问题。但我确实注意到您在 If 语句中使用了许多 Like 运算符,所以我想我会借此机会分享我不久前创建并经常使用的函数。
此函数的目的是在与单个值进行比较时减少多个Like
语句。虽然此功能不能解决您的特定问题,但将来可能会有所帮助。
Function OrLike(ByVal compareVar As Variant, ParamArray CompareArgs() As Variant) As Boolean
Dim i As Long
If IsArray(CompareArgs(0)) Then
For i = LBound(CompareArgs(0)) To UBound(CompareArgs(0))
If compareVar Like CompareArgs(0)(i) Then
OrLike = True
Exit Function
End If
Next
Else
For i = LBound(CompareArgs) To UBound(CompareArgs)
If compareVar Like CStr(CompareArgs(i)) Then
OrLike = True
Exit Function
End If
Next i
End If
End Function
首先,该函数检查CompareArgs
中使用的第一个值。如果此值是数组,则它与数组进行比较,否则它将使用ParamArray
关键字。这允许您以两种方式使用此函数:
使用数组变量作为参数
Dim Arr() As Variant
Arr = Array("Blah*", "Blah2*")
If Orlike("BlahBlah", Arr) Then
' . . .
End If
利用参数阵列
If OrLike("BlahBlah", "Blah*", "Blah2*") Then
' . . .
End If
显然,您不想使用您提供的当前 If 语句。但是,如果您以您为例,请看一下此函数如何通过转动以下内容来简化您的语句并大大提高可读性:
ElseIf LastName Like "*1*" Or LastName Like "*2*" Or LastName Like "*3*" Or LastName Like "*4*" _
Or LastName Like "*5*" Or LastName Like "*6*" Or LastName Like "*7*" _
Or LastName Like "*8*" Or LastName Like "*9*" Or LastName Like "*0*" Then
进入这个:
ElseIf OrLike(LastName, "*1*", "*2*", "*3*", "*4*", "*5*", "*6*", "*7*", "*8*", "*9*", "*0*") Then
它不仅可以提高可读性,而且实际上可以提高性能。VBAIf...Then
语句的问题在于,即使在返回True
的语句之后,也必须计算行中的所有内容。
该函数接受所有这些参数,并计算每个语句,直到一个语句变得True
,然后它立即退出函数 - 忽略其余参数。