【问题标题】:Macro/VBA to merge rows for non-unique用于合并非唯一行的宏/VBA
【发布时间】:2015-04-03 02:58:34
【问题描述】:

我有一个电子表格,其中包含与制表符分隔的文本文件的数据连接。文本文件是通过使用来自 SoftPerfect 的名为 NetScan 的程序的导出功能生成的。每个报告都是实时的,不包括来自当前未打开或未连接到网络的计算机的数据。这意味着较新的报告可能缺少旧报告所拥有的计算机,但它也可能包含已添加更多内存的计算机或其他类似内容的更新信息。

因此,在电子表格上,我可以刷新数据连接以从文本文件进行更新,但由于每次我以大量重复的计算机条目(整行可能或可能不完全重复)。我想合并这些行,以便每台计算机都有一行。

一小部分样本数据(全是假的) - 请注意,完整电子表格中有更多列,但此样本数据包含我计划过滤/合并的所有信息:

A               B           C                   D               E       F
IP Address      Host Name   MAC Address         Response Time   Dups    Serial Number
192.168.1.110   CLT-001     XX:XX:XX:XX:XX:C5   0 ms            2       ABC123
192.168.1.174   CLT-001     XX:XX:XX:XX:XX:FE   5 ms            1       ABC123
192.168.1.110   CLT-001     XX:XX:XX:XX:XX:C5   1 ms            2       ABC123
192.168.1.138   CLT-004     XX:XX:XX:XX:XX:04   1 ms            2       DEF456
192.168.1.146   CLT-009     XX:XX:XX:XX:XX:8E   1 ms            2       GHI789
192.168.1.121   CLT-004     XX:XX:XX:XX:XX:04   1 ms            2       DEF456
192.168.1.146   NA          XX:XX:XX:XX:XX:8E   1 ms            2       NA
192.168.1.152   CLT-005     XX:XX:XX:XX:XX:6B   1 ms            1       JKL012

序列号是识别唯一计算机的方法,但有时扫描无法获取 S/N(WMI 错误),在这种情况下,下一个最佳选择是 MAC 地址。 MAC 地址的问题在于,这些笔记本电脑中的大多数最终会在每台计算机上注册 2 台——一台用于有线,一台用于无线。

我尝试使用=COUNTIF(Row,ItemToCount)(即示例数据中的 E 列),但我不确定如何使用从中获得的信息。此外,整个事情都需要在 VBA 中完成,因此我可以将其包含在工作簿主工作表上的数据清理按钮中。我的目标是最终得到如下所示的数据:

A               B           C                   D               E       F
IP Address      Host Name   MAC Address         Response Time   Dups    Serial Number
192.168.1.110   CLT-001     XX:XX:XX:XX:XX:C5   0 ms            1       ABC123
192.168.1.146   CLT-009     XX:XX:XX:XX:XX:8E   1 ms            1       GHI789
192.168.1.121   CLT-004     XX:XX:XX:XX:XX:04   1 ms            1       DEF456
192.168.1.152   CLT-005     XX:XX:XX:XX:XX:6B   1 ms            1       JKL012

我考虑的一个概念是使用响应时间来指示连接是有线还是无线,这对于我的目的应该足够准确。 0 或 1ms 表示有线,而 2ms 或更多表示无线。另一种选择是添加更多的 WMI 调用来识别网卡的类型,并在报告甚至到达导出的文本文件之前将它们过滤掉。

在这一点上,任何帮助将不胜感激。我在这些论坛上能找到的最接近的问题是Conditional Removal of Duplicates from Excel 问题。其他论坛(例如 mrexcel、excelforum 和 ozgrid)也没有任何明显的答案,尽管有很多帖子几乎都有类似的问题,以至于找到我要找的东西相当困难。谢谢!

【问题讨论】:

    标签: excel merge duplicates vba


    【解决方案1】:

    你可以试试这个: 我发现公式比 vba 更容易/更快。所以我尝试尽可能少地使用 vba。

    首先,使用以下公式创建一个新列:

    =IF(ISNA(MATCH(F2,OFFSET(F2,-1*(ROW(G2)-1),0,ROW(G2)-1,1),0)), FALSE, TRUE)
    

    该公式的目的是如果当前记录与其上的任何内容重复,则返回 TRUE。目前,它只检查序列号,但是,在 FALSE 部分,您可以稍微复制一些逻辑并更改列以类似方式检查 MAC 地址。

    我在 G 列中添加了该公式。在单元格 H1 中,我添加了以下公式:

    =COUNTA(G:G)
    

    (我也将此单元格命名为“numrows”)

    然后在 vba 中,我做了以下操作:

      Sub Macro1()
        Dim r As Integer
    
        r = Range("numrows").Value
    
        For i = r To 2 Step -1
          If Cells(i, 7).Value Then
              Rows(i).Select
              Selection.Delete Shift:=xlUp
              Cells(i, 1).Select
          End If
        Next i
      End Sub
    

    这似乎可以解决问题。 通过将公式保留在 vba 之外,它应该可以更容易地对其进行调整以帮助识别记录。然后 vba 脚本简单地查找那个“触发器”列,并以此为基础进行删除。 这实际上允许您根据需要手动“覆盖”,删除您知道要删除的一两条记录。

    【讨论】:

    • 我想在这里发布这是很好的信息,尽管我无法使用它来解决我的问题。希望它会帮助其他人。
    • 哦?为什么不?它抛出错误了吗?或者只是额外的要求你搞砸了? ;)
    • 附加要求。缺少一个我可以依赖的唯一列始终存在增加了复杂性。基本上,传入的数据不足以执行我想要的自动化。我不熟悉这个网站的礼仪,我应该支持你的解决方案,因为这些信息对我发布的小样本有效吗?
    • 嗯 .. 我自己也不确定. :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-21
    • 1970-01-01
    • 2017-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-27
    相关资源
    最近更新 更多