Excelmacros:如何复制3个工作表中的所有行并合并第一列中唯一的行?

工作表中有数百行, A列为账号, B列为账户说明, C列为总计。 我想复制所有3个工作表中的行到一个单一的第四个工作表,但重复的帐户号码被find,我想那里只有一个与汇总到该行C列的总和和额外删除,如下所示:

来自工作表的input(所有工作表都在一个.xls文件中):

工作簿的工作表1

ABC 1 abc-123 Project Costs 1,548.33 2 abc-321 Housing Expenses 250 3 abc-567 Helicopter Rides 11,386.91 

工作簿的工作表2

  ABC 1 abc-123 Project Costs 1,260.95 2 abc-321 Housing Expenses 125 3 abc-567 Helicopter Rides 59,605.48 

工作簿的工作表3

  ABC 1 abc-123 Project Costs 1,785.48 2 abc-321 Housing Expenses 354 3 def-345 Elephant Treats 814,575.31 

我想要的结果是:

  ABC 1 abc-123 Project Costs 4,642.28 2 abc-321 Housing Expenses 729 3 abc-567 Helicopter Rides 70,992.39 4 def-345 Elephant Treats 814,575.31 

注意:有些账户号码不会重复,但有些可以。

这是一种方法。

 Option Explicit Sub Test() Dim sheetNames: sheetNames = Array("Sheet1", "Sheet2", "Sheet3") Dim target As Worksheet: Set target = Worksheets("Sheet4") Dim accounts As New Dictionary Dim balances As New Dictionary Dim source As Range Dim row As Range Dim id As String Dim account As String Dim balance As Double Dim sheetName: For Each sheetName In sheetNames Set source = Worksheets(sheetName).Range("A1").CurrentRegion Set source = source.Offset(1, 0).Resize(source.Rows.Count - 1, source.Columns.Count) For Each row In source.Rows id = row.Cells(1).Value account = row.Cells(2).Value balance = row.Cells(3).Value accounts(id) = account If balances.Exists(id) Then balances(id) = balances(id) + balance Else balances(id) = balance End If Next row Next sheetName Call target.Range("A2:A65536").EntireRow.Delete Dim rowIndex As Long: rowIndex = 1 Dim key For Each key In accounts.Keys rowIndex = rowIndex + 1 target.Cells(rowIndex, 1).Value = key target.Cells(rowIndex, 2).Value = accounts(key) target.Cells(rowIndex, 3).Value = balances(key) Next key End Sub 
  1. 创build一个新模块(VBA编辑器 – >插入 – >模块)并粘贴上面的代码。

  2. 添加对Microsoft Scripting Runtime的引用(VBA编辑器 – >工具 – >引用 – >检查'Microsoft Scripting Runtime')。

  3. 将光标放在代码中并按F5运行它。

显然这些表必须被命名为Sheet1,Sheet2,Sheet3和Sheet4。 它不会将列标题粘贴到Sheet4中,但大概是静态的,所以您可以事先自行设置它们。

真的,你想要做的就是运行一个macros,或者将这三张表中的所有数据复制到一张新表上,然后在结果上运行一个数据透视表。 数据透视表处理您的数据集的唯一化和多重数据的聚合。


您可以使用以下VB代码(在Excel中键入Alt-F11以进入VBA编辑器,插入一个新模块并将其粘贴到该代码中)。 此代码假设您的电子表格中有三张名为Sheet1,Sheet2和Sheet3的工作表,其中包含您的数据,并且数据是连续的,并在每张工作表的单元格A1中开始。 它也假定你的电子表格有一张名为“Pivot Sheet”的表格,这个表格是数据将被复制到的地方。

 Sub CopyDataToPivotSheet() Sheets("Pivot Sheet").Select Range("A1:IV65536").Select Selection.Clear Sheets("Sheet1").Select Range("A1").Select Range(Selection, Selection.End(xlToRight)).Select Range(Selection, Selection.End(xlDown)).Select Selection.Copy Sheets("Pivot Sheet").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Sheets("Sheet2").Select Range("A1").Select Range(Selection, Selection.End(xlDown)).Select Range(Selection, Selection.End(xlToRight)).Select Application.CutCopyMode = False Selection.Copy Sheets("Pivot Sheet").Select Range("A1").Select Selection.End(xlDown).Offset(1, 0).Range("A1").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Sheets("Sheet3").Select Range("A1").Select Range(Selection, Selection.End(xlToRight)).Select Range(Selection, Selection.End(xlDown)).Select Application.CutCopyMode = False Selection.Copy Sheets("Pivot Sheet").Select Selection.End(xlDown).Select Range("A1").Select Selection.End(xlDown).Offset(1, 0).Range("A1").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Rows("1:1").Select Application.CutCopyMode = False Selection.Insert Shift:=xlDown Range("A1").Select ActiveCell.FormulaR1C1 = "AccountNum" Range("B1").Select ActiveCell.FormulaR1C1 = "Description" Range("C1").Select ActiveCell.FormulaR1C1 = "Total" End Sub 

这是95%的Excel生成的代码(通过loggingmacros),但我改变了一些东西,使其更通用。 因此,无论如何,您可以按照常规方式将该macros指定给button,也可以通过工具=>macros=>macros…选项…对话框将其分配给键盘快捷键。

无论如何,这将使您的数据汇总到适当标题的数据透视表。

然后你可以去数据=>数据透视表和数据透视图报告。 点击下一步,select数据透视表上的数据(包括标题!),点击下一步,select布局。

将AccountNumber字段(在向导右侧)拖到标有“Row”的区域。 将“说明”字段拖到“行”区域中的“帐号”字段下。 将总计字段拖到“数据”区域,然后在“数据”区域中双击,并select“总和”,以汇总该字段。 点击确定,你应该得到一个数据透视表。 您可能要通过右键点击小计的总称(即“等等总计”)并单击隐藏来隐藏小计。 这个结果看起来基本上和你想要的输出一样。

如果你想变得有趣,你可以想像自动化最后一段,但它可能不值得。

希望这可以帮助!

我认为ADO是最好的,你会发现在这里的一些笔记: function检测Excel表中的重复

您可以使用合适的SQLstring来join和分组您的logging。

例如:

 strSQL = "SELECT F1, F2, Sum(F3) FROM (" _ & "SELECT F1,F2,F3 FROM [Sheet1$] " _ & "UNION ALL " _ & "SELECT F1,F2,F3 FROM [Sheet2$] " _ & "UNION ALL " _ & "SELECT F1,F2,F3 FROM [Sheet3$] ) " _ & "GROUP BY F1, F2"