【问题标题】:How do I compare 2 workbooks columns and show duplicates as a new list?如何比较 2 个工作簿列并将重复项显示为新列表?
【发布时间】:2011-10-15 04:04:34
【问题描述】:

我有两个不同的工作簿,一个工作簿中有大约 15 列和 50k 行,另一个工作簿中有 10 列和 1000 行,只有 2 列(部件号、更改级别)是共同的。所以我想从这两个工作簿中提取两个报告。

  1. 将具有通用部件号和更改级别的记录作为一份报告记录到不同的工作簿中。
  2. 我想从第一个工作簿中删除通用部件号和更改级别记录,并将所有剩余记录复制到另一个工作簿中作为另一个报告。

【问题讨论】:

    标签: excel excel-2003 excel-formula vba


    【解决方案1】:

    安吉。 . .

    在任何人可以帮助您解决此问题之前,您有几个问题需要回答。

    1. 这是一次性交易,您尝试清理数据并提出新的起点,而您不需要一遍又一遍地运行此过程?

    2. 我们能否假设数据行不在两个 Workbook 的同一 Worksheet 行中?

    如果这两个问题的答案都是肯定的,那么我不得不说 Excel 绝对不是您应该使用的 Office 应用程序。我建议您将两个工作簿作为单独的表导入 Access 数据库。这样,您可以使用 SQL 执行匹配和查找,而只需很少或不需要代码。获得所需结果后,您可以轻松地将查询结果导出回 Excel 工作簿。你可能会在一个小时内得到答案。如果您使用此选项,您还可以将工作表链接到 Access DB 并避免导入它们。它不会那么快,但它会起作用。

    否则,如果您被 Excel 卡住,那么您要么需要编写大量代码,其中包括循环遍历一个工作簿中的所有记录、查找另一个工作簿中的值,然后生成输出还有更多工作簿。 . .要么 。 . .您可以尝试将包含 1000 条记录的工作表复制到另一个工作簿中,然后使用工作表函数 VLOOKUP 和/或 HLOOKUP 创建大量公式。 (我不能凭良心支持第二种方法,但如果您在 VBA 方面不是很有经验,那么它可能对您来说是更好的方法。

    无论您使用 Excel 解决方案,都会涉及大量工作。

    如果您有任何特定的编码问题,那么您来对地方了。但您需要先选择一种方法。

    祝你好运!

    道格

    【讨论】:

    • 1.不,这不是一次性交易,我们每个月都必须这样做。 2. 我没有正确理解这个问题。你的意思是,一个工作表中的相同数据行不在另一个工作表的同一行中?如果这是我的答案,我的答案是肯定的,它们不在两个工作表中的同一行。
    • 是的,这就是问题。您是否会为此使用 Excel 或 Access 是一种选择?
    • +1 for Excel 绝对不是您应该使用的 Office 应用程序
    • 我现在正在玩 ACCESS..但是每次我们必须将 25-30 个 excel 表导入到 access DB 中。这一切都将是手工工作。我正在考虑根据报告名称为所有报告编写单独的查询,以节省每个月的时间。但我仍然必须每个月将所有 excel 文件导入 Accee DB。有什么想法可以避免这项工作吗??
    • 有没有办法一次导入或链接所有的excel文件来访问数据库??
    【解决方案2】:

    这个问题很容易回答,问题有两个方面。

    1. 您的计算机有多快?
    2. 您需要多久运行一次此代码?

    我问这些问题的原因是因为要在 50,000 行上运行任何代码,无论实际完成这项工作的代码有多小……你需要一台相当强大的计算机,否则这段代码会让您的计算机停止运行,或者至少在 1 到 3 分钟以上的时间内表现出色,具体取决于您实际拥有的内存量和速度。

    在没有看到工作簿的情况下,您需要一些非常简单的公式,但您要做的就是在工作簿中添加另一行。在 P 列中,您需要一个验证公式。这个公式很简单,但取决于您需要多少参考点。

    =COUNTIFS('Sheet2'!$A:$A,$A3,'Sheet2'!$E:$E,$E3)

    从那里你可以看到什么是重复的。然后,您可以在 Q 列中使用如下公式:

    =IF($P3,"SAME","")

    它会告诉你数据是否相同。基本上它说如果单元格 P3 中除了 0 之外还有其他内容,它会说存在相同的内容,否则不是。

    从那里你需要一个类似这样的代码:

    Sub Update_TNOOR()
        Dim wsS1 As Worksheet
        Dim wsS2 As Worksheet
        Dim lastrow As Long, fstcell As Long
    
        Set wsS1 = Sheets("Sheet1")
        Set wsS2 = Sheets("Sheet2")
    
        With Application
            .ScreenUpdating = False
            .DisplayAlerts = False
            .EnableEvents = False
        End With
    
        With wsS1
            wsS1.Columns("P:Q").ClearContents
            ThisWorkbook.Sheets("Sheet1").Cells(1, 16).Value = “=COUNTIFS('Sheet2'!$A:$A,$A3,'Sheet2'!$E:$E,$E3)"
            ThisWorkbook.Sheets("Sheet1").Cells(1, 17).Value = “=IF($P3,"Same",””””)"
        wsS2.Columns("P:Q").ClearContents
            ThisWorkbook.Sheets("Sheet2").Cells(1, 16).Value = “=COUNTIFS('Sheet1'!$A:$A,$A3,'Sheet1'!$E:$E,$E3)"
            ThisWorkbook.Sheets("Sheet2").Cells(1, 17).Value = “=IF($P3,"Same",”Different”)"
    
        End With
    
    
        With Intersect(wsS1, wsS1.Columns("Q"))
            .AutoFilter 1, "<>Same"
            With Intersect(.Offset(2).EntireRow, .Parent.Range("B:Q"))
                .EntireRow.Delete
            End With
            .AutoFilter
        End With
    
        'Blow away rows that are useless
        lastrow = wsS2.Range("A2").End(xlDown).Row
        wsS2.Range("P1:Q1").Copy wsS2.Range("P2:Q" & lastrow)
    
        With Intersect(wsS2.UsedRange, wsS2.Columns("Q"))
            wsS2.Range("P:Q").Calculate
            .AutoFilter 1, "<>Different"
            .SpecialCells(xlCellTypeVisible).EntireRow.Delete
        End With
    
        With wsS2
            lastrow = wsS2.Range("A1").End(xlDown).Row
            Intersect(.UsedRange, .Range("A1:N" & lastrow)).Copy wsS1.Cells(Rows.Count, "B").End(xlUp).Offset(1)
        End With
    
    
        With Application
            .ScreenUpdating = True
            .DisplayAlerts = True
            .EnableEvents = True
        End With
    End Sub
    

    这应该会让你上路......如果我读到你正在尝试正确做的事情。

    正如人们所说,你想要做的事情可以在 excel 中完成,如果它,我不知道......这里的人似乎不这么认为,但如果你需要使用 excel,这应该会让你继续你的方式。

    同样,我不知道您的工作簿是什么样的,所以我希望这会有所帮助。这会比较数据并将其合并到第一张工作表中。 IT 不会做你想做的所有事情......但这应该能让你顺利上路。

    【讨论】:

      猜你喜欢
      • 2017-05-21
      • 2012-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多