[英]VBA Macro to compare all cells of two Excel files
我正在嘗試比較兩個Excel文件,並將新文件中的內容存儲在一個工作表中,並將舊文件中的內容存儲在另一個工作表中。 (基本上是new - old = sheet1
和old - 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。
但這里沒有涉及兩個案例:
為了涵蓋這兩種情況,您應該創建自己的功能,意味着學習VBA。 一個非常有用的Excel頁面是cpearson.com
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.