在Excel工作簿中比较两个工作表的最佳方法是什么?

鉴于我有以下

<Sheet 1> Item QTY A 5 B 1 C 3 <Sheet 2> Item QTY A 15 B 4 C 1 D 8 

生成显示表单1和表单2之间差异的报表的最佳方式是什么?

喜欢

 <Difference> Item QTY A 10 B 3 C -2 D 8 

在Excel VBA中,使用一个字典 。 将其中一张表中的项目用作键,数量作为值。 将工作表1的项目/ QTY对放入字典中,然后遍历工作表2的项目以相应地更新字典,以获得那里的差异。 最后把结果写入表3。

编辑:这里是一个完整的代码示例(你必须设置一个引用到Microsoft Scripting运行时才能以这种方式工作):

 Option Explicit Sub CreateDiff() Dim dict As New Dictionary Dim sh1 As Worksheet, sh2 As Worksheet, sh3 As Worksheet Dim i As Long, v As String Set sh1 = ThisWorkbook.Sheets("Sheet1") Set sh2 = ThisWorkbook.Sheets("Sheet2") Set sh3 = ThisWorkbook.Sheets("Sheet3") For i = 2 To sh1.Cells.SpecialCells(xlCellTypeLastCell).Row v = Trim(sh1.Cells(i, 1).Value) dict(v) = -sh1.Cells(i, 2).Value Next For i = 2 To sh2.Cells.SpecialCells(xlCellTypeLastCell).Row v = Trim(sh2.Cells(i, 1).Value) If dict.Exists(v) Then dict(v) = dict(v) + sh2.Cells(i, 2).Value Else dict(v) = sh2.Cells(i, 2).Value End If Next For i = 0 To dict.Count - 1 v = dict.Keys(i) sh3.Cells(i + 2, 1) = v sh3.Cells(i + 2, 2) = dict(v) Next End Sub 

你不应该需要这个VBA。

这是你做的:

  1. 创build一个新的工作表(Sheet3)。

  2. 设置它看起来像这样:

    替代文字http://img16.imageshack.us/img16/2451/consolidationsheet.jpg

  3. 以下是您需要的公式(将每个公式粘贴到适当的单元格中):

    注意:前两个是“数组公式” – 在公式中粘贴后,双击该单元格,并在公式周围出现Ctrl-Shift-Enter(大括号{})

     ------------------------------------------------------------------------------ Cell Formula ------------------------------------------------------------------------------ B2 =SUM(IF(Sheet1!A:A="",0,1)) <-- array formula: use Ctrl-Shift-Enter instead of Enter B3 =SUM(IF(Sheet2!A:A="",0,1)) <-- array formula: use Ctrl-Shift-Enter instead of Enter D2 =IF(D1=D$1,2,IF(OR(D1=B$2,D1=""),"",D1+1)) E2 =IF(D2="",IF(D1="",IF(OR(E1=B$3,E1=""),"",E1+1),2),"") G2 =IF(D2<>"",INDEX(Sheet1!A:A,D2),IF(E2<>"",INDEX(Sheet2!A:A,E2),"")) H2 =IF(D2<>"",-INDEX(Sheet1!B:B,D2),IF(E2<>"",INDEX(Sheet2!B:B,E2),"")) 
  4. 将D2:H2中的公式拖到您需要覆盖表1和表2的所有数据的位置。

  5. select列G和H(包括标题)中的所有数据。

  6. 执行插入>数据透视表,然后单击确定。

  7. 单击数据透视表并将[]Item拖动到行标签框和[]QTY到值框中。

而已。 数据透视表将包含每个项目的摘要。 没有项目会被重复,没有项目会被遗漏。 “数量总和”列实际上将包含差异(因为公式对所有图纸1的数量使用负值)。

您可以将两组数据合并到一个表(item1,qty,item2,qty)中,然后使用VLOOKUP()excel函数从相对集合中查找数据。

一种可能是使用ADO

 Dim cn As Object Dim rs As Object Dim strFile As String Dim strCon As String Dim strSQL As String ''http://support.microsoft.com/kb/246335 strFile = Workbooks("Book1.xls").FullName ''Note HDR=Yes, the names in the first row of the range ''can be used. strCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strFile _ & ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";" Set cn = CreateObject("ADODB.Connection") Set rs = CreateObject("ADODB.Recordset") cn.Open strCon strSQL = "SELECT s2.Item, s2.Qty-IIf(s1.Qty Is Null,0,s1.Qty) FROM [Sheet2$] s2 " _ & "LEFT JOIN [Sheet1$] s1 ON s2.Item=s1.Item" rs.Open strSQL, cn, 3, 3 Workbooks("Book1.xls").Worksheets("Sheet3").Cells(2, 1).CopyFromRecordset rs 

为什么使用VBA? 在工作表3比较工作表中列出A列中的工作表1和2以及B列中所有可能的项目,使用以下公式。 从B2开始,然后复制下来。

= IF(ISERROR(VLOOKUP(A2,Sheet 2中 '$ A $ 2:$ B $ 5,2,假),0,VLOOKUP(A2,Sheet 2中' $ A $ 2:$ B $ 5,2,假)) – 如果(ISERROR( VLOOKUP(A2,工作表Sheet '$ A $ 2:$ B $ 5,2,假),0,VLOOKUP(A2,工作表Sheet' $ A $ 2:$ B $ 5,2,假))

根据需要更改表格范围。