2016-08-23 83 views
2

我试图比较两个不同的包含相同字段的excel文件。 当我发现它(通过表视图)VBA说,他们是不同的...在比较VBA时,2个文件中的相同值不同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在波纹管的评论链接。

+0

你能包括整个循环吗? – arcadeprecinct

+0

其中一个包含两个尾随空格而不是一个? – Dave

+0

字符串长度是一样的 – user1801745

回答

0

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帖子:Trouble replacing Chr(160) with VBA in excel

+1

ASCII有128个编码点,编号从0到127.尽管它的名字'Asc'返回ANSI代码点,使用默认的ANSI代码页(字符集和编码)。但由于字符串包含UTF-16编码的Unicode,因此可以考虑使用“AscW”。这样你就不必依赖代码运行的ANSI代码页。 –

0

不知道这是否会回答这个问题,但不能在评论站在:)

我会说,一些细胞包含空格的arent看不见字符。

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

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 

试试看这样的:

Do Until b.Worksheets(1).Range("A" & j).Value = "" 
    sa = CleanString(a.Worksheets(1).Range("B" & i).Value) 
    sb = CleanString(b.Worksheets(1).Range("C" & j).Value) 
    oa = CleanString(a.Worksheets(1).Range("E" & i).Value) 
    ob = CleanString(b.Worksheets(1).Range("F" & j).Value) 
     If StrComp(sa, sb) = 0 And StrComp(oa, ob) = 0 Then 
      Passed = True 
+0

不起作用,一个文件扩展名是.xls,另一个是.xlsx – user1801745

+0

[link](https://drive.google.com/open?id=0BxlNqIVLu5AZMWg2ZVcxajYzZDg)请在这里看到所有内容文件,其中A2和B3是相同的值,但不适用于StrComp – user1801745