Excel VBA:根据条件删除整行

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" &

我有一个启用宏的工作表,它有三个工作表。如果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" & 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