我正在尝试比较两个Excel文件,并将新文件中的内容存储在一个工作表中,并将旧文件中的内容存储在另一个工作表中。 (基本上是new - old = sheet1
和old - new = sheet2
。)一个SO answers建议循环遍历所有单元格并进行简单比较。我(非常)是VBA和Macros的新手,所以我不知道该怎么做。它是如何完成的(或者我在哪里可以学到这些)?
答案 0 :(得分:25)
NOT循环遍历所有细胞!!工作表和VBA之间的通信有很多开销,用于读写。循环通过所有细胞将是痛苦的缓慢。我在说几个小时。
而是将整个工作表一次加载到Variant数组中。在Excel 2003中,这需要大约2秒(和250 MB的RAM)。然后你可以立刻循环它。
在Excel 2007及更高版本中,工作表大约大1000倍(1048576行×16384列= 17 十亿单元,而65536行×256列= 17 百万在Excel 2003中)。如果您尝试将整个工作表加载到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
答案 1 :(得分:0)
您可以使用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”。
对于第二张也是如此。
现在将形式A1复制到zour数据位于旧文件和新文件的整个范围内。
但这里没有涉及两个案例:
为了涵盖这两种情况,你应该创建自己的功能,意味着学习VBA。一个非常有用的Excel页面是cpearson.com