2017-08-27 99 views
1

一系列最后可见行我写了下面什么是包含隐藏行和隐藏列

ThisWorkbook.Worksheets("Sheet1").Range("tblInsurance").SpecialCells(xlCellTypeVisible).Rows.Count 

到最后一行指出tblInsurance表。

我在方法参数传递ThisWorkbook.Worksheets("Sheet1").Range("tblInsurance")为:

General.CsvExportRange rngRange:=ThisWorkbook.Worksheets("Sheet1").Range("tblInsurance") 

CsvExportRange方法包含rngRange.Rows.Count线用于发现的范围内的最后一行。

但是当到达隐藏行时,它会停止计数并返回隐藏行之前的最后一行的编号。

当我以下使用方法:

ThisWorkbook.Worksheets("Sheet1").Range("tblInsurance").SpecialCells(xlCellTypeVisible).Select 

范围由围绕该范围内的可见区域分离的边界完全选择。

似乎问题出在.SpecialCells(xlCellTypeVisible).Rows.Count - >计数方法,它在到达隐藏行时停止计数。

我在阅读类似的帖子和网络讨论,但他们不包含上述主要问题。 (当范围包含隐藏行时,计算范围行以查找最后一行数。)

当我尝试计算包含一些隐藏列的范围列时,此问题与此类似 - 例如 - 到达最后一行一。

+0

不清楚....你是否想要最后一行**包含**数据或最后一行**包含可见数据** ?? –

+0

我希望**包含可见数据**的最后一行,所以我希望**所有可见行**的数量都在该范围内。请注意,范围包含一些隐藏的行。我需要数它们来找到范围的最后一个可见行。 – mgae2m

+0

'.SpecialCells'返回包含多个区域的范围。 '.SpecialCells(xlCellTypeVisible).Rows.Count'将返回范围的第一个区域中的行数。 – 2017-08-27 14:47:43

回答

1

这个问题很有趣。我从来没有想过这个问题。 试试这个:如果你需要知道的最后一个单元格的行号

Sub test() 
Dim rngDB As Range, rng As Range 
Dim n As Integer, c As Integer, cnt As Integer 

Set rngDB = ThisWorkbook.Worksheets("Sheet1").Range("tblInsurance").SpecialCells(xlCellTypeVisible) 
c = rngDB.Columns.Count 
For Each rng In rngDB 
    n = n + 1 
Next 
cnt = n/c 
MsgBox cnt 
End Sub 

,试试这个:

Sub test2() 
Dim rngDB As Range, rng As Range 
Dim n As Integer 
Set rngDB = ThisWorkbook.Worksheets("Sheet1").Range("tblInsurance").SpecialCells(xlCellTypeVisible) 
    n = rngDB.SpecialCells(xlCellTypeLastCell).Row 
    MsgBox "My last row number is : " & n 
End Sub 

我测试当然。

enter image description here

编辑 我明白你的问题。像这样尝试。

Sub test3() 
Dim rngDB As Range, rng As Range 
Dim n As Integer, r as Long, c as Integer 
Set rngDB = ThisWorkbook.Worksheets("Sheet1").Range("tblInsurance").SpecialCells(xlCellTypeVisible) 

    With rngDB 
     r = .Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row 
     C = .Find("*", SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Column 
     Set rng = Range("a1", .Cells(r, C)) 
    End With 

    MsgBox "My last row number is : " & r 
End Sub 
+0

假和远答案。 – mgae2m

+0

@MaeaeM,如果你想知道lastcell行号,我编辑我的代码。 –

+0

不幸的是,带有'xlCellTypeLastCell'枚举参数**的'SpecialCells'方法不能正确返回**。它会返回比最后一行范围的数字多9个数字。 – mgae2m

0

可悲的是.Count之间没有得到我们很多信息。假设我们只有一列,A1-A100,我们运行:

Sub dural() 
    Dim r As Range, r2 As Range 

    Set r = Range("A1:A100") 
    Set r2 = r.SpecialCells(xlCellTypeVisible) 

    MsgBox r2.Rows.Count 
End Sub 

,并在运行时,宏给了我们

所有你知道的是在表中的某个地方有4个可见的行。我们不知道哪些是可见的。我们也不知道这些可见行中是否包含数据或为空。

我们可以做的最好的就是循环遍历表,从底部开始。

当我们遇到一个既可见又非空的行时,停止并报告行号。

+0

我想在“Filtered Table”列表中找到最后一行。并使用'.Count'属性。所以正确的是:{**当我们在不可见(已过滤)或空行之前遇到最后一行时,停止并报告行号。**}如果您有从头到尾循环查看表的想法,请介绍一下。 – mgae2m

+0

以上答案用途是什么? – mgae2m

+0

@MaeaeM我将在今天晚些时候为您提供一些示例代码 –

2

您可以使用Range.end(xlup).row找到最后一个可见行;如果A1:A100包含数据而行A8:A100是隐藏的那么这段代码将显示7行

Sub lastvis() 
MsgBox Range("A1000").End(xlUp).Row 
End Sub 

,或者在使用表试试这个找到最后可见行。

Sub lastvis2() 
MsgBox Range("tblInsurance").End(xlDown).Row 
End Sub 
+0

这个创新的答案可以扩展,使用** Dy.Lee **(上面)的答案:'MsgBox givenRange.SpecialCells(xlCellTypeLastCell).End(XlUp).Row'在特殊情况下,范围的结束是结束“表”。但如果结束是在可见的表格行和波纹管之间存在一些过滤的行,那就不起作用了。所以在你的答案中,我们如何计算'A1000'的'1000'数字?! – mgae2m

+0

我无法接受你的创新答案,因为问题在于计算'A1000' !.可能给出的范围是Table之间,一些过滤(隐藏)行下和上和之间(当然列) – mgae2m