鉴于我有以下
<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
答案 0 :(得分:3)
你不应该为此而需要VBA。
这是你做的:
创建新工作表(Sheet3)。
将其设置为如下所示:
alt text http://img16.imageshack.us/img16/2451/consolidationsheet.jpg
以下是您需要的公式(将每个公式粘贴到正确的单元格中):
注意:前两个是“数组公式” - 粘贴公式后,双击单元格并按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),""))
将D2:H2中的公式向下拖动到需要覆盖第1页和第2页的所有数据。
选择G&amp;列中的所有数据H(包括标题)。
插入&gt;数据透视表并单击“确定”。
点击数据透视表,然后将[]Item
拖到行标签框,将[]QTY
拖到值框中。
就是这样。数据透视表将包含每个项目的摘要。不会重复任何项目,也不会遗漏任何项目。 “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))
根据需要更改表格范围。