VBA公式太长

时间:2017-11-06 11:22:00

标签: excel vba excel-vba

大家好,

我们有一个早期的模板,其中公式必须手动复制到最后一行以验证数据。现在我必须将公式转换为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"";" & _ 

但这会导致语法错误。有人可以帮忙吗?非常感谢!

3 个答案:

答案 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)