Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Excel VBA中删除一行_Excel_Vba - Fatal编程技术网

在Excel VBA中删除一行

在Excel VBA中删除一行,excel,vba,Excel,Vba,我有一段代码,它从列表中查找项目的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(

我有一段代码,它从列表中查找项目的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
Private Sub-imperecheaza_Click()
将ws设置为工作表
暗淡如长
设置ws=工作表(“BD_IR”)
兰德=3
当ws.Cells(Rand,4.Value)为“”且Rand<65000时执行
如果ws.Cells(Rand,4).Value=gksluri.Value*1,ws.Cells(Rand,5).Value=gksluri.List(gksluri.ListIndex,1)*1,则
ws.Range(Rand,1).EntireRow.Delete'(这里我想从If语句中删除满足条件的整行)
gksluri.removietem gksluri.ListIndex
退出Do
如果结束
兰德=兰德+1
环
端接头

我在其中添加了ws.Range(Rand,1)。EntireRow.Delete是我想要删除整行的地方,但我不知道如何删除。我想要的。。。如果它在单元格中找到相同的值,例如在我的列表的某个选定项中,则可以删除excel中的整行以及列表框中的项目。它可以从列表框中删除项目,但我不知道如何删除行

Rows("12:12").Select
Selection.Delete
因此,在您的代码中,它看起来像这样:

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

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


克里斯·尼尔森(Chris Nielsen)的解决方案很简单,而且效果很好。稍微短一点的选项是

ws.Rows(Rand).Delete
…注意:删除行时不需要指定移位,因为根据定义,不可能向左移位

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

ws.Rows(Rand) = ""
…在初始循环中。然后,我使用排序函数将这些行推送到数据的底部。这样做的主要原因是删除单行可能是一个非常缓慢的过程(如果删除>100)。根据罗伯特·伊尔布林克(Robert Ilbrink)的评论,这也确保了不会遗漏任何东西

您可以通过录制宏并减少代码来学习排序代码,如本文所示。我怀疑最新的方法(范围(“A1:Z10”)。排序键1:=范围(“A1”)、顺序1:=xlSortAscending/降序、标题:=xlYes/否)只能在2007年以前版本的Excel上发现……但您可以始终减少2007/2010等效代码

还有几点……如果您的列表尚未按列排序,并且希望保留顺序,则可以在循环时将行号“Rand”粘贴在每行右侧的备用列中。然后,您将根据该评论进行排序并删除它


如果数据行包含格式,您可能希望找到新数据范围的结尾,并删除先前清除的行。这是为了减小文件大小。请注意,在过程结束时执行一次大的删除不会影响代码的性能,就像删除单行一样。

但是,使用union获取所有要删除的行,然后立即将它们全部删除。行不必是连续的

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

这样,您就不必担心排序问题,也不必担心事情处于底部。

谢谢。。。我得到一个移位错误(预期:语句结束):=xlUp@andrei您只需删除移位:=xlUp。-我已经将代码编辑为VBA友好型(感谢匿名downvoter)注意,在对单元格、范围、行等进行操作之前,选择它们要比直接对它们进行操作慢得多。警告。如果删除循环中的多行(从上到下),请确保从下到上反转循环。否则,循环将跳过删除的行之后的行。通过将循环从下到上进行更改,可以防止这种情况发生(每删除一行后都要进行双重检查)。通过将if语句设置为仅在未删除行时递增,也可以避免这种跳过。@Wayne,绝对正确!最终“条条大路通罗马”。当有许多行需要删除时,您的解决方案更优雅,速度更快。我主要担心的是,人们在浏览文件和删除行时会意识到跳过行的问题。我认为这是一个更正-“if not rng is nothing”应该是“if not rdel is nothing”?尽管如此,还是要感谢您的回答——这是我看过的几个答案中最简单的一个。
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