我想这很简单,但由于某种原因它似乎对我不起作用:(
我有以下代码,根据我指定的条件自动过滤数据:
Dim lastrow As Long
lastrow = Sheet2.Cells(Sheet2.Rows.Count, "A").End(xlUp).Row
With Sheet2
.AutoFilterMode = False
With .Range("A1:AF" & lastrow)
.AutoFilter
.AutoFilter Field:=7, Criteria1:="Yes", Operator:=xlFilterValues
End With
我现在要做的是删除所有不符合条件的未过滤(隐藏)行。
我到目前为止尝试过:
Sub RemoveHiddenRows
Dim oRow As Object
For Each oRow In Sheets("Sheet2").Rows
If oRow.Hidden Then oRow.Delete
Next
End Sub
但是这段代码的问题在于它只会删除连续隐藏行的每一行,因为即使删除了一行并且所有较低的行都向上移动了一行,每个行都会增加所考虑的行。
如果有可能的话,我更喜欢没有循环的东西,有点像.SpecialCells(xlCellTypeVisible).EntireRow.Delete
的相反
所有帮助将受到高度赞赏。
答案 0 :(得分:20)
所以我有点想摆脱未过滤数据,而不是试图扭转所有标准并删除可见细胞
我会用这个:
Sub RemoveHiddenRows()
Dim oRow As Range, rng As Range
Dim myRows As Range
With Sheets("Sheet3")
Set myRows = Intersect(.Range("A:A").EntireRow, .UsedRange)
If myRows Is Nothing Then Exit Sub
End With
For Each oRow In myRows.Columns(1).Cells
If oRow.EntireRow.Hidden Then
If rng Is Nothing Then
Set rng = oRow
Else
Set rng = Union(rng, oRow)
End If
End If
Next
If Not rng Is Nothing Then rng.EntireRow.Delete
End Sub
答案 1 :(得分:0)
我为过滤后的表使用了Dmitry Pavliv的解决方案,它可以工作(谢谢!),但会间歇出现错误:“删除范围类的方法失败”错误。
当仅删除一个隐藏行时,似乎发生了错误。唯一的隐藏行就在表标题的正下方,这可能有意义也可能不重要。
单步执行代码,rng指向正确的单元格,并仅显示单个单元格。使用表而不是命名范围可能是一个问题,尽管其他隐藏行以相同的表格式删除也很好。
在我修改了代码的最后一部分之后,宏运行良好 从这里:
If Not rng Is Nothing Then rng.EntireRow.Delete
对此:
If rng.Rows.Count = 1 Then
ws.Rows(rng.Row & ":" & rng.Row).Delete
ElseIf rng Is Nothing Then
rng.EntireRow.Delete
End If
由于某种原因,以这种格式删除该行是可行的。我不太确定为什么。 rng对象指向正确的单元格,我正在使用它来获取行号,因此不确定在rng.entirerow.delete语句中为什么它不起作用。那好吧。遇到许多帖子,但仍存在相同的错误,无法解决。