【问题标题】:Delete a row in Excel VBA在 Excel VBA 中删除一行
【发布时间】:2011-12-12 16:54:49
【问题描述】:

我有这段代码从列表中查找项目的 excel 行并从列表中删除项目。我想要的......也是删除 Excel 行。

代码在这里

Private Sub imperecheaza_Click()
Dim ws As Worksheet
Dim Rand As Long
Set ws = Worksheets("BD_IR")    
Rand = 3
Do While ws.Cells(Rand, 4).Value <> "" And Rand < 65000
   If ws.Cells(Rand, 4).Value = gksluri.Value * 1 And ws.Cells(Rand, 5).Value = gksluri.List(gksluri.ListIndex, 1) * 1 Then
            ws.Range(Rand, 1).EntireRow.Delete '(here I want to delete the entire row that meets the criteria from the If statement)
            gksluri.RemoveItem gksluri.ListIndex
            Exit Do
    End If
Rand = Rand + 1
Loop
End Sub

我添加 ws.Range(Rand,1).EntireRow.Delete 的地方是我想删除整行但我不知道该怎么做的地方。我想要什么...如果它在单元格中找到相同的值,例如在我的列表的某些选定项目中,以便能够删除 excel 中的整行和列表框中的项目。它可以从列表框中删除项目,但我也不知道如何删除该行

【问题讨论】:

  • 警告。如果您在循环中删除多行(从上到下运行),请确保您反转循环,从下到上。否则,您的循环将跳过您删除的行之后的行。通过从底部到顶部更改循环,您将防止这种情况发生(代价是在每个删除的行之后进行双重检查)。
  • 也可以通过将 if 语句设置为仅在未删除行时递增来避免这种跳过。
  • @Wayne,绝对正确!最终“条条大路通罗马”。当有许多行需要删除时,您的解决方案会更优雅并且会更快。我主要担心的是人们在浏览文件和删除行时会意识到跳过行的问题。

标签: excel vba


【解决方案1】:

这样的事情可以做到:

Rows("12:12").Select
Selection.Delete

所以在你的代码中它看起来像这样:

Rows(CStr(rand) & ":" & CStr(rand)).Select
Selection.Delete

【讨论】:

  • 谢谢...我收到 Shift:=xlUp 的错误(预期:语句结束)
  • @andrei 您可以删除 Shift:=xlUp。 - 我已将代码编辑为对 VBA 友好(感谢匿名投票者)
  • 请注意,在对它们进行操作之前选择单元格、范围、行等比直接对它们进行操作要慢得多。
【解决方案2】:

换行

ws.Range(Rand, 1).EntireRow.Delete

ws.Cells(Rand, 1).EntireRow.Delete 

【讨论】:

    【解决方案3】:

    Chris Nielsen 的解决方案很简单,而且效果很好。一个稍微短一点的选择是......

    ws.Rows(Rand).Delete
    

    ...请注意,删除行时无需指定 Shift,因为根据定义,不可能向左移动

    顺便说一句,我删除行的首选方法是使用...

    ws.Rows(Rand) = ""
    

    ...在初始循环中。然后我使用排序函数将这些行推到数据的底部。这样做的主要原因是因为删除单行可能是一个非常缓慢的过程(如果您要删除 >100)。根据 Robert Ilbrink 的评论,它还确保不会遗漏任何内容

    您可以通过录制宏并减少代码来学习排序代码,如expert Excel video 中所示。我怀疑最简洁的方法 (Range("A1:Z10").Sort Key1:=Range("A1"), Order1:=xlSortAscending/Descending, Header:=xlYes/No) 只能在预先发现2007 版本的 Excel...但您始终可以减少 2007/2010 等效代码

    加上更多点...如果您的列表尚未按列排序并且您希望保留顺序,则可以在循环时将行号“Rand”粘贴在每行右侧的备用列中.然后,您将按该评论排序并删除它

    如果您的数据行包含格式,您可能希望找到新数据范围的末尾并删除您之前清除的行。那是为了减小文件大小。请注意,过程结束时的单个大删除不会像删除单行那样损害代码的性能

    【讨论】:

    • 在 excel vba 中,.delete 是否优于 .rows()='' 以截断单元格?哪个更快?
    【解决方案4】:

    更好的是,使用联合来获取您要删除的所有行,然后一次将它们全部删除。行不必是连续的。

    dim rng as range
    dim rDel as range
    
    for each rng in {the range you're searching}
       if {Conditions to be met} = true then
          if not rDel is nothing then
             set rDel = union(rng,rDel)
          else
             set rDel = rng
          end if
       end if
     next
     
     rDel.entirerow.delete
    

    这样您就不必担心排序或底部的东西。

    【讨论】:

    • 我认为这是一个更正 - '如果不是 rng 什么都不是'应该是'如果不是 rdel 什么都不是'?尽管如此,感谢您的回答 - 到目前为止,我查看过的几个最简单的实现。
    猜你喜欢
    • 1970-01-01
    • 2018-02-21
    • 2012-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-08
    • 1970-01-01
    相关资源
    最近更新 更多