Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.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
String VBA StrComp从不返回0_String_Vba_Excel_String Comparison - Fatal编程技术网

String VBA StrComp从不返回0

String VBA StrComp从不返回0,string,vba,excel,string-comparison,String,Vba,Excel,String Comparison,使用VBA中的StrComp函数比较两个字符串时出现问题 Public Function upStrEQ(ByVal ps1 As String, ByVal ps2 As String) As Boolean upStrEQ = False If StrComp(ps1, ps2, vbTextCompare) = 0 Then upStrEQ = True End If If Len(ps1) = Len(ps2) Then

使用VBA中的
StrComp
函数比较两个字符串时出现问题

Public Function upStrEQ(ByVal ps1 As String, ByVal ps2 As String) As Boolean       
    upStrEQ = False
    If StrComp(ps1, ps2, vbTextCompare) = 0 Then
        upStrEQ = True
    End If

    If Len(ps1) = Len(ps2) Then
        Debug.Print ps1 & vbNewLine & ps2 & vbNewLine & upStrEQ
    End If

End Function
调试输出:

Technischer Name
Technischer Name
Falsch
正如您所看到的,这两个字符串具有相同的长度和相等的文本,但是
upStrEQ
False
并且
StrComp
没有返回0

任何帮助都很好。谢谢

更新: 由于传递给函数的一个字符串是在我创建示例文档之前从单元格中读取的,因此您可以重现我的错误:

StrComp()
工作得非常好。问题在于您的输入,可能有一个隐藏空间或新行

按如下方式测试代码:

Public Function upStrEQ(ByVal ps1 As String, ByVal ps2 As String) As Boolean

    If StrComp(ps1, ps2, vbTextCompare) = 0 Then
        upStrEQ = True
    End If

    If Len(ps1) = Len(ps2) Then
        Debug.Print ps1 & vbNewLine & ps2 & vbNewLine & upStrEQ
    End If

End Function

Public Sub TestMe()

    Debug.Print upStrEQ("a", "a")

End Sub
此外,布尔函数的默认值为false,因此不需要在开始时设置它

为了稍微清除输入,只清除字母和数字,可以使用自定义的
RegEx
函数。因此,像这样的东西总是会返回字母和数字:

Public Function removeInvisibleThings(s As String) As String

    Dim regEx           As Object
    Dim inputMatches    As Object
    Dim regExString     As String

    Set regEx = CreateObject("VBScript.RegExp")

    With regEx
        .pattern = "[^a-zA-Z0-9]"
        .IgnoreCase = True
        .Global = True

        Set inputMatches = .Execute(s)

        If regEx.test(s) Then
            removeInvisibleThings = .Replace(s, vbNullString)
        Else
            removeInvisibleThings = s
        End If

    End With

End Function

Public Sub TestMe()

    Debug.Print removeInvisibleThings("aa1 Abc 67 ( *^ 45 ")
    Debug.Print removeInvisibleThings("aa1 ???!")
    Debug.Print removeInvisibleThings("   aa1 Abc 1267 ( *^ 45 ")

End Sub

在代码中,当您将参数
ps1
ps2
传递到
upStrEQ

时,可以使用它,其中可能有任何隐藏字符,如
段落结尾
。你确定没有这样的事吗?另外,尝试使用
Len(string)
测试文本的长度。能否将
ps1
ps2
的值粘贴到问题中。然后,我们可以看看是否有任何UniCode字符等,这可能会让人困惑。(我们不能仅仅用一张图片就这么做。)不能从你的dropbox链接下载,所以我不能用你的输入验证输入,所有的东西都可以,但我的不行。我认为不应该有任何隐藏的空间或新行,因为字符串具有相同的长度?如果不是这样,我如何检查任何不可见的字符串内容?@daniel17903-在将输入传递到
upStrEQ
函数之前,您可以稍微清理一下输入。请参阅
removeInvisibleThings()