Excel VBA:根据条件删除整行
我有一个启用宏的工作表,它有三个工作表。如果F列中的值仅为sheet1中的“T”,我想删除整行。以下是我尝试的代码:Excel VBA:根据条件删除整行,excel,vba,Excel,Vba,我有一个启用宏的工作表,它有三个工作表。如果F列中的值仅为sheet1中的“T”,我想删除整行。以下是我尝试的代码: Sub RemoveRows() Dim i As Long Set ws = Sheets("Sheet1") lRow = ws.Range("F" & Rows.Count).End(xlUp).Row With ws For i = 2 To lRow If InStr(.Range("F" &
Sub RemoveRows()
Dim i As Long
Set ws = Sheets("Sheet1")
lRow = ws.Range("F" & Rows.Count).End(xlUp).Row
With ws
For i = 2 To lRow
If InStr(.Range("F" & i), "T") > 0 Then
ThisWorkbook.ActiveSheet.Range("F" & i).EntireRow.Delete
End If
Next i
End With
Application.ScreenUpdating = True
End Sub
它删除了行,但没有完全删除。尽管如此,我仍然可以看到F列中的值“T”。有人能指出代码中的错误吗?它将丢失一些紧靠在已删除的其他行下面的行。这就是为什么您应该像这样向后循环:
Sub-remoterows()
我想我会坚持多久
设置ws=图纸(“图纸1”)
lRow=ws.Range(“F”和Rows.Count).End(xlUp).Row
与ws
对于i=L,请转至第2步-1
如果仪表(.Range(“F”和“i)”,“T”)大于0,则
ws.Range(“F”&i).EntireRow.Delete
如果结束
接下来我
以
Application.ScreenUpdating=True
端接头
这对我来说只不过是一个小小的调整而已
Option Explicit ' Make your intentions known.
' Option Compare Binary ' Introduce case sensitivity (Optional)
Public Sub RemoveRows()
' Activate our worksheet
ThisWorkbook.Worksheets("Sheet1").Activate
Dim i as Long
Dim my_rng as Range
Set my_rng = Range("F2")
' We'll start at row 2 and go down to as many filled rows are in the column
For i = my_rng.Row to Cells(Rows.Count, my_rng.Column).End(xlUp).Row
With Range("F" & i)
' vbBinaryCompare to consider "T" vs "t"
If InStr(1, .Value, "T", vbBinaryCompare) > 0 Then
.EntireRow.Delete
End If
End with
Next i
' Clean up objects
Set my_rng = Nothing
End Sub
将循环与删除行组合在一起时总是很棘手的。在很多情况下,您可以通过使用过滤器来达到相同的目的——并整体删除所有行。第一个代码删除单个工作表(Sheet1)上的所有行,其中在列
F
中找到T
。第二个删除前3张图纸上的行
选项1-仅第一张
Sub RemoveRows1sheet()
With Sheet1.Cells(1, 1).CurrentRegion
.AutoFilter 6, "*T*" '<~~ Filter for any instance of "T" in column F (6)
.Offset(1).EntireRow.Delete '<~~ exclude headers & delete rows
.AutoFilter '<~~ turn off AutoFilter
End With
End Sub
Sub-removatorows1sheet()
带Sheet1.单元格(1,1).当前区域
.AutoFilter 6,“*T*”,这是因为当您删除一行时,VBA不知道i正被用作行索引。e、 g.如果我指向第5行,你删除了第4行,那么第5行变成了第4行,第6行变成了第5行,等等。但我不知道这一点,所以当你进入下一个语句时,我会增加到6,这意味着你跳过了第4行(以前是第5行)。这是VBA中非常常见的问题。您可以通过将循环从最高行号迭代到最低行号来避免此问题,这不会影响i与您认为它指向的行之间的关系。谢谢!但是我需要多次运行代码才能在工作表中看到结果。这是因为代码中有错误吗?我有点困惑:你试过我对代码的更正吗?您是否注意到i=2 to lRow的更改为For i=lRow to 2 Step-1的(在我的回答中)?是的,它删除了所有行,但在第一次运行时不会发生。我需要运行代码3或4次。请尝试将ThisWorkbook.ActiveSheet
更改为ws
。运行代码时,它可能不是活动工作表。非常感谢!这很有效。你还没有解决跳过某些行的问题。您可以向后循环,也可以向前循环(就像您所做的那样),您需要在if
语句中设置i=i-1
(在For
循环中不是很好)另一个小问题是您使用End(xlDown)的方式。行
假设列没有空单元格,“超对称”你说的“跳过一些行”是什么意思?我没有看到OP中有任何跳过行的要求,但我可能没有看到。假设F10和F11单元格都有“t”,那么让我们调用第10行行t
和第11行行e
(只是随机名称)。当i
=10时,您的代码将正确删除row\u t
,这意味着row\u e
立即变为第10行(即在i
更改下一次迭代之前)。当i
=11时,您的代码将检查行e
下面的行。因此,行e
被完全跳过。@超对称性Hi。谢谢,我更新了。我还更新了“T”和我原来的“F”
Option Explicit
Sub RemoveRows3sheets()
Dim LastRow As Long, i As Long '<~~ declare variables
LastRow = Cells(Rows.Count, 6).End(xlUp).Row '<~~ set the last row
With Sheet1.Cells(1, 1).CurrentRegion '<~~ apply the filter to sheet 1
.AutoFilter 6, "*T*"
End With
For i = LastRow To 2 Step -1
If Sheet1.Rows(i).Hidden Then
GoTo skip
Else
Sheet1.Cells(i, 1).EntireRow.Delete '<~~ delete this row number from each sheet
Sheet2.Cells(i, 1).EntireRow.Delete
Sheet3.Cells(i, 1).EntireRow.Delete
End If
skip:
Next i
Sheet1.AutoFilterMode = False '<~~ turn off the AutoFilter
End Sub