Excel vba选择自动筛选器下拉菜单中的下一个选项
问题描述:
我有几列有几百行数据。我的角色之一是查看数据(最常见的是第2列),因此我所做的是单击列标题上的小下拉箭头以打开自动筛选器列表,取消选择第一个值,然后选择下一个值。然后,同样,打开菜单,取消选择第二个值并选择第三个。Excel vba选择自动筛选器下拉菜单中的下一个选项
也没有固定数量的值。不同的数据表有不同数量的数据。数据通常像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
你的列表可以后,像这样lokk:
之后,您将需要一个循环的按钮:
这样的事情。
//代码不Testet //
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
答
我会在纸张上使用Spinbuttons并将其链接到该列的第一个单元格,它要筛选。
(我把它叫做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
这应该解决您的问题,并且可以用于不同的列和工作表(您必须在工作表模块中添加另一个事件过程的副本)。
答
有一种方法可以读出curent过滤器,您可以通过该过滤器循环访问该列,直到找到该值。在这里你只需要跳到下一行的值,现在你可以把它放到过滤器中。
所以在最后这个方法是你的“前进”按钮上
Sub test()
Dim startRow As Integer
startRow = 2
Dim rangeString As String
rangeString = "$A$2:$V$609"
Dim rng As Range
Set rng = Range(rangeString)
Dim currentCrit As String
currentCrit = rng.Parent.AutoFilter.Filters(2).Criteria1
currentCrit = Right(currentCrit, Len(currentCrit) - 1)
Dim i As Integer
For i = startRow To startRow + rng.Rows.Count
If Cells(i, 2).Value = currentCrit Then
i = i + 1
Exit For
End If
Next
If i > rng.Rows.Count + startRow Then
Exit Sub
End If
ActiveSheet.Range(rangeString).AutoFilter Field:=2, Criteria1:=Cells(i, 2).Value
End Sub
注:此不需额外的工作,如果有你在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
希望我能帮上忙。
对不起,但我如何链接旋转按钮到列的第一个单元格?我尝试了谷歌搜索,没有发现任何东西。对不起,我是这个初学者!我把所有的代码放在正确的地方(我认为)。只需要知道如何将旋转按钮链接到列! –
@divesh divakaran当您添加旋转按钮时,单击属性并在“LinkedCell”中输入(例如)$ B $ 1' – Jochen