【问题标题】:Vba Code to Delete data based on a drop box choiceVba代码根据下拉框选择删除数据
【发布时间】:2017-09-03 19:21:46
【问题描述】:

I have a sheet that has a List box when that is selected codes appear.如果选择了代码,Excel 会将工作表中的数据(具有相同代码)复制到报价表中。

如果我在同一个列表框中进行更改并选择另一个代码,我需要 excel 去查找旧数据并在报价表中将其删除。

Public Sub delete_selected_rows()
    Dim rng1 As Range, rng2 As Range, rngToDel As Range, c As Range
    Dim lastRow As Long

    With Worksheets("Q")
        lastRow = .Cells(.Rows.Count, "B").End(xlUp).Row
        Set rng1 = .Range("B1:B" & lastRow)
    End With

    Set rng2 = Worksheets("SO").Range("D35")
    For Each c In rng1
        If Not IsError(Application.Match(c.Value, rng2, 0)) Then
            'if value from rng1 is found in rng2 then remember this cell for deleting
            If rngToDel Is Nothing Then
                Set rngToDel = c
            Else
                Set rngToDel = Union(rngToDel, c)
            End If
        End If
    Next c

    If Not rngToDel Is Nothing Then rngToDel.CurrentRegion.Delete
End Sub

如何让 CurrentRegion 计算删除的额外 30 行?

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    VBA 的 ISERROR 不会捕获 MATCH 工作表函数失败导致的错误。您需要以不同的方式构建该部分。

    Public Sub delete_selected_rows()
    
        Dim rng1 As Range, rng2 As Range, rngToDel As Range, c As Range
        Dim lastRow As Long
        Dim R As Long
    
        With Worksheets("Q")
            lastRow = .Cells(.Rows.Count, "B").End(xlUp).Row
            Set rng1 = .Range("B1:B" & lastRow)
        End With
    
        Set rng2 = Worksheets("SO").Range("D35")
        For Each c In rng1
            On Error Resume Next
            R = 0
            R = WorksheetFunction.Match(c.Value, rng2, 0)
            On Error GoTo 0
            If R Then
                'if value from rng1 is found in rng2 then remember this cell for deleting
                ' R is the row number in rng2 where a match was found
                ' since rng2 is a single cell, R would always be 1, if found
                ' If rng2 = D35 MATCH be an overkill. Why not simply compare?
            Else
                If rngToDel Is Nothing Then
                    Set rngToDel = c
                Else
                    Set rngToDel = Union(rngToDel, c)
                End If
            End If
        Next c
    
        If Not rngToDel Is Nothing Then rngToDel.CurrentRegion.Delete
    End Sub
    

    请注意我的 cmets 关于 rng2。会不会有什么错误? SO.D35 包含什么?如果它包含一串值,其中一个值可能是您要查找的值 MATCH 是错误的函数。

    您似乎打算将所有要删除的项目放在一个尖峰上,并在最后一口气删除它们。我不确定这是否可能,而且对我来说已经晚了。更常见的方法是一次删除一行,因为一旦删除一行,该行下方的所有行号都会更改。您可以在 ScreenUpdating 关闭的情况下运行整个代码,并在所有删除完成后设置 Application.ScreenUpdating = True

    【讨论】:

    • 谢谢 SO 是销售订单的工作表名称,D35 是一个列表框,其中选择了一个代码,我有代码用相同的代码查找工作表并将其粘贴到 Q 表中。在 SO 我有 D35 - D43 所有将内容复制到 Q 表的列表框。如果说 D35 因某种原因被更改,我需要将复制到 Q 的内容删除(大约 35 行)这些在 Q 表中一个接一个地复制。有什么办法可以把电子表格发给你。
    • 如果您将电子表格发送给我,那么我会做这项工作,您会帮助我。谢谢,但我更喜欢反过来。请继续负责。如有必要,开始一个新问题并将我放在“通知”中。
    • 我理解 D35 是 Worksheet("SO") 上的一个单元格。因此它不能是一个列表框。如果它是一个列表框,您可以通过它在 Worksheets("SO").Shapes 集合中的 ID 对其进行寻址。如果您在该表上有多个列表框,您最好明确且有意义地命名它们,然后像​​Worksheets("SO").Shapes("Item List") 一样引用它们。仅此一项就会将我上面的大部分代码放入垃圾中。但是,一旦您控制了列表框,您就可以查看它们与 Sheet("Q") 的关系和交互。
    猜你喜欢
    • 1970-01-01
    • 2014-08-28
    • 2013-09-14
    • 2021-04-14
    • 1970-01-01
    • 2016-09-03
    • 1970-01-01
    • 1970-01-01
    • 2015-04-21
    相关资源
    最近更新 更多