VBA宏来比较两个Excel文件的所有单元格
我想比较两个Excel文件,并在一张表中存储新文件中只存在的内容,并在另一张表中存储旧文件中的内容。 (基本上new - old = sheet1
和old - new = sheet2
。)一个SO answers建议循环遍历所有单元格并做一个简单的比较。我对VBA和宏很新,所以我不知道该怎么做。它是如何完成的(或我可以在哪里学习到这一点)?VBA宏来比较两个Excel文件的所有单元格
做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
+1完全同意,永远不会遍历所有单元格 – stema 2011-03-22 09:08:56
好的提示。我意识到只有一列需要迭代。你会如何推荐我这样做?并将其与另一个工作簿中的列进行比较。相当不同。 – 2011-03-22 09:14:03
删除For iCol ...下一个iCol循环。将iCol设置为每张表中需要的值。 – 2011-03-22 13:03:30
一个非常简单的检查就可以与单元格的公式做:
表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上。
但两种情况未涉及:
- 在新的比较电池和旧是相同的数据(产生的细胞将是空的)
- 在所比较的细胞新的和旧的迪菲数据(产生的单元格将为空)
为了涵盖这两种情况,您还应该创建自己的函数,意思是学习VBA。一个非常有用的Excel页面是cpearson.com
您可以使用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