【问题标题】:How to get all visible rows in one range如何获取一个范围内的所有可见行
【发布时间】:2018-08-08 22:02:00
【问题描述】:

我试图在一个范围变量中获取所有过滤后的数据,但它不起作用。

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

这是我的代码:

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

你有什么建议吗?

感谢您的回答。

路易

【问题讨论】:

  • This 是您正在寻找的。简单搜索 ;)

标签: excel vba


【解决方案1】:

听起来您正在尝试填充一个名为 datas 的数组变量,如果您的范围是连续的,这会成功,但在不连续时只会获取第一部分。您正在寻找的是用不连续范围内的所有数据填充数组。

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

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

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

【讨论】:

  • 嗨,伙计,感谢您的回答,我已经尝试了这两种方法,但只有第一种方法有效,即使我仍然不知道它是如何工作的(因为我是 VBA 的新手)。
【解决方案2】:

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

这就是为什么你只得到第一个范围。查看this page 以引用多个范围。

【讨论】:

  • 完全有可能
  • 为你回答,但我找到了@tigeravatar 的解决方案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-12
  • 1970-01-01
  • 2021-01-25
  • 2016-01-02
  • 2018-05-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多