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

时间:2018-03-22 19:24:56

标签: excel vba excel-vba

我正在尝试将我们的调度软件的输出用于电视台,并在给定时间内删除任何内容。不幸的是,调度软件的输出为时间创建了一个文本字段,而不是一个可以按时间格式化的字段。十多年来我没有做过任何真正的编程,这让我很沮丧。以下是工作表前几行的示例 - 每月的每一天都包含每个程序的条目,从6:00a到第二天的5:30a。

enter image description here

我到目前为止的代码是:

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

3 个答案:

答案 0 :(得分:1)

使用与时间相似的文本数组并与之匹配。

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 :(得分:1)

您可以使用Autofilter():

   @receiver(pre_save, sender=Animal)
   def animal_create_update(sender,instance, **kwargs):
       print(instance.categories.all())

答案 2 :(得分:0)

您不会在代码中说明您的具体问题,但我可以告诉您一些问题。

1)这是无效的语法Goto ActiveSheet.Cells(j, m)。 VBA中有GoTo语句,但仅在绝对必要时使用。 (这种情况不需要它)。

2)不要依赖ActiveSheet。而是直接引用您想要使用的选定工作表。

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

4)使用活动细胞也很危险,可能会产生意想不到的后果。在您的情况下,它将一遍又一遍地删除相同的单元格,因为您从未激活任何其他单元格。它不需要。

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

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