Excel vba在自动筛选下拉菜单中选择下一个选项

Excel vba在自动筛选下拉菜单中选择下一个选项,vba,excel,Vba,Excel,我有几个列,其中有几百行数据。我的角色之一是查看数据(通常在第2列中),因此我所做的是单击列标题上的小下拉箭头打开自动筛选列表,取消选择第一个值,然后选择下一个值。然后,同样地,打开菜单,取消选择第二个值并选择第三个值 也没有固定数量的值。不同的数据表有不同数量的数据。数据通常是0,10,40,50,60,。。。。再说一次,它不是固定的。然而,它是一个数组。所有数据的顺序都在增加 我需要的是: 最好是单击按钮(第2列),取消选择当前选定的值,选择下一个值并过滤掉该值 反之亦然。即,取消选择当前值

我有几个列,其中有几百行数据。我的角色之一是查看数据(通常在第2列中),因此我所做的是单击列标题上的小下拉箭头打开自动筛选列表,取消选择第一个值,然后选择下一个值。然后,同样地,打开菜单,取消选择第二个值并选择第三个值

也没有固定数量的值。不同的数据表有不同数量的数据。数据通常是0,10,40,50,60,。。。。再说一次,它不是固定的。然而,它是一个数组。所有数据的顺序都在增加

我需要的是:

  • 最好是单击按钮(第2列),取消选择当前选定的值,选择下一个值并过滤掉该值
  • 反之亦然。即,取消选择当前值,选择上一个值
  • 基本上,我需要一个前进和后退按钮为我的数据

    这就是我试图记录我的行为时得到的结果

    Sub a()
    
    ActiveSheet.Range("$A$2:$V$609").AutoFilter Field:=2, Criteria1:
        ="750385/000"
        ActiveSheet.Range("$A$2:$V$609").AutoFilter Field:=2, Criteria1:
        ="750385/010"
    ActiveSheet.Range("$A$2:$V$609").AutoFilter Field:=2, Criteria1:
        ="750385/017"
    
    端接头


    谢谢你的帮助

    我会这样做

    首先:获取帮助列X,例如,在其中复制列B中的所有唯一数据

    Option Explicit
    
    Sub CreateUniqueList()
    Dim lastrow As Long
    
    lastrow = Cells(Rows.Count, "B").End(xlUp).Row
    
        ActiveSheet.Range("B1:B" & lastrow).AdvancedFilter _
        Action:=xlFilterCopy, _
        CopyToRange:=ActiveSheet.Range("X1"), _
        Unique:=True
        ActiveSheet.Range("Y1").Value = "x" 
    End Sub
    
    您的列表可能会在之后出现如下错误:

    之后,您需要为按钮创建一个循环:

    像这样的

    //代码未经测试//

        Sub butNextValue()
    Dim lastrow As Long
    
    lastrow = Cells(Rows.Count, "B").End(xlUp).Row
    
    
    For i = 2 To lastrow
        If ActiveSheet.Cells(i, 25).Value = "x" Then
            If Not ActiveSheet.Cells(i+1, 24)-value = "" Then 'check if next value is there
                ActiveSheet.Range("$A$2:$V$609").AutoFilter Field:=2, Criteria1:=ActiveSheet.Cells(i+1, 24)-value
            Else
                MsgBox "No more Next Values"
            End If
            Exit For
        End If
    Next i
    
    End Sub
    
    Sub butPriValue()
    Dim lastrow As Long
    
    lastrow = Cells(Rows.Count, "B").End(xlUp).Row
    
    
    For i = 2 To lastrow
        If ActiveSheet.Cells(i, 25).Value = "x" Then
            If Not ActiveSheet.Cells(i-1, 24)-value = "Set" OR Not ActiveSheet.Cells(i-1, 24)-value = "" Then 'check if next value is there
                ActiveSheet.Range("$A$2:$V$609").AutoFilter Field:=2, Criteria1:=ActiveSheet.Cells(i-1, 24)
            Else
                MsgBox "No more Pri Values"
            End If
            Exit For
        End If
    Next i
    
    End Sub
    

    我会使用工作表上的旋转按钮,将它们链接到要筛选的列的第一个单元格

    (我称之为spbFilterChange,并将其链接到$B$1)

    (图片上传在此不起作用,抱歉)

    然后,您可以在工作表的模块中输入以下代码:

    Private Sub spbFilterChange_SpinDown()
        Change_Filter Me.Range(Me.spbFilterChange.LinkedCell), False
    End Sub
    
    Private Sub spbFilterChange_SpinUp()
        Change_Filter Me.Range(Me.spbFilterChange.LinkedCell), True
    End Sub
    
    以及标准模块中的以下子模块:

    Option Explicit
    
    Sub Change_Filter(SortField As Range, Up As Boolean)
    Dim Filter_Values As Collection
    Dim Value_Arr, Val, Sort_Value As String
    Application.ScreenUpdating = False
        ' Find Unique Values in relevant Column -> Collection
        Set Filter_Values = New Collection
        SortField.Offset(2, 0).Areas(1).AutoFilter SortField.Column
        Value_Arr = SortField.Parent.Range(SortField.Offset(3, 0), SortField.Parent.Cells(SortField.Parent.Rows.Count, SortField.Column).End(xlUp)).Value2
        On Error Resume Next
        For Each Val In Value_Arr
            Filter_Values.Add Val, CStr(Val)
        Next Val
    
        ' Check if Value of LinkedCell is in range
        If SortField.Value < 1 Or SortField.Value > Filter_Values.Count Then SortField.Value = 1
    
        ' set autofilter
        Sort_Value = Filter_Values(SortField.Value)
        SortField.Offset(2, 0).AutoFilter SortField.Column, Sort_Value
    Application.ScreenUpdating = True
    End Sub
    
    选项显式
    子更改过滤器(SortField作为范围,Up作为布尔值)
    将筛选值设置为集合
    Dim Value\u Arr、Val、将值排序为字符串
    Application.ScreenUpdating=False
    '在相关列->集合中查找唯一值
    设置过滤器_值=新集合
    SortField.Offset(2,0).区域(1).自动筛选SortField.Column
    Value\u Arr=SortField.Parent.Range(SortField.Offset(3,0),SortField.Parent.Cells(SortField.Parent.Rows.Count,SortField.Column)。End(xlUp)).Value2
    出错时继续下一步
    对于每个Val的值
    过滤值。添加Val,CStr(Val)
    下一个Val
    '检查LinkedCell的值是否在范围内
    如果SortField.Value<1或SortField.Value>Filter\u Values.Count,则SortField.Value=1
    '设置自动筛选
    排序值=筛选值(SortField.Value)
    SortField.Offset(2,0).自动筛选SortField.Column,排序值
    Application.ScreenUpdating=True
    端接头
    

    这应该可以解决您的问题,并且可以在不同的列和工作表上使用(您必须在工作表模块中添加另一个事件过程副本)。

    有一种读取当前筛选器的方法,您可以在该列上循环,直到找到该值。在这里,您只需要跳转到下一行中的值,现在可以将其放入过滤器中

    总之,这个方法就是你的“前进”按钮



    注意:如果B列中存在重复项,则此项不起作用,如果是这样,请使用For循环替换零件,并执行以下操作:

    Dim i As Integer
    Dim bool As Boolean
    bool = False
    For i = startRow To startRow + rng.Rows.Count
        If Cells(i, 2).Value = currentCrit Then
            bool = True
        End If
    
        If bool And Cells(i, 2).Value <> currentCrit Then
            Exit For
        End If
    Next
    
    Dim i作为整数
    布尔型模糊布尔
    bool=False
    对于i=startRow到startRow+rng.Rows.Count
    如果单元格(i,2).Value=currentCrit,则
    布尔=真
    如果结束
    如果布尔和单元格(i,2)。值currentCrit然后
    退出
    如果结束
    下一个
    

    希望我能帮上忙。

    对不起,如何将“旋转”按钮链接到列的第一个单元格?我试过谷歌搜索,但什么也没找到。对不起,我是这方面的初学者!我认为所有的代码都在正确的地方。只需要知道如何将旋转按钮链接到列@添加旋转按钮时,单击属性并在
    LinkedCell
    Dim i As Integer
    Dim bool As Boolean
    bool = False
    For i = startRow To startRow + rng.Rows.Count
        If Cells(i, 2).Value = currentCrit Then
            bool = True
        End If
    
        If bool And Cells(i, 2).Value <> currentCrit Then
            Exit For
        End If
    Next