根据多列中的内容过滤行

时间:2013-05-17 10:18:26

标签: excel vba excel-vba autofilter

我很难写一个过滤列表的宏。 我得到了一些结果,但不是我需要的结果。

这是描述我想要的一些speudocode。

Sub Filter1()
____Dim listOfRows As VBA.Collection
____Dim markForRemoval As VBA.Collection
____Dim row, column As Range
____Dim cell As Range
____
____Set listOfRows = New VBA.Collection
____Set markForRemoval = New VBA.Collection
____
____For Each row In F_RangeOfInterest()
________listOfRows.Add (row)
____Next

____For Each column In ActiveSheet.UsedRange.Columns
________If column.column > 2 Then
____________For Each row In listOfRows
____________Set cell F_GetCellFromIntersection( row, column )
________If true = F_CellHasContent(cell)
____________markForRemoval.Add (row)
________End If
________Next
________listOfRows = F_RemoveMarkes(listOfRows, markForRemoval)
____End If
____Next

____Application.ScreenUpdating = False
____For Each row In listOfRows
________row.hidden = true;
____Next
____Application.ScreenUpdating = True
End Sub

我在VBA中无法实现某些功能。 你能帮我解决这个问题吗?


编辑#1: 我试图实现的目标有些混乱,所以我增强了伪代码。


编辑#2: 我可以看到示例代码由于间距而看起来很破碎。 我添加了一些字符以使间距看起来更好。

此处还有一个屏幕来说明该场景。 黄线是我想要使用上面的宏过滤的。 Screen to illustrate problem

1 个答案:

答案 0 :(得分:0)

这是我的问题的解决方案:

Sub Filter()
____Dim rangeOfInterest, cell, row As range
____Dim hidden() As Boolean
____Dim I, IMAX, OFFSET As Integer
____
____Set rangeOfInterest = F_GetRangeOfInterest()
____IMAX = rangeOfInterest.Rows.Count
____OFFSET = rangeOfInterest.row - 1
____
____ReDim hidden(IMAX)
____For I = 1 To IMAX
________hidden(I) = True
____Next I

____For Each cell In rangeOfInterest
________If cell.FormulaR1C1 <> "" Then
____________hidden(cell.row - OFFSET) = False
________End If
____Next

____Application.ScreenUpdating = False
____For Each row In rangeOfInterest.Rows
________row.hidden = hidden(row.row - OFFSET)
____Next
____Application.ScreenUpdating = True

End Sub

算法有点浪费但我无法实现问题中陈述的想法。 Collection表现得好像它将任何东西转换为Variant类型 - 我无法让它直接运行。当前版本迭代通过不再需要检查的单元格,因为迭代单元格左侧的单元格具有内容。我没有解决这个问题,因为我的用户现在很开心。