我们有一个早期的模板,其中公式必须手动复制到最后一行以验证数据。现在我必须将公式转换为vba,只需单击一下即可验证数据。这对所有公式都有效,除了一个,似乎太长了。但是当试图用& _
附加它时它不起作用。
谁能告诉我我做错了什么?
=WENN(
LÄNGE('Step 2 - Add Contact Informatio'!A2)>100;""too many characters"";
WENN('Step 2 - Add Contact Informatio'!A2="""";""Email is mandatory"";
WENN(ISTZAHL(FINDEN(""!"";'Step 2 - Add Contact Informatio'!A2));""special characters are not allowed"";
WENN(ISTZAHL(FINDEN(""*"";'Step 2 - Add Contact Informatio'!A2));""special characters are not allowed"";
WENN(ISTZAHL(FINDEN("":"";'Step 2 - Add Contact Informatio'!A2));""special characters are not allowed"";
WENN(ISTZAHL(FINDEN(""="";'Step 2 - Add Contact Informatio'!A2));""special characters are not allowed"";
WENN(ISTZAHL(FINDEN(""`"";'Step 2 - Add Contact Informatio'!A2));""special characters are not allowed"";
WENN(ISTZAHL(FINDEN(""\"";'Step 2 - Add Contact Informatio'!A2));""special characters are not allowed"";
WENN(ISTZAHL(FINDEN(""]"";'Step 2 - Add Contact Informatio'!A2));""special characters are not allowed"";
WENN(ISTZAHL(FINDEN(""["";'Step 2 - Add Contact Informatio'!A2));""special characters are not allowed"";
WENN(ISTZAHL(FINDEN(""}"";'Step 2 - Add Contact Informatio'!A2));""special characters are not allowed"";
WENN(ISTZAHL(FINDEN(""{"";'Step 2 - Add Contact Informatio'!A2));""special characters are not allowed"";
WENN(ISTZAHL(FINDEN(""´"";'Step 2 - Add Contact Informatio'!A2));""special characters are not allowed"";
WENN(ISTZAHL(FINDEN(""?"";'Step 2 - Add Contact Informatio'!A2));""special characters are not allowed"";
WENN(ISTZAHL(FINDEN("")"";'Step 2 - Add Contact Informatio'!A2));""special characters are not allowed"";
WENN(ISTZAHL(FINDEN(""("";'Step 2 - Add Contact Informatio'!A2));""special characters are not allowed"";
WENN(ISTZAHL(FINDEN(""/"";'Step 2 - Add Contact Informatio'!A2));""special characters are not allowed"";
WENN(ISTZAHL(FINDEN(""&"";'Step 2 - Add Contact Informatio'!A2));""special characters are not allowed"";
WENN(ISTZAHL(FINDEN(""%"";'Step 2 - Add Contact Informatio'!A2));""special characters are not allowed"";
WENN(ISTZAHL(FINDEN(""$"";'Step 2 - Add Contact Informatio'!A2));""special characters are not allowed"";
WENN(ISTZAHL(FINDEN(""§"";'Step 2 - Add Contact Informatio'!A2));""special characters are not allowed"";
WENN(ISTZAHL(FINDEN(""~"";'Step 2 - Add Contact Informatio'!A2));""special characters are not allowed"";
WENN(ISTZAHL(FINDEN(""“"";'Step 2 - Add Contact Informatio'!A2));""special characters are not allowed"";
WENN(ISTZAHL(FINDEN(""^"";'Step 2 - Add Contact Informatio'!A2));""special characters are not allowed"";
WENN(ISTZAHL(FINDEN(""°"";'Step 2 - Add Contact Informatio'!A2));""special characters are not allowed"";
WENN(ISTZAHL(FINDEN(""<"";'Step 2 - Add Contact Informatio'!A2));""special characters are not allowed"";
WENN(ISTZAHL(FINDEN("" "";'Step 2 - Add Contact Informatio'!A2));""spaces are not allowed"";
WENN(ISTZAHL(FINDEN(""#"";'Step 2 - Add Contact Informatio'!A2));""special characters are not allowed"";
WENN(ISTZAHL(FINDEN(""'"";'Step 2 - Add Contact Informatio'!A2));""special characters are not allowed"";
WENN(ISTZAHL(FINDEN("","";'Step 2 - Add Contact Informatio'!A2));""special characters are not allowed"";
WENN(ISTZAHL(FINDEN("">"";'Step 2 - Add Contact Informatio'!A2));""special characters are not allowed"";
WENN(ISTFEHLER(D5);""error"";WENN(D5=FALSCH;""error"";""ok"")))))))))))))))))))))))))))))))))
这是最初的公式,我知道它很难看,但我必须使用它,正如我所说的那样,我已尝试将公式拆分
"=WENN(
LÄNGE('Step 2 - Add Contact Informatio'!A2)>100;""too many characters"";
WENN('Step 2 - Add Contact Informatio'!A2="""";""Email is mandatory"";
WENN(ISTZAHL(FINDEN(""!"";'Step 2 - Add Contact Informatio'!A2));""special characters are not allowed"";
WENN(ISTZAHL(FINDEN(""*"";'Step 2 - Add Contact Informatio'!A2));""special characters are not allowed"";
WENN(ISTZAHL(FINDEN("":"";'Step 2 - Add Contact Informatio'!A2));""special characters are not allowed"";
WENN(ISTZAHL(FINDEN(""="";'Step 2 - Add Contact Informatio'!A2));""special characters are not allowed"";" & _
但这会导致语法错误。有人可以帮忙吗?非常感谢!
答案 0 :(得分:3)
为了它的价值,你可以减少用于检查字符的公式逻辑。以下公式一次性检查特殊字符。
=IF(ISNA(LOOKUP(2^15,FIND(MID("!*:=`\][}{´?)(/&%$§~""^°< #',>",ROW($A$1:$A$29),1),A2,1))),"OK","space and special chars not allowed!")
您需要根据自己的要求调整字符进行测试,并且必须调整 $ A $ 1:$ A $ 29 部分才能获得字符的子字符串(上面的公式测试29个字符)。如果您计划通过VBA实现纯公式解决方案,这将更容易实现。
编辑:公式说明。
第1部分: MID 公式编写为:
MID(“!*:=`] [} {'?)(/&amp;%$§~”“^°&lt;#',&gt;”,行($ A $ 1:$ A $ 29),1)
我们用双引号传递字符。唯一值得注意的区别是将双引号(“)本身作为字符来检查我们作为对传递的对象(”“)。
ROW函数生成一个数字数组,如{1,2,3 ... 29}。这必须与传递给要分割的MID函数的字符数相同,即如果我们传递35个字符,那么ROW($A$1:$A$29)
应该是ROW($A$1:$A$35)
。
然后将传递的字符串拆分为单独的项目,如{“!”,“*”,“:”....},我们在第二部分使用它来检查目标字符串中是否存在。
第2部分: FIND(midformula,A2,1)公式 然后测试目标字符串中的每个字符并返回其位置。它返回错误,它找不到特定字符。此部分返回的数组看起来像{2,“#VALUE!”,1,“#VALUE!”,“#VALUE!”,....},具体取决于它是否找到字符。
第3部分: LOOKUP(2 ^ 15,findformula)然后检查是否至少有一个数字条目(即至少找到一个字符)。数字2 ^ 15来自Excel规范。单元中允许的最大字符数是32767(即2 ^ 15-1),因此我们使用足够高的数字。可以使用任何数字,但这足以满足我们使用的LOOKUP公式。如果找到一个数字,那么该函数返回一个数值结果,如果没有,则返回#N / A. LOOKUP的优点在于它忽略了第2部分返回的错误结果,并且无需借助数组输入(CTRL + SHIFT + ENTER)即可顺利处理数组。
第4部分: IF(ISNA(lookupformula),“OK”,“空格和特殊字符不允许!”) 然后只需验证结果并显示相应的消息。
答案 1 :(得分:2)
这是如何将其转换为VBA用户定义公式的一个很好的示例:
Function detectSpecial(sInput As String) As String
Dim sSpecialChars As String
Dim i As Long
Dim i2 As Long
Dim isFound As Boolean
sSpecialChars = "\/:*?""<>|"
For i = 1 To Len(sInput)
For i2 = 1 To Len(sSpecialChars)
If Mid(sInput, i, 1) = Mid(sSpecialChars, i2, 1) Then
detectSpecial = "No special characters allowed!"
Exit Function
End If
Next
Next i
detectSpecial = sInput
End Function
如果您想增加特殊字符的数量,只需更改sSpecialChars
即可。
答案 2 :(得分:1)
要检查特殊字符,您可以像这样使用正则表达式...
Function IsStringValid(ByVal Str As String) As String
Dim RE
Set RE = CreateObject("VBScript.RegExp")
With RE
.Global = True
.Pattern = "\W"
End With
If RE.test(Str) Then
IsStringValid = "Special characters not allowed!"
End If
End Function
或者您可以像这样返回布尔值(True / False)......
Function IsStringValid(ByVal Str As String) As Boolean
Dim RE
Set RE = CreateObject("VBScript.RegExp")
With RE
.Global = True
.Pattern = "\W"
End With
If Not RE.test(Str) Then
IsStringValid = True
End If
End Function
因此IsStringValid(“Hello World”)将返回True,而IsStringValid(“Hello World!”)将返回False。
您可以在另一个子例程中或在工作表本身上使用UDF。 例如如果你想验证A1中的字符串,你可以试试......
=IsStringValid(A1)