Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VBA公式太长 大家好,_Vba_Excel - Fatal编程技术网

VBA公式太长 大家好,

VBA公式太长 大家好,,vba,excel,Vba,Excel,我们有一个早期的模板在工作中,公式必须手动复制到最后一行以验证数据。现在,我必须将公式输入vba,以便单击验证数据。这对所有公式都有效,除了一个,它似乎太长了。但是当试图用&附加它时,它不起作用 谁能告诉我我做错了什么 =WENN( LÄNGE('Step 2 - Add Contact Informatio'!A2)>100;""too many characters""; WENN('Step 2 - Add Contact Informatio

我们有一个早期的模板在工作中,公式必须手动复制到最后一行以验证数据。现在,我必须将公式输入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"")))))))))))))))))))))))))))))))))

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

这是如何将其转换为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
函数将特殊(输入为字符串)检测为字符串
将特殊字符设置为字符串
我想我会坚持多久
尺寸i2与长度相同
我们发现它是布尔型的
SSSpecialChars=“\/:*?”|
对于i=1到Len(sInput)
对于i2=1至Len(特殊字符)
如果Mid(sInput,i,1)=Mid(sSpecialChars,i2,1),则
detectSpecial=“不允许使用特殊字符!”
退出功能
如果结束
下一个
接下来我
检测专用=输入
端函数

如果要增加特殊字符的数量,只需更改
ssspecialchars

即可。这是一个很好的示例,说明了如何将其转换为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
函数将特殊(输入为字符串)检测为字符串
将特殊字符设置为字符串
我想我会坚持多久
尺寸i2与长度相同
我们发现它是布尔型的
SSSpecialChars=“\/:*?”|
对于i=1到Len(sInput)
对于i2=1至Len(特殊字符)
如果Mid(sInput,i,1)=Mid(sSpecialChars,i2,1),则
detectSpecial=“不允许使用特殊字符!”
退出功能
如果结束
下一个
接下来我
检测专用=输入
端函数

如果要增加特殊字符的数量,只需更改检查特殊字符的
ssspecialchars

即可,您可以使用如下正则表达式

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
或者您可以像这样返回布尔值(真/假)

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。 e、 g.如果要验证A1中的字符串,可以尝试

=IsStringValid(A1) 

为了检查特殊字符,可以使用如下正则表达式

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
或者您可以像这样返回布尔值(真/假)

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。 e、 g.如果要验证A1中的字符串,可以尝试

=IsStringValid(A1) 

为了实现它的价值,您可以减少用于检查字符的公式逻辑。以下公式一次检查特殊字符

=IF(ISNA(LOOKUP(2^15,FIND(MID("!*:=`\][}{´?)(/&%$§~""^°< #',>",ROW($A$1:$A$29),1),A2,1))),"OK","space and special chars not allowed!")
=IF(ISNA(查找(2^15,查找(MID(!*:=`\][}{´?)(/&%$§`.'^°<#',>,行($A$1:$A$29),1),A2,1)),“确定”,“不允许使用空格和特殊字符!”)
您需要根据需要调整要测试的字符,并且必须调整$A$1:$A$29部分以获得字符的子字符串(上面的公式正在测试29个字符)。如果您计划通过VBA实现纯公式解决方案,这将更容易实现

编辑:公式说明

第1部分:MID公式写为:

中间(“!*:=`][}{´?(/&%$§~”“^°<#',>”,行($A$1:$A$29),1)

其中我们以双引号传递字符。唯一显著的区别是将双引号(“”)本身作为字符传递,以检查我们以成对(“”)传递的字符

ROW函数生成一个类似{1,2,3…29}的数字数组。这个数组的大小必须与传递给MID函数进行拆分的字符数相同,即如果我们传递35个字符,那么
行($a$1:$a$29)
应该是
行($a$1:$a$35)

然后将传递的字符串拆分为{“!”、“*”、“:”…}等单独的项,我们在第二部分中使用这些项来检查目标字符串中是否存在

第2部分:查找(midformula,A2,1)公式 然后测试目标字符串中的每个字符并返回其位置。如果找不到特定字符,则返回错误。此部分返回的数组看起来像{2,“#VALUE!”,1,“#VALUE!”,“#VALUE!”,…},这取决于它是否找到字符

第3部分:查找(2^15,findformula)然后检查是否至少有一个数字条目(即至少找到一个字符)。数字2^15来自Excel规范。单元格中允许的最大字符数为32767(即2^15-1)因此,我们使用一个足够高的数字。可以使用任何数字,但这足以满足我们使用的查找公式。如果找到一个数字,则函数返回一个数字结果,如果没有,则返回#N/a。查找的美妙之处在于它忽略第2部分返回的错误结果,并平滑地处理数组,而不必求助于数组en尝试(CTRL+SHIFT+ENTER)

第4部分:如果(ISNA(查找公式),“确定”,“不允许使用空格和特殊字符!”)
然后只需验证结果并显示相应的消息。

您可以减少用于检查字符的公式逻辑。下面的公式一次检查特殊字符

=IF(ISNA(LOOKUP(2^15,FIND(MID("!*:=`\][}{´?)(/&%$§~""^°< #',>",ROW($A$1:$A$29),1),A2,1))),"OK","space and special chars not allowed!")
=IF(ISNA(查找(2^15,查找(MID(!*:=`\][}{´?)(/&%$§`.'^°<#',>,行($A$1:$A$29),1),A2,1)),“确定”,“不允许使用空格和特殊字符!”)
您需要根据需要调整要测试的字符,并且必须调整$A$1:$A$29部分以获得字符的子字符串(上面的公式正在测试29个字符)。如果您计划通过VBA实现纯公式解决方案,这将更容易实现

编辑:表格说明