【问题标题】:Compare two excel file vba比较两个excel文件vba
【发布时间】:2021-01-22 19:00:48
【问题描述】:

寻找一个 VBA 代码,我可以在其中比较来自两个不同 excel 文件的数据并在第三个 excel 文件中添加输出。

文件可以包含它必须验证的 N 列和 N 行。

  1. 我有一个代码来比较 2 张纸,但我需要如下所示的输出。 (此 vba 代码将打开 excel 文件以读取数据) Output of data after comparing
Sub Compare()

Dim WorkRng1 As Range, WorkRng2 As Range, Rng1 As Range, Rng2 As Range

Set objWorkbook1 = Workbooks.Open("F:\Learning\Book1.xlsx")
Set objWorkbook2 = Workbooks.Open("F:\Learning\Book2.xlsx")

Set objWorksheet1 = objWorkbook1.Worksheets(1)
Set objWorksheet2 = objWorkbook2.Worksheets(1)


Set WorkRng1 = objWorksheet1.UsedRange
Set WorkRng2 = objWorksheet2.UsedRange

For Each Rng1 In WorkRng1
    Rng1.Value = Rng1.Value
    For Each Rng2 In WorkRng2
        If Rng1.Value = Rng2.Value Then
            
            

            Exit For
        End If
    Next
Next


End Sub

这样要求输出

Name_Book1    | Name_Book2 |  Compare |   Amount_book1 |  Amount_book2|   Compare 
Store_1       | Store_1    | Pass     | 362            | 420           | Fail
Store_2       | Store_2    | Pass     | 400            | 360           |Fail
Store_3       | Store_3    | Pass     | 922            | 520           | Fail
Store_4       | Store_4    | Pass     | 600            | 320           | Fail
Store_5       | Store_5    | Pass     | 400            | 400           | Pass
  1. 其他代码无法打开文件,但我需要比较数据并获得如上所示的输出。

Excel File 1 | Excel File 2 | Output file

Sub GetDataFromSingleCell(单元格作为字符串)

Dim srcCN As Object ' ADODB.Connection
Dim srcRS As Object ' ADODB.Recordset

Set srcCN = CreateObject("ADODB.Connection")
Set srcRS = CreateObject("ADODB.Recordset")

srcCN.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _
            "Data Source=" & CStr("F:\Learning\Book1.xlsx") & _
            ";" & "Extended Properties=""Excel 12.0;HDR=No;"";"

srcRS.Open "SELECT * FROM [Sheet1$" & cell & ":" & cell & "];", srcCN, 3, 1  'adOpenStatic, adLockReadOnly

srctxt = srcRS.Fields(0).Value

Dim trgCN As Object ' ADODB.Connection
Dim trgRS As Object ' ADODB.Recordset

Set trgCN = CreateObject("ADODB.Connection")
Set trgRS = CreateObject("ADODB.Recordset")

trgCN.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _
            "Data Source=" & CStr("F:\Learning\Book2.xlsx") & _
            ";" & "Extended Properties=""Excel 12.0;HDR=No;"";"

trgRS.Open "SELECT * FROM [Sheet1$" & cell & ":" & cell & "];", trgCN, 3, 1  'adOpenStatic, adLockReadOnly

trgtxt = trgRS.Fields(0).Value

If srctxt = trgtxt Then
    Sheet1.Cells(1, 2) = "Passed"
Else
    Sheet1.Cells(1, 2) = "Failed"
End If

End Sub

输出文件包含 VBA 代码供参考使用。

也许像上面那样读取一个与excel文件相同的txt文件会很好。

【问题讨论】:

  • 由于数据量大,无法打开excel文件。所以我需要一个可以帮助我的 VBA 代码。
  • 您需要提供更多详细信息,说明您希望如何比较这两个文件。它们的结构是否相同?行的顺序是否相同,两个文件是否包含相同数量的数据?为什么一个比较是“通过”而另一个是“真/假”?这里缺少很多必要的信息。
  • 是的。结构化和行的顺序相同。谢谢,更新了那些真/假的东西。

标签: excel vba


【解决方案1】:

试试这个。

在运行代码的工作簿中需要一个名为“比较”的工作表。

Sub Compare()

    Dim Rng1 As Range, Rng2 As Range, arr1, arr2, arrOut
    Dim rw As Long, col As Long, c As Long, v1, v2
    
    'open workbooks and assign ranges  
    Set Rng1 = Workbooks.Open("F:\Learning\Book1.xlsx").Worksheets(1).UsedRange
    Set Rng2 = Workbooks.Open("F:\Learning\Book2.xlsx").Worksheets(1).UsedRange
   
    'check ranges are comparable 
    If Rng1.Rows.Count <> Rng2.Rows.Count Or _
       Rng1.Columns.Count <> Rng2.Columns.Count Then
        MsgBox "Ranges are different sizes!"
        Exit Sub
    End If
    
    'faster to read from arrays...
    arr1 = Rng1.Value
    arr2 = Rng2.Value
    'size array for output (need 3 output columns per input column)
    ReDim arrOut(1 To UBound(arr1, 1), 1 To 3 * UBound(arr1, 2))
    
    For rw = 1 To UBound(arr1, 1)
        c = 1 'start column position in output array
        For col = 1 To UBound(arr1, 2)
            v1 = arr1(rw, col)
            v2 = arr2(rw, col)
            If rw = 1 Then
                'column headers here...
                arrOut(rw, c) = v1 & "_book1"
                arrOut(rw, c + 1) = v2 & "_book2"
                arrOut(rw, c + 2) = "Compare"
            Else
                'column values comparison
                arrOut(rw, c) = v1
                arrOut(rw, c + 1) = v2
                arrOut(rw, c + 2) = IIf(v1 = v2, "Pass", "Fail")
            End If
            c = c + 3
        Next col
    Next rw
    
    'put result array on worksheet
    With ThisWorkbook.Sheets("Compare")
        .UsedRange.ClearContents
        .Range("A1").Resize(UBound(arrOut, 1), UBound(arrOut, 2)).Value = arrOut
    End With
    
End Sub

【讨论】:

  • 如果我有 3000 万行,但我只想验证 1000 万行。你能指导我应该在哪里添加它吗? @蒂姆·威廉姆斯
  • 以上逻辑不打开excel文件可以申请代码吗? @蒂姆-威廉姆斯
  • 而不是For rw = 1 To UBound(arr1, 1) 使用For rw = 1 To 10000 没有这个代码需要你打开文件。
  • 有没有类似上面的方法,不用打开excel文件,上面的任务应该完成?
  • 如果我只想添加失败的列输出excel,我需要更新什么代码? @蒂姆·威廉姆斯
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-03
  • 2011-07-20
  • 2015-07-19
  • 1970-01-01
  • 2012-02-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多