【问题标题】:EXCEL VBA to find duplicate rows and sum rowsEXCEL VBA 查找重复行和求和行
【发布时间】:2018-05-03 22:50:31
【问题描述】:

有 10,000 多行包含供应商和供应商付款信息。 如果基于 A、C、D、F、G、H 列中的字段存在重复项,那么我想将 K 列和 L 列中的金额相加,并为其保留 1 个条目/行。

下图是结果。

如果可能,我想使用字典脚本,但我不知道如何使用它。它看起来很有效,如果没有,不同的方法也可以。 有人可以帮忙吗??????我将不胜感激!

【问题讨论】:

  • 这不是一个很好的答案,但是......这就是数据库的设计目的。您是否有可用的访问权限,您可以将其导入并执行SELECT Number,UpDown,FYE,GL_SEG_CD,ACCTNUMBER,CODE,sum(Amount1), sum(amount2) FROM table GROUP BY Number,UpDown,FYE,GL_SEG_CD,ACCTNUMBER,CODE?使用 VBA 可以做到这一点,但是呃……编写和调试、缓慢和意外的不稳定……这是导致脱发和胃灼热的原因。
  • 我想保留 EXCEL 格式,因为如果我使用 Access,会涉及很多数据操作。如果我做 EXCEL,我可以自动化一切。 :\
  • 你用的是什么版本的excel?
  • 请参阅下面的数据透视表答案。您不想覆盖工作表中的数据。数据透视表将从该表中提取作为源并且可以刷新。 SQL 效果很好,但在 Excel 中实现起来具有挑战性。数据透视表是内置的。

标签: vba excel


【解决方案1】:

这个很好玩,就写出来了。本质上,此脚本会将您的 wsFROM 视为数据库表,然后将 SQL 语句应用于它以执行您需要的操作并将结果返回给 wsTO。即使它有 20000 条记录,它也应该运行得非常快。另一种方法是遍历工作表中的每一行,然后查看是否有其他人喜欢它并添加结果。这将是那些运行 20 分钟的噩梦 VBA 例程之一,它应该在几十秒内运行。

确保将SET wsFROM...Set wsTO... 行更改为您的工作表。除此之外,我认为它不应该按原样处理您的数据。

Sub excelSQL()

    'Variables
    Dim objConn As Object
    Dim rs As Object
    Dim strFileName As String, strSQL As String, strConn As String
    Dim wsFrom As Worksheet, wsTo As Worksheet

    'set the worksheet with the data and the worksheet to dump the results
    Set wsFrom = Worksheets("Sheet1")
    Set wsTo = Worksheets("Sheet2")

    'Make a new file with _tmp appended to it in same folder
    strFileName = ThisWorkbook.Path & "/" & ThisWorkbook.Name
    strFileName = Replace(strFileName, ".xls", "_tmp.xls")        
    ThisWorkbook.SaveCopyAs strFileName

    'Fancy ADODB stuff.. essentially open up that copy we just saves as if it were a database
    Set objConn = CreateObject("ADODB.Connection")
    strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strFileName & ";Extended Properties=""Excel 12.0 Xml;HDR=YES;"""
    objConn.Open strConn        

    'This is the sql string we will use to query the excel/database. The field names are the names in Row 1 of the sheet
    strSQL = "SELECT [Number],[NAME],[Up/Down],[FYE],[GL_ACCT_GRP],[GL_SEG_CD],[ACCT#],[CODE],[REGION],Sum(Amount1), Sum(Amount2) FROM [" & wsFrom.Name & "$] GROUP BY [Number],[NAME],[Up/Down],[FYE],[GL_ACCT_GRP],[GL_SEG_CD],[ACCT#],[CODE],[REGION];"

    'Fancy ADODB stuff to apply that SQL statement to the excel/database
    Set rs = CreateObject("ADODB.Recordset")
    rs.Open strSQL, objConn

    'get headers
    Dim header as object
    Dim headerCol as integer
    headerCol = 1        
    'Loop through fields in the recordset
    For each header in rs.fields
        'Stick them in Row 1
        Cells(1, headerCol).value = header.name
        'Next Column
        headerCol = headerCol + 1
    next header

    'Copy the results of the sql statement, stored in the recordset, into the To sheet
    wsTo.Range("A2").CopyFromRecordset rs

    'close it up
    rs.Close
    objConn.Close

    'Remove that tmp workbook 
    Kill strFileName

End Sub

【讨论】:

  • 我认为这行得通。当我运行实际文件时,我会告诉你。我还有一个问题,总额一直到“BF”列。所以我有 'K' 列到 'BF' 列,这是 48 列,我需要根据标准对代码求和。我打算修改它,但我从来没有为 EXCEL 做过 SQL,哈哈。令人印象深刻的东西。提前谢谢你。
  • 工作表的每个标题单元格(在第 1 行)充当 Excel/数据库表中的字段。此处的 SQL 包含三个子句:SELECT 列出您希望返回的字段(并将您希望求和的字段相加),FROM 您只需命名作为表的工作表,以及 @ 987654326@ 在其中列出了与 SELECT 中相同的字段/标题,但要求和的字段/标题除外(因为 SUM() 基本上充当分组。如果您遇到困难,只需将代码扔到一个新问题中,然后带有 SQL 的标题列表,人们应该能够提供帮助。
  • 顺便说一句,您可以在 excel 中对您的数据应用 SQL 的事实是愚蠢的强大。例如,如果您不仅想总结这些内容,而且只想要 Acct# 介于 5000 和 5050 之间的行,则可以在 FROM 子句之后和 GROUP BY 之前添加一个 WHERE 子句,看起来喜欢WHERE [ACCT#] BETWEEN 5000 AND 5050
  • 它会在第二个之后粘贴一个数字。所以第一个Amount1 列将是[Amount1],第二个将是[Amount11]...尽管如果已经有一个Amount11 列可能会使第二个Amount1 列成为@987654338,这可能会让人感到困惑@ 等等...最好确保名称是唯一的。
  • 所以我为每一列指定了一个唯一的名称——(有 48 个)它不允许我在编码中添加它们——我认为我不能在 strSQL 中添加所有 48 个名称细绳?还有另一种方法可以做到这一点吗?我必须总结每一行的所有 48 列。抱歉一直打扰你。
【解决方案2】:

数据透视表会让您非常接近。使用旧式布局(“以表格形式显示”),您可以将 A、C、D、F、G、H 设置为行,然后将 K 和 L 相加。

稍后复制粘贴值,你就得到了你的骨架:你需要将值复制到它们下面的空白处以填充它(这可能是手动的痛苦,或者在 VBA 中更容易提升至少)。

【讨论】:

    【解决方案3】:

    从 A&C&D&F&G&H 创建一个键,对其进行排序并为键中的每个更改小计(总和)K & L。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-28
      • 2018-06-30
      • 2013-08-01
      • 1970-01-01
      • 2014-02-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多