包含隐藏行和隐藏列

时间:2017-08-27 12:36:50

标签: excel vba excel-vba

我在下面写了

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

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

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

4 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

答案 2 :(得分: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

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

我们所能做的最好的事情就是从底部开始遍历表格。

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

答案 3 :(得分:0)

.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