我很难写一个过滤列表的宏。 我得到了一些结果,但不是我需要的结果。
这是描述我想要的一些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: 我可以看到示例代码由于间距而看起来很破碎。 我添加了一些字符以使间距看起来更好。
此处还有一个屏幕来说明该场景。 黄线是我想要使用上面的宏过滤的。
答案 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类型 - 我无法让它直接运行。当前版本迭代通过不再需要检查的单元格,因为迭代单元格左侧的单元格具有内容。我没有解决这个问题,因为我的用户现在很开心。