String 比较VBA时,两个文件中的相同值不同

String 比较VBA时,两个文件中的相同值不同,string,vba,comparison,String,Vba,Comparison,我试着比较两个包含相同字段的不同excel文件。 当我发现它时(通过观察视图),vba说它们是不同的 Dim ctrl As Integer Sub btnCheck_Click() Dim lot As Workbook, pr As Workbook, this As Workbook Dim a As Variant, b As Variant Dim i As Integer, j As Integer Dim passed As Boolean Set

我试着比较两个包含相同字段的不同excel文件。 当我发现它时(通过观察视图),vba说它们是不同的

Dim ctrl As Integer
Sub btnCheck_Click()
    Dim lot As Workbook, pr As Workbook, this As Workbook
    Dim a As Variant, b As Variant
    Dim i As Integer, j As Integer
    Dim passed As Boolean

Set this = Application.ThisWorkbook
this.Worksheets(1).Range("C5:J1000").ClearContents

Application.ScreenUpdating = False

a = ThisWorkbook.Path & "\" & "A.xlsx"
Set lot = Application.Workbooks.Open(a, False, False)

b = ThisWorkbook.Path & "\" & "B.xls"
Set pr = Application.Workbooks.Open(b, False, False)

i = 2
x = 2
lin = 2
Do Until lot.Worksheets(1).Range("A" & i).Value = ""
    passed = False
    j = 2
    Do Until pr.Worksheets(1).Range("A" & j).Value = ""
        If lot.Worksheets(1).Range("B" & i).Value = pr.Worksheets(1).Range("C" & j).Value Then
            passed = True
            this.Worksheets(1).Range("D" & x).Value = "ok"
            x = x + 2
        End If
        j = j + 1
    Loop
   i = i + 1
Loop
lot.Close True
Set lot = Nothing

pr.Close True
Set pr = Nothing

Application.ScreenUpdating = True   

End Sub

Function CleanStr(ByVal str As String)
CleanStr = Replace(str, Chr$(32), "")
End Function

文件A和B在下面的注释中链接。

不确定这是否能回答问题,但这不能包含在注释中:)

我想说的是,有些细胞包含不可见的字符,而不是空间

下面是一个从字符串中删除它们的递归函数:

Function CleanString(StrIn As String) As String
    ' "Cleans" a string by removing embedded control (non-printable)
    ' characters, including carriage returns and linefeeds.
    ' Does not remove special characters like symbols, international
    ' characters, etc. This function runs recursively, each call
    ' removing one embedded character

    Dim iCh As Integer
    CleanString = StrIn

    For iCh = 1 To Len(StrIn)
        If Asc(Mid(StrIn, iCh, 1)) < 32 Then
            'remove special character
            CleanString = Left(StrIn, iCh - 1) & CleanString(Mid(StrIn, iCh + 1))
            Exit Function
        End If
    Next iCh

End Function

A和B不一样。一个在空格(ASCII 32)中结束,而另一个在非中断空格(ASCII 160)中结束。看不见对我们的眼睛来说是看不见的,但是对计算机来说,ASCII(32)ASCII(160)

可以通过将此函数添加到宏来验证这一点:

Function strings2ascii(ByVal str1 As String, str2 As String)
    Dim x As Integer
    Dim intStrLen As Integer
    Dim strResult As String

    If Len(str1) > Len(str2) Then
        intStrLen = Len(str1)
    Else
        intStrLen = Len(str2)
    End If

    For x = 1 To Len(str1)
        strResult = strResult & Asc(Mid(str1, x, 1)) & ":" & Asc(Mid(str2, x, 1)) & vbCrLf
    Next

    MsgBox strResult
End Function
现在在循环中调用此函数:

    Do Until pr.Worksheets(1).Range("A" & j).Value = ""
        strings2ascii lot.Worksheets(1).Range("B" & i).Value, pr.Worksheets(1).Range("C" & j).Value
        If lot.Worksheets(1).Range("B" & i).Value = pr.Worksheets(1).Range("C" & j).Value Then

你会立即看到它们从不匹配,因为它们不一样。这里有一篇关于ASCII 160错误的类似SO帖子:

你能包含整个循环吗?其中一个包含两个尾随空格而不是一个吗?字符串长度是使用的相同长度
Replace(srt,“,”)
似乎文件B的内容受到保护
srt
在你的代码中在哪里?不起作用,一个文件扩展名是.xls,另一个文件扩展名是.xlsx。请参见此处的所有内容文件,其中A2和B3的值相同,但StrCompASCII的值不同。ascii有128个从0到127的代码点。尽管名称
Asc
使用默认的ANSI代码页(字符集和编码)返回ANSI代码点。但是,由于字符串包含UTF16编码的Unicode,所以您可能会考虑<代码> AscW < /Code >。这样,您就不必依赖于代码在哪个ANSI代码页下运行。
    Do Until pr.Worksheets(1).Range("A" & j).Value = ""
        strings2ascii lot.Worksheets(1).Range("B" & i).Value, pr.Worksheets(1).Range("C" & j).Value
        If lot.Worksheets(1).Range("B" & i).Value = pr.Worksheets(1).Range("C" & j).Value Then