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