VBA公式太长

大家好,

我们有一个早期的模板在工作,公式必须手动复制到最后一行来validation数据。 现在我必须将公式导入到vba中来一键式validation数据。 除了一个公式外,这对所有的公式都有效,似乎太长了。 但是,当试图用& _附加它不起作用。

谁能告诉我我做错了什么?

 =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"";" & _ 

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

对于什么是值得的,你可以减less检查字符的公式逻辑。 以下公式一次性检查特殊字符。

 =IF(ISNA(LOOKUP(2^15,FIND(MID("!*:=`\][}{´?)(/&%$§~""^°< #',>",ROW($A$1:$A$29),1),A2,1))),"OK","space and special chars not allowed!") 

您需要根据您的要求调整要testing的字符,并且必须调整$ A $ 1:$ A $ 29部分才能得到字符的子string(上面的公式正在testing29个字符)。 如果您计划通过VBA实施纯粹的配方解决scheme,这将更容易实施。

编辑:公式的解释。

第1部分: MID公式写为:

MID(“!*:=`] [} {'?)(/ $&$ $〜”“^°<#',>”,ROW($ A $ 1:$ A $ 29)

在那里我们通过双引号的字符。 唯一明显的区别是通过双引号(“)本身作为字符来检查我们作为pair(”“)传递。

ROW函数生成一个数字数组,如{1,2,3 … 29}。 如果我们通过说35个字符,那么ROW($A$1:$A$29)应该是ROW($A$1:$A$35) ,这个字符的大小与传递给MID函数的字符的数量是一样的。 。

然后将传入的string分割成单独的项目,如{“!”,“*”,“:”….},我们在第二部分中使用它来检查目标string中是否存在。

第2部分: FIND(midformula,A2,1)公式然后testing目标string中的每个单独的字符并返回其位置。 它在没有find特定字符的情况下返回错误。 这部分返回的数组看起来像{2,“#VALUE!”,1,“#VALUE!”,“#VALUE!”,….},这取决于它是否find字符。

第3部分: LOOKUP(2 ^ 15,findformula)然后检查是否至less有一个数字条目(即至lessfind一个字符)。 数字2 ^ 15来自Excel规范。 单元格允许的最大字符数是32767(即2 ^ 15-1),所以我们使用足够高的数字。 可以使用任何数字,但是这对于我们正在使用的LOOKUP公式就足够了。 如果find一个数字,那么函数返回一个数字结果,如果没有,则返回#N / A。 LOOKUP的美妙之处在于它忽略了第2部分返回的错误结果,并且无需求助于数组项(CTRL + SHIFT + ENTER)即可平滑地处理数组。

第4部分: IF(ISNA(lookupformula),“确定”,“空格和特殊字符不允许!”)然后只validation结果并显示适当的消息。

这是如何将其转换为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

为了检查特殊字符,你可以像这样使用Regular Expression …

 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 

或者你可以像这样返回布尔(真/假)…

 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。 例如,如果你想validationA1中的string,你可以尝试…

 =IsStringValid(A1)