删除循环需要多次运行才能删除满足条件的所有行

我有一个msgbox让用户input一个值。 我的工作簿然后在名为“值”的另一个工作表中查找值。 在大多数情况下,该表中有多个此值的实例。

然后从该行(ID)中取出另一个值,并在第三个名为“Req Raw”的表格中使用格式“[InputValue] [ID]”进行查找,其中ID是格式为“0000”的数字string。

然后,工作簿将删除“需求原始”和“值”中的该行并重复; 继续在“值”中查找input值。

'SecDelete = Input Value 'VSect = Range in sheet 'Values' 'RReq = Range in sheet 'Req Raw' With ThisWorkBook.Worksheets("Values") For Each VSecT In .Range(.Cells(.Cells(Rows.count, 2).End(xlUp).Row, 2), .Cells(15, 2)) If LCase(VSecT.Value) = LCase(SecDelete) Then 'Identify ID IDF = CStr(VSecT.Offset(columnOffset:=3).Value) IDF = Format(IDF, "0000") 'Find offset ID in 'Req Raw' For Each RReq In ThisWorkbook.Worksheets("Req Raw").Range(ThisWorkbook.Worksheets("Req Raw").Cells(ThisWorkbook.Worksheets("Req Raw").Cells(Rows.count, 1).End(xlUp).Row, 1), _ ThisWorkbook.Worksheets("Req Raw").Cells(2, 1)) If RReq.Value = VSecT.Value & " " & IDF Then 'Delete from 'Req Raw' RReq.EntireRow.Delete Exit For End If Next RReq 'Delete from 'Values' VSecT.EntireRow.Delete End If Next VSecT End With 

我发现,由于某种原因,随机数的行被删除,而不是所有的input值。

例如,如果我的input值是“testing1.0”,并且“值”表中有10个实例存在“testing1.0”,并且对应的ID为0000,0001,0002,… 0010,则只有一些行将被删除,每次我运行子。 在“Test 1.0”的所有行被删除之前,我必须运行子7-8次。

请注意,我在For Each语句中向后循环。

这里是你的代码的一部分重写,以适应在行后退。 请注意,我也调整了string连接。

 Dim rw1 As Long, rw2 As Long With ThisWorkbook.Worksheets("Values") For rw1 = .Cells(Rows.Count, 2).End(xlUp).Row To 15 Step -1 If LCase(VSecT.Value) = LCase(SecDelete) Then 'Identify ID IDF = .Cells(rw1, 2).Value & Format(.Cells(rw1, 2).Offset(columnOffset:=3).Value, " 0000") 'Find offset ID in 'Req Raw' With ThisWorkbook.Worksheets("Req Raw") For rw2 = .Cells(Rows.Count, 1).End(xlUp).Row To 2 Step -1 If .Cells(rw2, 1).Value = IDF Then 'Delete from 'Req Raw' .Rows(rw2).EntireRow.Delete Exit For End If Next RReq End With 'Delete from 'Values' .Rows(rw1).EntireRow.Delete End If Next rw1 End With 

简而言之,您可以将范围定义为.Range("A10:A1")但是如果您使用For Each / Next来遍历单元格,则您仍将通过A1,A2,A3 …. A10进度。 步骤-1中的数字行数是通过数据集向后工作的最佳(仅…?)方式。

背后的原因是我相信单元格地址。 如果你循环通过范围,如a1到a10像这样

 range("a1:a10").select for each cell in selection if cell.value = something then cell.entirerow.delete end if next cell 

它是类似于你的代码,所以当第2行被删除时会发生什么? 所有的单元格向上移动,所以下一次运行的macros将跳过地址A2(实际上在删除之前是A3),因为循环已经通过了它。 在algorythm中有一个洞,你需要的是每次macros删除一行时返回一行,所以你需要像这样重buildmacros(对于我的例子):

 for i = 1 to 10 if range("a" & i ).value = something range("a" & i).entirerow.delete i = i - 1 next i ' so that each time something is deleted loop steps backward to catch shifted value 

希望这有助于,欢呼

当我不得不从一个集合范围中删除行时,我在混合If语句来search将被删除的行时所做的操作是,例如,改变给定列中的单元格的值(我知道它总是有值)空白。 然后使用specialcells空白我select所有新的空白单元格,然后删除整个行。

我不喜欢在循环中删除,这段代码将构build一个范围引用(Rng),并在最后一次删除所有行。

 Sub DeleteBlanks() Dim Rng As Range, X As Long For X = 1 To Range("A" & Rows.Count).End(xlUp).Row If Range("A" & X).Text = "" Then If Rng Is Nothing Then 'This has to be in here because you can't union a range if it is currently nothing Set Rng = Range("A" & X) Else Set Rng = Union(Rng, Range("A" & X)) End If End If Next If Not Rng Is Nothing Then Rng.Rows.Delete 'If no blanks are found, this will stop it erroring. Only delete when there is something in Rng End Sub