如何获得一个范围内的所有可见行

时间:2018-08-08 12:04:25

标签: excel vba

我正在尝试将所有过滤后的数据收集到一个范围变量中,但这不起作用。

当可见数据是连续的(行25至200)时,我没问题,但是当可见数据不连续(行25至27,然后43至47,然后60至92)时,它只能达到第一个范围(第25至27行)

这是我的代码:

datas = dataSheet.Range("A2:L" & dataSheet. 
[A65000].End(xlUp).Row).SpecialCells(xlCellTypeVisible).Value

你有小费吗?

谢谢您的回答。

路易

2 个答案:

答案 0 :(得分:1)

听起来您正在尝试填充名为datas的数组变量,如果您的范围是连续的,则该变量成功,但仅在不连续的情况下才获取第一部分。而您正在寻找的是用不连续范围内的所有数据填充数组。

这是可能的,有两种方法。第一种是复制不连续的范围并将其粘贴到临时工作表中。粘贴的范围将是连续的,然后可以按照原始代码中所示正常将其加载到数组中。第二种是直接填充数组,但是您必须遍历每个可见的单元格才能做到这一点。

方法1(使用临时工作表):

Sub tgrTempWS()

    Dim dataSheet As Worksheet
    Dim tempSheet As Worksheet
    Dim rData As Range
    Dim datas As Variant

    Set dataSheet = ActiveWorkbook.Sheets("Sheet1")
    On Error Resume Next
    Set rData = dataSheet.Range("A2:L" & dataSheet.[A65000].End(xlUp).Row).SpecialCells(xlCellTypeVisible)
    On Error GoTo 0
    If rData Is Nothing Then Exit Sub   'No data

    Set tempSheet = dataSheet.Parent.Sheets.Add
    rData.Copy tempSheet.Range("A1")
    datas = tempSheet.Range("A1").CurrentRegion.Value
    Application.DisplayAlerts = False
    tempSheet.Delete
    Application.DisplayAlerts = True

    'do stuff with your datas array variable here

End Sub

方法2(遍历可见的单元格):

Sub tgrLoop()

    Dim dataSheet As Worksheet
    Dim rData As Range
    Dim rCell As Range
    Dim datas As Variant
    Dim lRow As Long, lCol As Long
    Dim i As Long, j As Long

    Set dataSheet = ActiveWorkbook.Sheets("Sheet1")
    On Error Resume Next
    Set rData = dataSheet.Range("A2:L" & dataSheet.[A65000].End(xlUp).Row).SpecialCells(xlCellTypeVisible)
    On Error GoTo 0
    If rData Is Nothing Then Exit Sub   'No data

    ReDim datas(1 To Intersect(rData, rData.Areas(1).Resize(, 1).EntireColumn).Cells.Count, 1 To rData.Columns.Count)
    For Each rCell In rData.Cells
        If lRow = 0 Then
            lRow = rCell.Row
            i = 1
        ElseIf rCell.Row > lRow Then
            i = i + 1
            lRow = rCell.Row
        End If
        If lCol = 0 Or rCell.Column < lCol Then
            lCol = rCell.Column
            j = 1
        ElseIf rCell.Column > lCol Then
            j = j + 1
            lCol = rCell.Column
        End If
        datas(i, j) = rCell.Value
    Next rCell

    'do stuff with your datas array variable here

End Sub

答案 1 :(得分:0)

来自MSDN的范围对象:“表示一个单元格,一行,一列,包含一个或多个连续单元格块的单元格选择或3-D范围。”

这就是为什么您只获得第一个范围的原因。看看this page可以引用多个范围。