【问题标题】:Excel VBA to hide and unhide columns based on a dropdown validation list selectionExcel VBA 根据下拉验证列表选择隐藏和取消隐藏列
【发布时间】:2018-04-07 13:07:49
【问题描述】:

我在单元格 A1 中有一个下拉验证列表,其中包含“全部”、“在线商店”、“百货商店”、“专业商店”等类别项目。然后,从单元格 B1 到 X1,我有前面提到的类别,除了“全部”。

我想隐藏除下拉验证列表中选择的类别之外的所有列。如果我在列表中选择“全部”,我还需要取消隐藏所有列。

我在 Internet 上找到了一个示例代码,它可以很好地隐藏未选择的类别 - 但是在更改选择时响应非常慢 -。但我无法使其与取消隐藏所有列的代码一起使用。

相关代码如下。感谢您的反馈。

Private Sub Worksheet_Change(ByVal Target As Range)

Dim R, V

If Target.Address = ("$A$1") Then
V = [A1].Value
For Each R In Range("B1:X1")
R.EntireColumn.Hidden = R.Value <> V
Next

End If

End Sub

【问题讨论】:

  • quite slow response when changing selection 是什么意思?只是更改选择无关紧要,因为这是 Change 事件,而不是 SelectionChange 事件
  • 如果我选择列表中的任何类别,我有 5 秒或更长时间的延迟才能显示新选择的列。

标签: excel dropdown vba


【解决方案1】:

为了让您的代码更快地在循环之前关闭 ScreenUpdating 并在之后重新打开

要添加“全部”功能,请使用以下代码


Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range) 'Target = cell being mdified (changed)

    Dim c As Variant, v As String

    If Target.Address = "$A$1" Then 'If edited cell is A1

        v = Target.Value2           '.Value2 = the text in the cell (without formatting)

        With Range("B1:X1")

            Application.ScreenUpdating = False

            .EntireColumn.Hidden = (v <> "All") 'Hides / Unhides all

            If v <> "All" Then  'If all are hidden, unhide the ones for criteria
                For Each c In .Cells
                    If c = v Then c.EntireColumn.Hidden = False
                Next
            End If

            Application.ScreenUpdating = True
        End With
    End If
End Sub

更多关于.Value2的详情

【讨论】:

  • 代码的第一部分可以完美地取消隐藏所有列。关于第二部分,我仍然有一个问题,因为它一次只显示一列 - 左侧的第一列符合标准 - 我需要显示所有符合相同标准的列。请注意,我没有任何延迟,因为它没有更新屏幕。最后,请您解释一下 Target.Value2 的含义吗?在这里,我想知道您为什么要添加数字“2”。
  • 我进行了更改,并添加了有关 Target.Value2 的更多详细信息
  • 完美!它工作正常,谢谢。关于语法 .Value2,我会牢记这一点。
猜你喜欢
  • 2022-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-21
  • 1970-01-01
  • 1970-01-01
  • 2011-10-23
相关资源
最近更新 更多