【问题标题】:Autohide Rows Based on DV Dropdown Menu - Excel VBA基于DV下拉菜单的自动隐藏行 - Excel VBA
【发布时间】:2015-06-11 11:42:45
【问题描述】:

我想知道是否有人对此有任何想法,我觉得有些事情让我头疼,因为我相信这应该可行......

我在单元格 A11 上有一个数据验证下拉菜单,其中包含(选择物业、酒店、旅馆、小屋)

我已将第 22:52 行的名称定义为“RLHotel”,将第 53:85 行的名称定义为“RLHostel”,将第 86:115 行的名称定义为“RLCabin”。本质上,我试图让用户可以选择他们要填写的房间列表是什么类型的房产。

如果他们在下拉菜单中选择“旅馆”,我希望旅馆/小屋隐藏。如果他们是“旅馆”,我希望旅馆/小屋隐藏起来,等等。

我在 VBA 中为此特定工作表使用的代码是:

Private Sub Worksheet_Change(ByVal Target As Range)

If Not Intersect(Target, Range("A11")) Is Nothing Then
    With Range("$A$11")
        Range("RLHotel, RLCabin").EntireRow.Hidden = .Value = "Hostel"
        Range("RLHostel, RLCabin").EntireRow.Hidden = .Value = "Hotel"
        Range("RLHostel, RLHotel").EntireRow.Hidden = .Value = "Cabin"
    End With
End If


End Sub

目前,如果我选择“酒店”,则只有“客舱”行隐藏。如果我选择“旅馆”,所有行都会显示。如果我选择“客舱”,Hostel 和 Hotel 行将隐藏。

有人有什么想法吗?将不胜感激,一直在寻找这个!谢谢!

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    试试这个吧,我认为你想太多了,试图在两个不连续的范围上进行操作(例如,Range("RLHotel", "RLHostel")。只需将布尔表达式中的运算符翻转为<> 并将Hidden 属性设置为因此,每种类型的属性:

    Private Sub Worksheet_Change(ByVal Target As Range)
    
    If Not Intersect(Target, Range("A11")) Is Nothing Then
        With Range("$A$11")
            Range("RLHotel").EntireRow.Hidden = .Value <> "Hotel"
            Range("RLHostel").EntireRow.Hidden = .Value <> "Hostel"
            Range("RLCabin").EntireRow.Hidden = .Value <> "Cabin"
        End With
    End If
    
    
    End Sub
    

    如果 A11 (通过公式)链接到另一个工作表上的单元格,则不要使用 _Change 事件,而是使用 _Calculate 事件:

    Private Sub Worksheet_Calculate()
        With Range("$A$11")
            Range("RLHotel").EntireRow.Hidden = .Value <> "Hotel"
            Range("RLHostel").EntireRow.Hidden = .Value <> "Hostel"
            Range("RLCabin").EntireRow.Hidden = .Value <> "Cabin"
        End With
    End Sub
    

    【讨论】:

    • 即将发布相同的解决方案。
    • 啊啊啊谢谢哈哈,真不敢相信我看了这么久都没看到。
    • 快速提问,不确定这是否容易解决。使用上面的固定脚本,单元格 A11 现在不是 DV 下拉菜单,而是链接到不同工作表上的 DV 下拉菜单。当我更改 A11 指向的下拉菜单上的选择时,它不会自动隐藏/显示范围(RLHotel、RlHostel、RLCabin)。我试过添加 Application.Volatile 但这并没有解决。有什么想法吗?
    • 您需要使用 other 工作表中的 Change 事件来控制这一点,因为公式评估 - 即使值发生变化 - 也不会触发更改事件
    • 嗯,我明白你在说什么,但属性(小屋、旅馆、酒店)需要位于每个属性旁边的单独选项卡中,其中列出了数百个属性。因此,例如,当我输入一个新属性“Best Western Stackoverflow”作为酒店时,每当工作表调用 BW Stackoverflow 时,它将更改为酒店类型属性。我真的没有看到将 Change 事件放在 DV 下拉菜单正在更改的属性选项卡上的方法,因为我不需要在那里更改任何内容。
    【解决方案2】:

    这是参考答案中的cmets。这是使其在每个选项卡上更新的最终解决方案,因此我可以构建更多内容并自动填充。

    Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal   Target As   Range)
    Application.Volatile
    
    
    With Sheet4.Range("$A$11")
        Sheet4.Range("RLHotel").EntireRow.Hidden = .Value <> "Hotel"
        Sheet4.Range("RLHostel").EntireRow.Hidden = .Value <> "Hostel"
        Sheet4.Range("RLCabin").EntireRow.Hidden = .Value <> "Cabin"
    End With
    
    With Sheet12.Range("$A$11")
        Sheet12.Range("RLHotel").EntireRow.Hidden = .Value <> "Hotel"
        Sheet12.Range("RLHostel").EntireRow.Hidden = .Value <> "Hostel"
        Sheet12.Range("RLCabin").EntireRow.Hidden = .Value <> "Cabin"
    End With
    
    End Sub
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-04
      • 2016-02-21
      • 1970-01-01
      • 1970-01-01
      • 2018-08-18
      • 2014-03-31
      • 1970-01-01
      相关资源
      最近更新 更多