2017-02-20 1090 views
0

我有一个数据集,我正在使用过滤器。我只是想计算N列中可见的总值。数据从第2行开始,到第2047行结束。SpecialCells(xlCellTypeVisible)也包含隐藏/过滤的单元格

我看到了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 ...所以最起码,我得到正确的年底行,但不是起始行。

但是!如果我在立即窗口中键入Range("N2:N2047").SpecialCells(xlCellTypeVisible).Select,在宏的外面,它正确地选择可见单元格。还有一步,?Range("N2:N2047").SpecialCells(xlCellTypeVisible).address正确返回$N$901:$N$937

什么可能会出错?

编辑:我刚刚发现做=SUBTOTAL(9,N1:N2047)只会求和可见的单元格,所以我正在使用它。但我的问题仍然存在 - 为什么不是SpecialCells(xlCellTypeVisible)在宏中正常工作?

+0

功能正常工作对我来说。你如何隐藏你不想包含的行? (也许有一些有趣的事情正在进行,这意味着Excel不会认为'.Hidden'是'True'。) – YowE3K

+0

@ YowE3K - 我只是简单地使用过滤器。我有列中的数据,而且我正在根据列过滤出数据。我将行'2'过滤出来,并在立即窗口中执行'?行(2)。隐藏',正确返回'真'。我没有任何'Worksheet_Change'类型的事件,唯一的宏是我问的那个。 – BruceWayne

+0

我尝试手动隐藏行,并使用过滤器来隐藏行。这两种方法似乎都按预期工作。 – YowE3K

回答

1

尝试设置你的rng与下面的一行:

Set rng = Range("N2:N" & Cells(Rows.Count, "N").End(xlUp).Row).SpecialCells(xlCellTypeVisible) 

后来使用调试行Debug.Print rng.Address,我得到以下范围内立即窗口:

$N$901:$N$937 
+0

嗯,好主意,但我仍然得到'$ N $ 2:$ N $ 937' 。莫名其妙地是数据...?我没有做太多,只是在一列上过滤,没有什么“花哨”。我甚至完全限定了这个范围,使它在'Sheet1'上运行。有更多的信息。我可以给?当然,我可以发布一些样本数据,但我有一种感觉,这与我的WB相比,更多的是数据本身。 – BruceWayne

+0

@BruceWayne它与你的数据或结构有某种联系,我用不同的过滤范围进行了几次测试,结果很好。 J栏中有什么类型的格式? –

+0

列J被格式化为“Number”。 N列是'General',但它们实际上是数字。让我将它们格式化为数字,然后重试。编辑:啊哈,我把N列改成'Number',看起来好像在工作。 ...这很奇怪。为什么它不能和'General'一起使用? – BruceWayne