【问题标题】:Working through a filtered set in VBA在 VBA 中处理过滤集
【发布时间】:2018-11-08 00:55:54
【问题描述】:

我是 VBA 的新手。我找到了部分解决方案,但我看到的所有示例都达不到我的需要。

我在 VBA 表单中有向上和向下按钮,它们需要显示过滤集中的数据。我已经确定可以使用以下代码应用过滤器:

Dim LR As Long
LR = Range("A" & rows.Count).End(xlUp).Row
Range("A3:AM" & LR).SpecialCells(xlCellTypeVisible).Select

而且效果很好。

现在我需要的是根据向上或向下按钮是否按下来向上和向下数据,然后从相应的行和列中获取数据。

我知道我可以使用类似于以下内容的For 循环:

For Each Row In Range("A1", Cells(rows.Count, "A").End(xlUp)).SpecialCells(xlCellTypeVisible)
   GWEPId = Cells(Row.Row, 1)
   Grip5Status = Cells(Row.Row, 4)
Next Row

但我不知道如何使用第一种方法。

如果我按下,我想转到下一个过滤的行,如果我按下,我想回到上一个过滤的行。

是否需要将所有数据放入一个数组中,然后从数组中上下移动?有没有更简单的方法?

【问题讨论】:

标签: vba excel filter traversal


【解决方案1】:

我不确定我是否真的完全理解了你的问题,但这是我对以下假设的尝试:

  • 您在第一行应用了实际过滤器
  • 您已在数据库中选择了一个实际行

那么这里有一段代码可以让你从更高的行获取值

Sub GetDataMinus()
'Assign code to your button to get values one row higher

Dim FR As Long, LR As Long, X As Long

FR = ActiveSheet.AutoFilter.Range.Offset(1).SpecialCells(xlCellTypeVisible).Cells(1, 1).Row
LR = ActiveSheet.Range("A" & Rows.Count).End(xlUp).Row

If ActiveCell.Row > FR Then
    For X = ActiveCell.Row - 1 To FR Step -1
        If Not Cells(X, 1).Rows.Hidden Then
            ActiveSheet.Rows(X).Select
            Debug.Print Cells(X, 1).Value 'Link the value to where you want to store it, e.g. on your userform
            Debug.Print Cells(X, 4).Value 'Link the value to where you want to store it, e.g. on your userform
            Exit Sub
        End If
    Next X
End If

End Sub

这里有一段代码可以让你的值低一行:

Sub GetDataPlus()
'Assign code to your button to get values one row lower

Dim FR As Long, LR As Long, X As Long

FR = ActiveSheet.AutoFilter.Range.Offset(1).SpecialCells(xlCellTypeVisible).Cells(1, 1).Row
LR = ActiveSheet.Range("A" & Rows.Count).End(xlUp).Row

If ActiveCell.Row < LR Then
    For X = ActiveCell.Row + 1 To LR
        If Not Cells(X, 1).Rows.Hidden Then
            ActiveSheet.Rows(X).Select
            Debug.Print Cells(X, 1).Value 'Link the value to where you want to store it, e.g. on your userform
            Debug.Print Cells(X, 4).Value 'Link the value to where you want to store it, e.g. on your userform
            Exit Sub
        End If
    Next X
End If

End Sub

我想做一些笔记:

  • 代码可以更优雅,有(很长的)方法可以提取过滤范围内的最后一个可见行。我只是没有在这里应用它,因为我觉得它不会增加那么多。
  • 我没有在用户窗体上测试此代码,但我相信您可以在需要的地方进行调整。
  • 在代码中,我假设您在数据库中选择了一行。但是,您也可以将最后使用的行存储在用户窗体上并将其用作输入。想法?
  • 更多前往罗马的方式,因此可能有更好的方式来做这件事,但这是我的尝试 :)

祝你好运。

【讨论】:

  • 嘿,非常感谢!我复制粘贴了代码,它几乎可以完美运行!我唯一要做的就是向下/向上切换,因为它似乎颠倒了。这为我节省了大量处理全局变量等的时间。再次感谢。
  • 如果帮助/解决问题,请不要忘记考虑投票和/或接受作为答案stackoverflow.com/help/someone-answers
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-27
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 2013-08-30
  • 1970-01-01
  • 2018-08-13
相关资源
最近更新 更多