Vba 在列中的每个单元格中查找特定内容,在某些情况下删除该行

Vba 在列中的每个单元格中查找特定内容,在某些情况下删除该行,vba,excel,Vba,Excel,我正试图把我们的电视台节目编排软件的输出结果,在给定的时间里,去掉任何东西。不幸的是,调度软件的输出为时间创建了一个文本字段,而不是一个可以格式化为时间的字段。我已经十多年没有做过任何真正的编程了,这让我很沮丧。下面是表格前几行的示例-每个月的每一天都包含从6:00a到第二天5:30a的每个程序的条目 到目前为止,我得到的代码是: Sub delete_extraneous() Dim rng As Range Dim j As Integer Dim m As Integer m = 1

我正试图把我们的电视台节目编排软件的输出结果,在给定的时间里,去掉任何东西。不幸的是,调度软件的输出为时间创建了一个文本字段,而不是一个可以格式化为时间的字段。我已经十多年没有做过任何真正的编程了,这让我很沮丧。下面是表格前几行的示例-每个月的每一天都包含从6:00a到第二天5:30a的每个程序的条目

到目前为止,我得到的代码是:

Sub delete_extraneous()

Dim rng As Range
Dim j As Integer
Dim m As Integer

m = 1
j = 3

Goto ActiveSheet.Cells(j, m)

With ActiveSheet
    lastRow = .Cells(.Rows.Count, "A").End(xlUp).Row
End With

For m = 1 To lastRow
    If rng = "6:30a" Or "7:00a" Or "7:30a" Or "8:00a" Or "8:30a" Or "9:00a" Or "9:30a" Or "10:00a" Or "10:30a" Or "11:00a" Or "11:30a" Then
        ActiveCell.EntireRow.Delete Shift:=xlShiftUp
    End If
Next m

End Sub

使用看起来像时间的文本数组并与之匹配

Sub delete_extraneous()
    dim tms as variant, lastRow as long

    tms = array("6:30a", "7:00a", "7:30a", "8:00a", "8:30a", "9:00a", "9:30a", _
                "10:00a", "10:30a", "11:00a", "11:30a")
    with activesheet
        lastRow = .Cells(.Rows.Count, "C").End(xlUp).Row

        For m = lastRow to 1 step-1
            If not iserror(application.match(.Cells(m, "C").value, tms, 0))  Then
                .rows(m).EntireRow.Delete Shift:=xlShiftUp
            End If
        Next m
        .
    end with
end sub

您没有说明代码中的具体问题,但我可以告诉您一些问题

1)这是无效语法
Goto-ActiveSheet.Cells(j,m)
。VBA中有一个
GoTo
语句,但仅在绝对必要时使用。(本案例不需要它)

2)不要依赖
ActiveSheet
。而是直接引用所选的工作表

3)您从来没有实际定义过
rng
,因此它毫无意义,您的代码将始终绕过范围。在模块顶部使用
选项Explicit
,有助于避免此问题

4)使用有源电池也很危险,可能会产生意外后果。在您的情况下,它会一次又一次地删除同一单元格,因为您从未激活任何其他单元格。不需要

请参见下面的代码。它还检查行删除,并在以后加载到一个delete语句的范围内(这将比逐行删除更快,并且不需要反向循环)

您可以使用Autofilter():


只是一个建议;录制宏以查找和替换“a”,然后在时间范围上进行筛选。复制并粘贴到新位置并删除原始数据。请注意,由于行删除,应在行背面循环,以捕获@tigeravatar.Great!我知道有比我开始做的更好的方法来实现这一点,但我没有时间用正确的方法重新学习。好的,我已经尝试了这三个答案中的每一个,它们都给了我错误。今天早上我试图找出答案,斯科特的答案挂在最后一行的下一行:deleteRng.EntireRow.Delete-Object variable或With block variable not set,但是deleteRng被设置为Range。Jeeped-Expected的答案是:在最后一行的第三行中,只包含一个句点的已识别或括号内的表达式。不知道它的用途是什么,但如果我把它去掉,什么也不会发生。最后一个答案是,使用autofilter在第6行给出了AutoFilterIt的子或函数未定义错误。看起来我的电子表格中存在固有问题。我从一个新的副本开始,斯科特的答案是我运行的第一个副本,它运行得完美无瑕。@TodPoirier-很高兴你让它运行起来。请将三个答案中的任何一个标记为已回答(单击答案左上角的灰色复选标记),以方便将来的读者。
Option Explicit

Sub delete_extraneous()

    Dim mySheet As Worksheet
    Set mySheet = Worksheets("mySheet") 'replace as needed

    Dim lastRow As Long
    lastRow = mySheet.Cells(mySheet.Rows.Count, 1).End(xlUp).Row

    Dim m As Long

    For m = 1 To lastRow

        Select Case mySheet.Cells(m, 3).Value 'check each row against column C

            Case Is = "6:30a", "7:00a", "7:30a", "8:00a", "8:30a", "9:00a", "9:30a", "10:00a", "10:30a", "11:00a", "11:30a"

                Dim deleteRng As Range
                If deleteRng Is Nothing Then
                    Set deleteRng = mySheet.Cells(m, 3)
                Else
                    Set deleteRng = Union(deleteRng, mySheet.Cells(m, 3))
                End If

        End Select

    Next

    deleteRng.EntireRow.Delete

End Sub
Sub test()
    Dim hours As Variant
    hours = Array("6:30a", "7:00a", "7:30a", "8:00a", "8:30a", "9:00a", "9:30a", "10:00a", "10:30a", "11:00a", "11:30a")

    With Range("C1", Cells(Rows.Count, 3).End(xlUp))
        .AutoFilter Field:=1, Criteria1:=hours, Operator:=xlFilterValues
        .Offset(1, 0).SpecialCells(xlCellTypeVisible).EntireRow.Delete
        If Not IsError(Application.Match(.Cells(1, 1).value, hours, 0))  Then .Rows(1).Delete
    End With
    ActiveSheet.AutoFilterMode = False
End Sub