【问题标题】:Visual Basic Excel - Macro to delete rowVisual Basic Excel - 删除行的宏
【发布时间】:2012-04-25 22:15:44
【问题描述】:

我的文档中有 2 张纸(带有电话号码)。如果表 1 中存在该数字,我想从表 2 中删除该行。

我快到了(这是我第一次使用 VBA)。但是谁能帮我完成最后一部分。

Sub CleanList()

    Dim stopList As Range, cell1 As Range

    Set stopList = Sheet1.Range("A1:A10000")

    For Each cell1 In stopList
        Dim fullList As Range, cell2 As Range
        Set fullList = Sheet2.Range("A2:A10000")

        For Each cell2 In fullList
            If NumberFix(cell1.Value) = NumberFix(cell2.Value) Then
                cell2.EntireRow.Delete
            End If
        Next cell2
    Next cell1

End Sub

Private Function NumberFix(ByVal nr As String) As String

    If Not nr.StartsWith("46") Then
        nr = "46" + nr
    End If

    NumberFix = nr

End Function

【问题讨论】:

  • 您使用的是哪个版本的 Excel?你能澄清一下“最后一部分需要帮助”吗?您可能想看看ozgrid.com/VBA/RemoveDuplicates.htm,这是从范围中删除重复项的众多解决方案之一。
  • + 1 @ExternalUse:是的,高级过滤器是删除重复项的最快方法之一

标签: excel vba


【解决方案1】:

第一件事是您使用nr.StartsWith 的方式更具有VB.NET 风格。您在 VBA 中寻找的功能(可能不是 VB 脚本)是

Dim firstTwoChar As String
firstTwoChar = Mid(nr, 1, 2)

If Not firstTwoChar = "46" Then
    nr = "46" + nr
End If

NumberFix = nr

但即便如此,我还是要说,如果您要删除行,您不应该使用 for...each 迭代器。问题是当您删除第 5 行时,第 6 行变为第 5 行,而您转到的下一行是第“6”行,但实际上是原始列表中的第 7 行,有效地跳过了原始第 6 行。

你需要向后移动。类似的东西

Sub CleanList()

    Dim stopList As Range, cell1 As Range

    Set stopList = Sheet1.Range("A1:A10000")

    For Each cell1 In stopList
        Dim fullList As Range, cell2 As Range

        Dim firstRowSheet2 As Integer, lastRowSheet2 As Integer, r As Integer
        Dim sheet1sNumber As String
        sheet1sNumber = NumberFix(cell1.Value)   'you really only need to do this once 
                                                 so you may as well bring it out of
                                                 the for loop and store the value and 
                                                 not recalculate each time
        Dim cell2 As Range
        For r = firstRowSheet2 To lastRowSheet2 Step -1 
                         '"Step -1" allows you to move backwards through the loop
            With Sheet2
                Set cell2 = .Cells(r, 1)
                If sheet1sNumber = NumberFix(cell2.Value) Then
                        cell2.EntireRow.Delete
                    End If
            End With

        Next r

    Next cell1

End Sub

当然@ExternalUse 是对的。有很多内置选项可用于从列表中删除重复项。除非您正在尝试学习 VBA,否则这是一个很好的练习。

【讨论】:

  • 非常感谢布拉德。我为 for 循环添加了 Start 和 End 值。唯一缺少的东西。现在就像一个魅力。
猜你喜欢
  • 2015-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多