【问题标题】:VBA - Search and remove duplicatesVBA - 搜索和删除重复项
【发布时间】:2012-05-07 05:59:08
【问题描述】:

我正在寻找一种我自己不具备 VBA 知识来编写脚本的算法。所以我被困住了。这不是因为缺乏努力尝试,因为我已经尝试过了(另外,这段代码是我更大的 VBA 代码的最后一部分)我只是缺乏知识/经验/技能......

基本上,我有一个 Excel 文件。在这个文件中有一个工作表,“sheet1”。 Sheet1 包含多行数据。 sheet1 中包含的行数可以在 1 到 n 之间变化。有时,我可能有 50 个,而其他时候可能有 30 个,等等。一致的是本书的布局,即我在 A 列中有代码,用于标识我的数据库中的产品。

我想做的是这样的:

1. 扫描工作表中的空行(由于工作簿的生成方式,我有时会有空行)并将其删除。这些空白行有时位于数据行之间,而有时可能位于工作表末尾。

2. 删除空白行后,找到最后使用的行。将其存储到变量中。我发现这段代码对此很有用:

mylastrow = myBook.Sheets("Results").Cells.Find(what:="*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row

3. 从 (2) 中确定的行开始,我想取 A(x where x = mylastrow) 中的产品代码并找到它的任何其他出现(在 A 列中) .如果找到,则删除与其对应的整行。重要的是,这个循环必须反向。例如,假设mylastrow = 40,循环将需要从 A40 开始,并且在下一次迭代中执行 A39(或者如果一行已被删除,则为 38?)。这是因为对于任何产品编号,行中的相应数据都包含更多的数据(由于工作表的生成方式)。本质上,最接近最后一行的条目是最新的。

希望我能够正确解释现场。但如果不是,并且您愿意接受挑战(我的负担?),我将非常感激。

QF

【问题讨论】:

    标签: vba excel excel-2011


    【解决方案1】:

    发展这些知识和技能的唯一方法是进入那里并编写代码!我相信有人可能会进来并为您编写整个过程,但与此同时,这些资源应该为您提供自己完成的工具。

    首先,查看方法here 删除空白行。它依赖于范围的“选择”,因此您可以手动选择工作表的所有单元格,然后运行宏,或者将其替换为以下内容:

    Dim r as range
    set r = Sheet1.Cells 'now use r instead of Selection
    

    或者(甚至更好)使用您的代码查找最后使用的行并将范围从第 1 行设置为“mylastrow”。

    接下来,从“mylastrow”开始,开始将 A 列中的值添加到 Dictionary 对象(例如 here)。您可以使用行计数器从“mylastrow”递减到 1。这是它如何工作的示例。假设密钥位于第一列(“A”)。

    Dim dict As Object
    Dim rowCount As Long
    Dim strVal As String
    
    Set dict = CreateObject("Scripting.Dictionary")
    
    rowCount = Sheet1.Range("A1").CurrentRegion.Rows.Count
    
    Do While rowCount > 1
      strVal = Sheet1.Cells(rowCount, 1).Value2
    
      If dict.exists(strVal) Then
        Sheet1.Rows(rowCount).EntireRow.Delete
      Else
        dict.Add strVal, 0
      End If
    
      rowCount = rowCount - 1
    Loop
    
    Set dict = Nothing
    

    之前: 后:

    请注意,自从我们在rowCount 为 1 时停止(假设有标题)时,第一行没有被触及。

    【讨论】:

    • 谢谢 - 我会再给这个另一个去。
    • 我没有...我会在这里粘贴我的代码,但我没有空间。实际上,我有一个 For next 循环反向进行。在其中,我将当前产品代码分配给一个变量,然后开始另一个与之前相同的 For Next 循环,只是这次我循环遍历列中其他代码的值并删除任何匹配项。这两个循环遍历这个唯一我现在的麻烦是循环删除了几乎所有代码,但三个(尽管有更多的唯一值)。卡住了……
    • 这可能是因为您用于迭代的计数器没有从行删除中正确更新。这就是为什么我建议使用字典方法。删除/插入行时,Do While 通常比For 好,因为您可能需要增加/减少两次以获得正确的偏移量。我的猜测是,当您返回外部 For 时,您的增量 var 将转到下一行,此时该行将为空(由于删除),并且要正确更新该 var,您需要使用While 因为For 总是将增量 var 重置为下一步。
    • 我已经用一些您可以修改的工作代码更新了我的答案。让我知道这是否能让你走上正确的道路。
    猜你喜欢
    • 1970-01-01
    • 2021-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-03
    • 2021-07-16
    • 2016-11-11
    • 2016-09-16
    相关资源
    最近更新 更多