在Excel VBA中删除一行
我有这段代码,它从列表中find一个项目的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是我想要删除整行的地方,但我不知道该怎么做。 我想要什么…如果它在单元格中find相同的值,就像我的列表中的某些选定项目一样,可以删除Excel中的整个行和列表框中的项目。 它工作从列表框中删除项目,但我不知道如何删除该行以及
克里斯·尼尔森的解决scheme很简单,而且工作得很好。 稍微短一点的select是…
ws.Rows(Rand).Delete
…注意,删除一行时不需要指定Shift,因为根据定义,不可能向左移动
顺便说一句,我的首选删除行的方法是使用…
ws.Rows(Rand) = ""
…在最初的循环。 然后我使用Sort函数将这些行推送到数据的底部。 主要原因是因为删除单行可能是一个非常慢的过程(如果您要删除> 100)。 根据罗伯特·伊尔布林克(Robert Ilbrink)的评论,这也确保不会有任何遗漏
你可以通过录制一个macros来学习sorting的代码,并减less这个专家的Excelvideo中显示的代码。 我有一个怀疑,最简单的方法(范围(“A1:Z10”)。sortingKey1:=范围(“A1”),Order1:= xlSortAscending / Descending,头:= xlYes /否) 2007年版本的Excel …但您始终可以减less2007/2010年的等效代码
多结合点…如果您的列表尚未按列sorting,而您希望保留该订单,您可以在行循环时将行号“兰德”保留在每行右侧的备用列中。 然后你会根据这个评论来sorting并消除它
如果数据行包含格式,则可能希望查找新数据范围的末尾,并删除先前清除的行。 这是为了保持文件的大小。 请注意,在过程结束时进行一次大的删除操作不会像删除单行一样损害代码的性能
警告。
如果删除循环中的多行(从顶部到底部),请确保从底部到顶部颠倒循环。
否则,你的循环会跳过你删除的那一行。 通过从下到上改变循环,您将防止这种情况发生(以每个删除行之后的双重检查为代价)。
更好的办法是,使用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 rng is nothing then set rDel = union(rng,rDel) else set rDel = rng end if end if next rDel.entirerow.delete
这样你就不必担心sorting或者底层的事情。
改变你的路线
ws.Range(Rand, 1).EntireRow.Delete
至
ws.Cells(Rand, 1).EntireRow.Delete
像这样的事情会做到这一点:
Rows("12:12").Select Selection.Delete
所以在你的代码中看起来像这样:
Rows(CStr(rand) & ":" & CStr(rand)).Select Selection.Delete