【问题标题】:Delete Rows With Duplicate Data VBA删除具有重复数据 VBA 的行
【发布时间】:2014-07-12 06:41:30
【问题描述】:

我正在努力解决应该相当简单的事情,但是,我已经阅读了至少 15 种方法,但似乎无法让它发挥作用。

这是一个示例数据集:

9:30:01 584.7
9:30:01 590
9:30:01 595
9:30:02 584.51
9:30:03 584.62
9:30:04 584.44
9:30:05 584.05

我只想要每秒一排,所以前三排中,只需要留下一排。我不在乎它是第一个还是最后一个,但我一直使用的代码保持最后一个,在这种情况下为 595。

我这样做的方式是使用一个 for 循环来清除与它下面的行具有相同时间的行的内容。然后我对整个范围进行排序。

我想有一种更简单的方法可以从一开始就删除多余的行。但是,当我在范围上使用删除而不是清除时,它不会删除所有重复的行。

这是我希望数据的样子:

9:30:01 595
9:30:02 584.51
9:30:03 584.62
9:30:04 584.44
9:30:05 584.05

我需要对整个工作表进行此操作。时间是 B 列,值是 C 列。

这是我正在使用的代码,

LastRow = ActiveSheet.UsedRange.row - 1 + _
    ActiveSheet.UsedRange.Rows.Count

For RowNum = 2 To LastRow
    If (Range("B" & RowNum) = Range("B" & RowNum + 1)) Then
    Range("B" & RowNum).EntireRow.Clear
    End If
Next RowNum

Range("A2:C" & LastRow).Sort key1:=Range("B2:B" & LastRow), _
order1:=xlAscending, Header:=xlNo

【问题讨论】:

  • 如果自下而上循环,则可以立即删除该行。分享你的代码,我会帮你解决的。
  • @PortlandRunner 提供了一个很好的解决方案——您也可以为此使用 Range.RemoveDuplicates 方法(特别是因为您的列结构定义如此明确)......这是一个 MSDN 参考:msdn.microsoft.com/en-us/library/office/…
  • @Portland Runner 我已经添加了代码。你的想法听起来很聪明。

标签: vba excel duplicate-removal


【解决方案1】:

不要循环。使用删除重复项。比任何循环都快。一行代码。

Sub test()
    ActiveSheet.Range("B:C").RemoveDuplicates Columns:=1, Header:=xlNo
End Sub

编辑:截图

之前

之后

编辑:在 Excel 2011 for Mac 中不起作用(如图)。

【讨论】:

  • 这仅在两列中的值重复时才有效。它不会仅根据 9:30:01 重复这一事实来删除行。
  • @user2926358 我添加了一些屏幕截图并将代码修改为 B 和 C 列而不是 A 和 B
  • @teylyn 这有可能在 Mac 上不起作用吗?我正在运行 Excel 2011 并且没有骰子。我在我的旧电脑上运行它,它工作正常。谢谢。
  • 你从来没有提到过 Mac。我不做麦克。数据功能区是否有“删除重复项”图标?
  • 这个解决方案也是+1。但是上面的评论是 +1 for 循环,它们总是可以工作(即使在 Mac 上 ;-))
【解决方案2】:

这应该可以解决问题:

Sub jzz()
Dim i As Long
For i = 1 To Cells.SpecialCells(xlLastCell).Row 'loop from row 1 to last row
    If Cells(i, 1) <> vbNullString Then 'check if something is in the cell
        If Cells(i, 1) = Cells(i + 1, 1) Then 'check if cell is the same as next cell
            Cells(i + 1, 1).EntireRow.Delete 'if so; delete
            i = i - 1 'go back one row
        End If
    End If
Next i
End Sub

另一种选择是自下而上,如下所示:

Sub jzz()
Dim i As Long
For i = Cells.SpecialCells(xlLastCell).Row to 1 step -1'loop from last row to row 1
    If Cells(i, 1) <> vbNullString Then 'check if something is in the cell
        If Cells(i, 1) = Cells(i + 1, 1) Then 'check if cell is the same as next cell
            Cells(i + 1, 1).EntireRow.Delete 'if so; delete
        End If
    End If
Next i
End Sub

如果是个人,您更喜欢使用什么。也请考虑一下 teylyn 的回答,在这种情况下,它是非常有用的。

【讨论】:

  • 谢谢爵士。我有这样的东西,它只删除第二个项目并留下第三个。
  • 对不起,我的错!只是忘记了一行(关键)代码。我编辑了我的答案。诀窍是在删除它下面的行后返回一行,以便再次评估该值。
  • Jzz,这就行了!我可以赌很多钱,我试过这个确切的东西,但它没有用。我明天将在完整的数据集上运行它,希望它能做到。再次感谢。
  • 啊,我的意思是:For i = Cells.SpecialCells(xlLastCell).Row to 1 Step -1 但是你必须改变一些其他的东西。
  • for 循环从底部开始的正确步骤是什么?我似乎无法让它工作。 (VBA 新手,我知道)
猜你喜欢
  • 2016-12-08
  • 1970-01-01
  • 2019-03-28
  • 1970-01-01
  • 2013-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多