根据下拉选择过滤Excel工作表

时间:2016-02-02 08:15:13

标签: excel vba excel-vba excel-formula

我想通过从下拉菜单中选择来过滤Excel表格。

工作表布局如下所示:

___________|_Product1_|_Product2_|_Product3_|_Product4_|
Shop1      |    X     |     X    |          |          |
Shop2      |          |     X    |     X    |          |
Shop3      |    X     |          |          |     X    |
           |          |          |          |          |
Ingredient1|          |     X    |          |     X    |
Ingredient2|    X     |     X    |     X    |     X    |
Ingredient3|    X     |          |     X    |          |

我希望有一个所有商店的下拉菜单,根据选择,只有标有“X”的产品应该是可见的(所有其他列应该被隐藏)。

使用数据验证列表,但无法实现内部列出的商店名称的正常下拉列表。

1 个答案:

答案 0 :(得分:0)

对于那些来到这个网站寻求相同答案的人来说,我现在就这样做了,它对我来说非常好。可能不是最好的解决方案,但至少它是功能性的:

创建一个包含所有商店(Shop1,Shop2,Shop3)和“全部显示”条目的数据验证列表。根据选择,我调用另一个宏。为此,我将此代码添加到工作表中(右键单击工作表名称 - >查看代码):

Private Sub Worksheet_Change(ByVal Target As Range)
'$F$2 points to the field containing the data validation list
If Target.Address(True, True) = "$F$2" Then
    Select Case Target
        'this matches against the shop name (string) in the data val. list
        Case "Shop1"
            'this is the macro name
            Call Shop1
        Case "Shop2"
            Call Shop2
        Case "Shop3"
            Call Shop3
        Case "Show all"
            Call ShowAll
        Case Else
            'Do nothing
    End Select
End If
End Sub

使用以下代码创建3个名为Shop1,Shop2,Shop3和ShowAll的不同宏:

'name your function
Sub Shop1()
Dim LastColumn As Long, x As Long
LastColumn = ActiveSheet.Cells(3, Columns.Count).End(xlToLeft).Column
'begins to count at column number 2
For x = 2 To LastColumn
   'counts all X in the row number 7
   If UCase(Cells(7, x).Value) = "X" Then
     Columns(x).Hidden = False
   Else
     Columns(x).Hidden = True
   End If
Next
End Sub

我只是将行号更改为工作表中每个宏的匹配值(单元格( 7 ,x).Value) 对于'show all'事件,我刚刚插入了这个:

Sub ShowAll()
For x = 4 To 40
  Columns(x).Hidden = False
Next
End Sub