【问题标题】:what is last visible row in a range that contain hidden rows and hidden columns包含隐藏行和隐藏列的范围中的最后一个可见行是什么
【发布时间】:2017-08-27 12:36:49
【问题描述】:

我写在下面

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->count 方法中,该方法在到达隐藏行时停止计数。

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

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

【问题讨论】:

  • Unclear....你想要包含数据的最后一行还是包含可见数据的最后一行??
  • 我想要包含可见数据的最后一行,所以我希望所有可见行的计数都在该范围内。请注意,范围包含一些隐藏的行。我需要计算它们以找到范围的最后一个可见行。
  • .SpecialCells 正在返回一个包含多个区域的范围。 .SpecialCells(xlCellTypeVisible).Rows.Count 将返回范围的第一个区域中的行数。
  • 当然是这个问题。我想要范围内所有区域的行数。

标签: vba excel


【解决方案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

我当然测试过。

编辑 我理解你的问题。试试这样。

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

【讨论】:

  • 错误而遥远的答案。
  • @MGae2M,如果你想知道 lastcell 的行号,我编辑我的代码。
  • 不幸的是,带有xlCellTypeLastCell 枚举参数的SpecialCells 方法不能正确返回。它返回的数字比范围的最后一行多 9 个。
  • 问题是,当我们在您的示例中使用低于Row11Worksheet 相同位置的单元格时,xlCellTypeLastCell 返回的行号高于11。在Worksheet和我的一样,可能有几个相等的Tables,因为我在其他Columns 位置的末尾有一个Pivot Table,在其他表Row 的末尾有一个Row,因此不能使用xlCellTypeLastCell 属性。
  • @MGae2M,我了解您的问题。我在答案中添加了一些代码。
【解决方案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

【讨论】:

  • 这个创新的答案可以扩展,使用 Dy.Lee 的(上图)答案:MsgBox givenRange.SpecialCells(xlCellTypeLastCell).End(XlUp).Row 在特殊情况下,范围的结尾是 @987654324 的结尾@。但是,如果结尾在可见表行和下面有一些过滤的行之间,那是行不通的。所以在你的回答中,我们如何计算A10001000 数字?!
  • 我不能接受你的创新答案,因为问题在于计算A1000!。可能给定的范围在 Table 之间,一些过滤(隐藏)的行在下方和上方和之间。(当然是列)
【解决方案3】:

遗憾的是 .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

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

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

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

【讨论】:

  • 我想在Filtered Table 列表中找到最后一行。并为此使用.Count 属性。所以正确的是:{当我们遇到不可见(过滤)或空行之前的最后一行时,停止并报告行号。}如果您有想法从开始遍历表格到底部,请出示。
  • 以上答案有什么用?
  • @MGae2M 今天晚些时候我会为你提供一些示例代码
  • 为什么我们不能在表格循环中使用.Count 属性来反对使用EntireRow.Hidden
【解决方案4】:

.SpecialCells(xlCellTypeVisible) 返回一个多区域范围。您可以使用 Range.Areas 属性访问每个区域。 official documentation for Range.Count 给出了这个例子:

Sub DisplayColumnCount() 
    Dim iAreaCount As Integer 
    Dim i As Integer

    Worksheets("Sheet1").Activate 
    iAreaCount = Selection.Areas.Count 
 
    If iAreaCount <= 1 Then 
        MsgBox "The selection contains " & Selection.Columns.Count & " columns." 
    Else 
        For i = 1 To iAreaCount 
            MsgBox "Area " & i & " of the selection contains " & _ 
            Selection.Areas(i).Columns.Count & " columns." 
        Next i 
    End If 
End Sub

【讨论】:

  • 不依赖主要问题!
猜你喜欢
  • 1970-01-01
  • 2019-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-21
  • 2018-11-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多