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

时间:2010-01-12 21:44:49

标签: excel vba

鉴于我有以下

<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

4 个答案:

答案 0 :(得分:3)

你不应该为此而需要VBA。

这是你做的:

  1. 创建新工作表(Sheet3)。

  2. 将其设置为如下所示:

    alt text 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. 选择G&amp;列中的所有数据H(包括标题)。

  6. 插入&gt;数据透视表并单击“确定”。

  7. 点击数据透视表,然后将[]Item拖到行标签框,将[]QTY拖到值框中。

  8. 就是这样。数据透视表将包含每个项目的摘要。不会重复任何项目,也不会遗漏任何项目。 “QTY之和”列实际上将包含差异(因为公式对所有表1的数量使用负数)。

答案 1 :(得分:2)

在Excel VBA中,使用Dictionary。使用其中一个工作表中的项目作为键,QTY作为值。将工作表/ QTY对的工作表1放入字典中,然后运行工作表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

答案 2 :(得分:1)

一种可能性是使用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

答案 3 :(得分:1)

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

  

=如果(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,FALSE))

根据需要更改表格范围。