excel 动态行根据从下拉列表中选择的值通过VBA隐藏/取消隐藏

mtb9vblg  于 2023-06-25  发布在  其他
关注(0)|答案(2)|浏览(172)

我想要一个动态的解决方案,满足以下要求:

要求:如果用户从下拉列表中选择任何值,则应仅显示在列A中包含相同值的行(来自用户选择的下拉列表值)。如果用户从下拉菜单中选择“全部”,则应显示所有表格/方案。

此外,如果下拉菜单应该是多选的,这将是很好的。

**>>例如:**如果用户从下拉菜单中选择“现金”,则代码应从第5行(包括标题)开始处理,并且仅应使第5行至第13行可见。
**注意:**Row 1到Row 4不受此过程影响。

svmlkihl

svmlkihl1#

如果您有名为data的数据手册,则包含以下内容:

然后,在不同的工作表上存储用于下拉选择的唯一事务类型的选择,包括用于选择所有值的选项。
例如,我们可以使用单元格H2来计算以下公式:=VSTACK(UNIQUE(FILTER(data!A:A,data!A:A<>"")),"all")
在这种情况下,产生这种溢出:

在我们存储在B2中的下拉数据验证中,我们可以将此溢出范围称为H2#

A6(到F6)中,头被存储:{"TYPE","TRANSACTION ID","DATE","PROD ID","STORE ID","TRANS_VALUE"}
然后在A7中,我们使用以下公式:

=LET(a, FILTER(data!A:F,
                    IF(B2="all",
                          ISTEXT(data!A:A),
                          data!A:A=B2)),
     IFERROR(--a,a))

此公式过滤与下拉列表中的选择相等的行。如果选择了all,它将过滤数据表中A列中包含任何文本的任何行。

可以选择隐藏H列。

  • 我选择不包括过滤器中的标题,并在选择表中硬编码。否则,您设置数据的方式将重复每个类型的标题。您可以通过在数据的标题行中不包含值来实现这一点,或者将公式更改为:* =LET(a,FILTER(data!A:F,IF(B2="all",ISNUMBER(data!C:C)),data!A:A=B2)),IFERROR(--a,a))
7jmck4yq

7jmck4yq2#

复制工作表模块中的代码:

Private Sub Worksheet_Change(ByVal Target As Range)
   If Target.CountLarge = 1 Then
      ' B2 is the cell with drop down list
      If Target.Address = "$B$2" Then
         Call showIf(Target.Value2)
      End If
   End If
End Sub

Sub showIf(criteria As String)
   Dim colA As Range, found As Range, cnt As Long, frow As Long

   Application.ScreenUpdating = False

   ' maybe here you want to find the last non empty row
   ' but as i know excel reduces the actions in the usedRange
   Set colA = Me.Range("A:A")
   criteria = UCase(criteria)
   Err.Clear
   On Error GoTo Lerr
   If criteria <> "" And criteria <> "ALL" Then
      ' find the first row of criteria
      frow = WorksheetFunction.Match(criteria, colA, 0)
      ' count the rows witch meet the criteria
      cnt = WorksheetFunction.CountIf(colA, criteria)

      ' use union to add some rows on top, to be always visible
      Set found = Union(Range("A1:A2"), colA(frow).Resize(cnt, 1))
      
      ' hide all rows
      colA.EntireRow.Hidden = True
      
      ' show only rows meet the criteria Plus some in top
      found.EntireRow.Hidden = False
      
      ' select the cell with drop down menu
      Range("B2").Select
      ' scroll on top to see the unhidden rows
      ActiveWindow.ScrollRow = 1
   Else
      colA.EntireRow.Hidden = False
      ActiveWindow.ScrollRow = 1
   End If
   Exit Sub
Lerr:
   MsgBox "Error " & Err.Number & " (" & Err.Description & ")  " & Err.Source
   On Error GoTo 0
   ' if an error occurs show all rows
   colA.EntireRow.Hidden = False
End Sub

相关问题