0

我被困在编写一个过滤列表的宏。我得到了一些结果,但不是我需要的。

这是一些描述我想要的伪代码。

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:我可以看到示例代码由于间距而看起来被破坏了。我添加了一些字符以使间距看起来更好。

这里还有一个屏幕来说明场景。黄线是我想使用上面的宏过滤的那些。 说明问题的屏幕

4

1 回答 1

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 类型 - 我只是无法让它正确运行。当前版本迭代显然不再需要检查的单元格,因为迭代单元格左侧的单元格具有内容。我没有解决这个问题,因为我的用户对现在的方式很满意。

于 2013-05-21T13:41:27.910 回答