簡體   English   中英

VBA宏來比較兩個Excel文件的所有單元格

[英]VBA Macro to compare all cells of two Excel files

我正在嘗試比較兩個Excel文件,並將新文件中的內容存儲在一個工作表中,並將舊文件中的內容存儲在另一個工作表中。 (基本上是new - old = sheet1old - new = sheet2 。)一個SO答案建議循環遍歷所有單元格並進行簡單比較。 我(非常)是VBA和Macros的新手,所以我不知道該怎么做。 它是如何完成的(或者我在哪里可以學到這一點)?

難道不是遍歷所有的細胞! 工作表和VBA之間的通信有很多開銷,用於讀寫。 循環通過所有細胞將是痛苦的緩慢。 我在說幾個小時。

而是將整個工作表一次加載到Variant數組中。 在Excel 2003中,這需要大約2秒(和250 MB的RAM)。 然后你可以立刻循環它。

在Excel 2007及更高版本中,工作表大約大1000倍(1048576行×16384列= 170 億個單元,而Excel36中為65536行×256列= 1700 )。 如果您嘗試將整個工作表加載到Variant中,則會遇到“Out of memory”錯誤; 在我的機器上,我一次只能加載3200萬個單元格。 因此,您必須將自己限制在您知道其中包含實際數據的范圍內,或逐位加載工作表,例如一次加載30列。

Option Explicit

Sub test()

    Dim varSheetA As Variant
    Dim varSheetB As Variant
    Dim strRangeToCheck As String
    Dim iRow As Long
    Dim iCol As Long

    strRangeToCheck = "A1:IV65536"
    ' If you know the data will only be in a smaller range, reduce the size of the ranges above.
    Debug.Print Now
    varSheetA = Worksheets("Sheet1").Range(strRangeToCheck)
    varSheetB = Worksheets("Sheet2").Range(strRangeToCheck) ' or whatever your other sheet is.
    Debug.Print Now

    For iRow = LBound(varSheetA, 1) To UBound(varSheetA, 1)
        For iCol = LBound(varSheetA, 2) To UBound(varSheetA, 2)
            If varSheetA(iRow, iCol) = varSheetB(iRow, iCol) Then
                ' Cells are identical.
                ' Do nothing.
            Else
                ' Cells are different.
                ' Code goes here for whatever it is you want to do.
            End If
        Next iCol
    Next iRow

End Sub

要與不同工作簿中的工作表進行比較,請打開該工作簿並獲取工作表,如下所示:

Set wbkA = Workbooks.Open(filename:="C:\MyBook.xls")
Set varSheetA = wbkA.Worksheets("Sheet1") ' or whatever sheet you need

您可以使用Cell公式進行非常簡單的檢查:

表1(新舊)

=(if(AND(Ref_New<>"";Ref_Old="");Ref_New;"")

表2(舊 - 新)

=(if(AND(Ref_Old<>"";Ref_New="");Ref_Old;"")

此公式應適用於ENGLISH Excel。 對於其他語言,他們需要翻譯。 (對於德語,我可以提供幫助)

您需要打開所有三個Excel文檔,然后將第一個公式復制到工作表1的A1中,將第二個公式復制到工作表2的A1中。現在單擊第一個單元格的A1並標記“Ref_New”,現在您可以選擇您的參考,轉到新文件並單擊A1,返回到sheet1並使用舊文件對“Ref_Old”執行相同操作。 也替換另一個“Ref_New”。

對於Sheet 2來說,它也是一樣的。

現在,在zour數據位於舊文件和新文件的整個范圍內復制格式A1。

但這里沒有涉及兩個案例:

  1. 在New和Old的比較單元格中是相同的數據(結果單元格將為空)
  2. 在New和Old的比較單元格中是不同的數據(結果單元格將為空)

為了涵蓋這兩種情況,您應該創建自己的功能,意味着學習VBA。 一個非常有用的Excel頁面是cpearson.com

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM