Visual Basic删除重复项保持唯一

时间:2015-03-16 19:38:28

标签: excel-vba vba excel

尝试删除具有重复单元格内容的行并保留具有唯一值的行。例:

R1  A
R2  A
R3  B
R4  C
R5  C

在这种情况下,只有B是唯一的。 A和C都不是唯一的,因为它们不止一次出现。 (通过搜索找到的大多数解决方案都会错误地删除重复项,从而创建唯一值A& B.)

1 个答案:

答案 0 :(得分:0)

这不是一个只需要代码的好地方。如果你表现出努力,那么有人可能会告诉你如何解决你的问题。在不尝试调整代码的情况下查找与您需要的代码几乎完全相同的代码对于大多数人来说并不算是一种努力。

您需要设计解决方案,然后考虑如何将您找到的代码插入到该设计中。设计好的路线有很多,但我通常建议人们先问问自己:“我该如何手动完成?”

在您的示例列表中,行在目标列上排序。真实数据是真的,还是可以按目标列对实际数据进行排序?

如果数据未排序且无法排序,则问题变得更加困难,尽管并非不可能。在这种情况下,我建议:

  1. 找到数据右侧的空列。
  2. 使用行号填充该列。
  3. 按目标列排序。
  4. 删除重复项,如下所示。
  5. 按行号列
  6. 排序
  7. 删除行号列。
  8. 下面的算法假定行已排序。

    如果你要删除行,你可能会从顶部开始。这意味着每次删除某些行时,下面的每一行都必须向上移动,包括您稍后决定删除的所有行。从底部开始更快。我建议你做这样的事情:

    Set RowCrnt to number of bottom row
    Do While RowCrnt > 1
      If target column of RowCrnt is equal to target column of RowCrnt-1 Then
        ‘ Have found the bottom row of a block to be deleted
        Set RowBlockBottom = RowCrnt
        RowCrnt = RowCrnt - 1
        Do While target column of RowCrnt is equal to target column of RowBlockBottom
          RowCrnt = RowCrnt - 1
        Loop
        Delete rows RowCrnt + 1 to RowBlockBottom
        ‘ RowCrnt points at the next row to be matched against the row above
      Else
        RowCrnt = RowCrnt - 1
      End If
    Loop
    

    尝试在纸上“运行”上面的伪代码。想想我是如何制作这段代码的。寻找任何故意或意外错误。这是一种简单的设计技术,适用于大多数简单问题。如果你能掌握这项技术,你将准备好在不需要帮助的情况下解决许多未来的问题。

    我希望您找到的代码将包含将在上面的伪代码中执行所有操作的语句。尝试使用相关语句替换伪代码来构建所需的宏。 在测试宏之前,请不要忘记保存数据副本。

    如果代码无法按照您的要求运行而您无法理解原因,请在此处发布,并说明其执行的操作与您希望执行的操作之间的差异。有人会帮忙的。

    祝你好运。