【问题标题】:VBA macro to find duplicates and keep larger valueVBA宏查找重复项并保持更大的值
【发布时间】:2016-02-23 01:07:49
【问题描述】:

我有点迷失从哪里开始解决问题。

数据集:

AAA15200    12A    60
AAA15200    12B    60
AAA15200    12C    60
AAA15200    13A    60
AAA15200    13A    70
AAA15200    12A    65

问题:
第 1 列将是产品代码。
我需要在第 2 列中为每个产品找到一个重复项。
如果第二列出现重复,我需要转到第三列并找到较小的值,然后删除较小值的行。

所以在上面的数据集中——AAA15200有一个13A的副本。底部副本有 70,大于 60,所以我想删除包含 60 的行。
底线也与顶行重复,但底行有 65,大于 60。所以删除顶行。

然后,a 行将更改为新的产品代码,它也需要出现相同的代码。 [这是为了工作,如果没有找到解决方案,我们将不得不手动检查 9,000 多行]

【问题讨论】:

  • 如果您准备使用一些辅助列,则不需要 VBA。尝试找出如何将数据拆分为列以及如何为 Maxif 编写数组公式。发回您到达的位置,我们可以帮助您解决问题。

标签: vba excel


【解决方案1】:

与您的问题相关,该任务可以通过使用 VBA 宏或仅使用 Excel 工作表函数或仅使用如下所述的基本数据操作来完成。假设您在 A、B 和 C 列中有初始数据集:

A           B   C
AAA15200    12A 60
AAA15200    12B 60
AAA15200    12C 60
AAA15200    13A 60
AAA15200    13A 70
AAA15200    12A 65

首先,在 C 列按降序对它进行排序,结果如下:

A           B   C
AAA15200    13A 70
AAA15200    12A 65
AAA15200    12A 60
AAA15200    12B 60
AAA15200    12C 60
AAA15200    13A 60

然后对A、B列应用“删除重复”数据操作得到最终结果:

A           B   C   
AAA15200    13A 70
AAA15200    12A 65
AAA15200    12B 60
AAA15200    12C 60

希望这可能会有所帮助。最好的问候,

【讨论】:

  • 似乎工作得很好。有没有办法找出它删除了什么?
  • 我很高兴它对你有用。如果您对解决方案感到满意,请将答案标记为已接受。如果您有更多问题,请单独发布(与您在 cmets 中提出的问题相关:有许多不同的方法可以实现这一点,例如使用 Excel 过滤器或 VLOOKUP 函数比较原始(在某处兑现)和最终列表,或使用 VBA 等)。最好的问候,
【解决方案2】:

Alex Bell提出的解决方案是正确的方法。如果这是一个经常重复的过程,那么您可以参考 VBA 中描述的方法。

虽然可以通过macro recorder 轻松记录此方法以供以后使用,但它为Range.Sort method 生成的代码非常冗长。这应该就是您所需要的。

with worksheets("Sheet1")
    with .cells(1, 1).currentregion
        .cells.sort key1:=.columns(3), order1:=xldescending
                    orientation:=xltoptobottom, header:=xlyes
        .removeduplicates columns:=array(1, 2), header:=xlyes
    end with
end with

看起来差不多。检查Range.CurrentRegion property 上的文档以确保范围参考能够满足您的需求。同样,Range.RemoveDuplicates methodRange.Sort method 有可以实现的附加选项。

【讨论】:

  • 使用上面的代码,有没有办法将删除的行输出到某个地方以将其用于有效数据?
  • 不,Range.RemoveDuplicates method 永久删除重复条目。您正在寻找的可能更接近 Advanced Filter 方法。然而,这个新的皱纹打破了原来问题的答案,应该作为一个新问题提出,以免它变成Russian Doll Question
【解决方案3】:

将下面的公式作为数组公式输入(使用 Ctrl+Shift+Enter)并填写。 复制粘贴值,然后删除具有 TRUE 的行

【讨论】:

    【解决方案4】:

    将每一列从小到大排序。 在辅助列公式=--((a1&b1) =(a2&b2)) 在 1 上过滤辅助列并仅选择特殊单元格可见单元格,删除每一行。 这与您的示例数据完美配合。 2个值中的最小值被删除我怀疑事情可能更复杂,让我知道。 祝你有美好的一天。

    【讨论】:

      猜你喜欢
      • 2021-07-03
      • 2017-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-25
      • 1970-01-01
      • 2019-04-11
      相关资源
      最近更新 更多