2011-03-22 238 views
9

我想比較兩個Excel文件,並在一張表中存儲新文件中只存在的內容,並在另一張表中存儲舊文件中的內容。 (基本上new - old = sheet1old - new = sheet2。)一個SO answers建議循環遍歷所有單元格並做一個簡單的比較。我對VBA和宏很新,所以我不知道該怎麼做。它是如何完成的(或我可以在哪裏學習到這一點)?VBA宏來比較兩個Excel文件的所有單元格

+0

您可以使用ADO還有:http://stackoverflow.com/questions/ 5388095/is-it-it-it-it-set-foreign-key-between-excel-sheets/5388489#5388489 – Fionnuala 2011-03-22 08:27:03

回答

23

NOT循環通過所有單元格!工作表和VBA之間的通信在讀取和寫入方面存在很多開銷。循環遍歷所有單元格的速度會非常慢。我在講話時間。

取而代之,將整個表單一次加載到Variant數組中。在Excel 2003中,這需要大約2秒(和250 MB的RAM)。然後,您可以立即循環播放它。

在Excel 2007及以後,片材是約1000倍(1048576行×16384列= 17個十億細胞相比,65536行×256列= 17 百萬在Excel 2003)。如果您嘗試將整個工作表加載到Variant中,您將遇到「內存不足」錯誤;在我的機器上,我一次只能裝載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 
+0

+1完全同意,永遠不會遍歷所有單元格 – stema 2011-03-22 09:08:56

+0

好的提示。我意識到只有一列需要迭代。你會如何推薦我這樣做?並將其與另一個工作簿中的列進行比較。相當不同。 – 2011-03-22 09:14:03

+0

刪除For iCol ...下一個iCol循環。將iCol設置爲每張表中需要的值。 – 2011-03-22 13:03:30

0

一個非常簡單的檢查就可以與單元格的公式做:

表1(新 - 舊)

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

表2(舊 - 新)

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

這個公式應爲英語Excel工作。對於其他語言他們需要翻譯。 (對於德國,我可以幫助)

您需要打開所有三個Excel文檔,那麼第一個公式複製到A1的表1和第二進入A1紙2 的現在,單擊A1的第一個單元格,並標記「Ref_New」,現在您可以選擇您的參考文獻,轉到新文件並在A1中單擊,返回到Sheet1並對舊文件執行「Ref_Old」。替換另一個「Ref_New」。

Doe對於第二張圖是一樣的。

現在,將舊形式A1和新文件中的zour數據全部範圍複製到Formaula A1上。

但兩種情況未涉及:

  1. 在新的比較電池和舊是相同的數據(產生的細胞將是空的)
  2. 在所比較的細胞新的和舊的迪菲數據(產生的單元格將爲空)

爲了涵蓋這兩種情況,您還應該創建自己的函數,意思是學習VBA。一個非常有用的Excel頁面是cpearson.com