【发布时间】:2015-12-03 10:24:16
【问题描述】:
在包含数据的工作表中,有一列应用了过滤器来限制显示的数据。用户在一列中选择 1 个或多个单元格(不一定是连续的)并执行 VBA 代码。 在 VBA 代码中,我想遍历选定的单元格并对它们进行一些操作,但是当只选择 1 个单元格时(在 Excel 术语中是活动的),Excel 的行为会有所不同。有效的代码:
Sub Macro1()
If Selection.count = 1 Then
counter = 1
Debug.Print Selection.Text
Else
counter = Selection.SpecialCells(xlCellTypeVisible).count
For Each c In Selection.SpecialCells(xlCellTypeVisible)
Debug.Print c.Text
Next c
End If
Debug.Print counter
End Sub
问题: 有没有办法,更优雅,更干净的解决方案来做到这一点?摆脱 If-Then?
Selection.SpecialCells(xlCellTypeVisible).count
如果只激活一个单元格会产生溢出错误(我认为 Excel 会将选择扩展到整个工作表)
ActiveCell.Select
Selection.SpecialCells(xlCellTypeVisible).count
如果只选择了一个单元格,则返回 2(返回选择的记录两次)
编辑 请注意:过滤器由用户手动应用,而不是由 VBA 代码应用。用户还可以从过滤视图中手动选择单元格,然后在 VBA 代码中使用选定的单元格。
【问题讨论】:
-
所以....您正在从可见标题中移出一行并调整范围以使用
.Rows.Count-1...进行处理?然后查看单个列...?尽量避免将Selection作为确定要处理的范围的手段。无论如何,应该是Selection.SpecialCells(xlCellTypeVisible).Count而不是Selection.Count。 -
否,用户在过滤表中选择了 1 到多个单元格。该选择是宏必须使用的。标题在这里并不重要。正如我写的,Selection.SpecialCells(xlCellTypeVisible).Count 如果用户只选择了一条记录就不起作用。