在VBA中处理过滤集

在VBA中处理过滤集,vba,excel,filter,traversal,Vba,Excel,Filter,Traversal,我是VBA的新手。我已经找到了解决方案的一部分,但我看到的所有例子都不能满足我的需要 我在VBA表单中有向上和向下按钮,它们需要显示过滤集的数据。我已经计算出可以使用以下代码应用过滤器: Dim LR As Long LR = Range("A" & rows.Count).End(xlUp).Row Range("A3:AM" & LR).SpecialCells(xlCellTypeVisible).Select 这很有效 现在我需要的是根据是按向上还是向下按钮来上下移动数

我是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
但我不知道如何使用第一种方法来实现这一点

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


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

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

  • 您在第一行应用了实际的筛选器
  • 您已在数据库中选择了一个实际行
下面是一段代码,它将从更高的一行获取值

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
Sub-GetDataPlus()
'将代码分配给按钮以使值降低一行
变暗FR为长,LR为长,X为长
FR=ActiveSheet.AutoFilter.Range.Offset(1).特殊单元格(xlCellTypeVisible).单元格(1,1).行
LR=ActiveSheet.Range(“A”&Rows.Count).End(xlUp).Row
如果ActiveCell.Row
我想说几句话:

  • 代码可以变得更加优雅,提取过滤范围内最后可见的行还有很长的路要走。我只是没有在这里应用它,因为我觉得它没有增加多少
  • 我没有在userform上测试这段代码,但我相信您可以在需要的地方进行调整
  • 在代码中,我假设您选择了数据库中的一行。但是,您也可以将最后使用的行存储在userform上,并将其用作输入。想法
  • 有更多的方法去罗马,所以可能有更好的方法,但这是我的尝试:)

祝你好运。

欢迎访问该网站!查看和,了解有关提问的更多信息,这些问题将吸引高质量的答案。您可以添加更多信息。嘿,非常感谢!我复制粘贴的代码,它的工作几乎完美!我唯一要做的就是把开关调低/调高,因为它看起来是相反的。这使我节省了很多时间来处理全局变量等等。再次感谢。如果帮助解决问题,不要忘记考虑投票和/或接受答案。