VBAmacros来比较两个Excel文件的所有单元格

我试图比较两个Excel文件,并将新文件中只存在的内容存储在一张表中,并在另一张表中存储旧文件中的内容。 (基本上new - old = sheet1old - new = sheet2 。)一个SO答案build议循环所有单元格,并做一个简单的比较。 我对VBA和macros很新,所以我不知道该怎么做。 它是如何做的(或我可以在哪里学习到这一点)?

不要循环通过所有细胞! 工作表和VBA之间的通信在读写方面存在很大的开销。 循环遍历所有的细胞将会非常缓慢。 我在说话时间。

相反,一次加载整个工作表到Variant数组中。 在Excel 2003中,这需要大约2秒(和250 MB的RAM)。 然后,你可以立即循环。

在Excel 2007及更高版本中,表格大约是1000倍(1048576行×16384列= 170 亿个单元格,而Excel 2003中的65536行×256列= 1700 万个 )。 如果您尝试将整个工作表加载到变体中,您将遇到“内存不足”错误; 在我的机器上,我一次只能装载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;"") 

这个公式应该适用于英文Excel。 对于其他语言,他们需要翻译。 (对于德国我可以协助)

您需要打开所有三个Excel文档,然后将第一个公式复制到工作表1的A1中,然后将第二个公式复制到工作表2的A1中。现在单击第一个单元格的A1并标记“Ref_New”,现在可以select参考,转到新文件并在A1中单击,返回到Sheet1,对旧文件执行“Ref_Old”。 replace另一个“Ref_New”。

对于第二张图,也是一样的。

现在复制旧数据在新旧文件中的完整范围的formaula表单A1。

但是这里没有介绍两种情况:

  1. 在新旧的比较单元格中是相同的数据(结果单元格将是空的)
  2. 在新旧比较的单元格中是不同的数据(结果单元格将为空)

为了涵盖这两种情况,你应该创build自己的function,意味着学习VBA。 一个非常有用的Excel页面是cpearson.com