2011-03-22 112 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