【发布时间】:2017-12-06 06:15:39
【问题描述】:
我有一个正在使用过滤器的数据集。我只是想计算 N 列中可见的总值。数据从第 2 行开始,到第 2047 行结束。
我看到了this thread,但它给了我同样类型的问题。
这是我的功能:
Function sumVisible() As String
Dim rng As Range
Set rng = Range("N2:N2047").SpecialCells(xlCellTypeVisible)
' Debug.Print "Range: " & rng.Address & ", Sum: " & WorksheetFunction.Sum(rng)
sumVisible = Format(WorksheetFunction.Sum(rng), "$#,###.##")
End Function
使用我当前的过滤器,我的标题行 (1) 是可见的,行 901 到 937 也是可见的。所以,我想总结 N901:N937。
但是,rng 一直设置为 $N$2:$N$2047。我希望它是$N$901:$N$937。
使用提供给我上面链接的线程的函数,我得到$N$2:$N$937 的范围...所以至少,我得到了正确的 end 行,但不是起始行。
但是!如果我在宏之外的即时窗口中键入Range("N2:N2047").SpecialCells(xlCellTypeVisible).Select,它会正确选择可见单元格。更进一步,正确执行?Range("N2:N2047").SpecialCells(xlCellTypeVisible).address 会返回$N$901:$N$937。
可能出了什么问题?
编辑:我刚刚发现=SUBTOTAL(9,N1:N2047) 只会对可见单元格求和,所以我正在使用它。但我的问题仍然存在 - 为什么 SpecialCells(xlCellTypeVisible) 在宏中不能正常工作?
【问题讨论】:
-
该功能对我来说可以正常工作。您如何隐藏不想包含的行? (也许正在做的事情有些有趣,这意味着 Excel 不会认为
.Hidden是True。) -
@YowE3K - 我只是在使用过滤器。我在列中有数据,并且我正在根据列过滤掉数据。我过滤掉了行
2,并且在即时窗口中执行?Rows(2).Hidden正确返回True。我也没有任何Worksheet_Change类型的事件,唯一的宏就是我要问的那个。 -
我尝试手动隐藏行,并使用过滤器隐藏行。这两种方法似乎都按预期工作。
-
@YowE3K - 看起来我的列 N 格式化为
General。我更改为Number,现在它按预期工作。耶! ...但我仍然想知道,为什么格式很重要?如果我在那里有文本并想对文本做点什么怎么办?如果我只想要可见的单元格,为什么格式对 VBA 很重要?还是只是 VBA 的一个怪癖? -
这是否意味着我们必须将问题关闭为“无法复制”? :D