【问题标题】:Show/Hide Rows Per Dropdown Selection显示/隐藏每个下拉选择的行
【发布时间】:2016-02-01 17:32:01
【问题描述】:

我在网上找到了一个示例代码,我已经根据我在 Excel 文件的下拉列表中选择的选项来调整以显示或隐藏特定行。

无论我尝试什么,宏都不起作用。

我的代码如下(还附上了问题 2 (2a - 2d) 下未显示/隐藏的行的屏幕截图)

Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Address = "$F$13" Then
If Range("F13").Value = "Yes" Then
Rows("14:17").EntireRow.Hidden = False
End If

If Range("F13").Value = "No" Then
Rows("14:17").EntireRow.Hidden = True
End If

If Range("F13").Value = " " Then
Rows("14:17").EntireRow.Hidden = True
End If
End Sub

【问题讨论】:

  • 现在,您的代码应该可以工作,如果 A) 此代码在您希望它运行的工作表中(右键单击工作表选项卡并转到“查看代码”,此代码应该在那里) , B) 正在改变的单元格是 F13。你的F13是什么数据验证?如果 F13 为“否”或 [空格],您希望该行被隐藏,对吗?

标签: vba excel show-hide


【解决方案1】:

这是一个很好的例子,说明您的代码可以帮助您识别问题。您缺少 End IF 语句。试试这个:

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Address = "$F$13" Then
    If Range("F13").Value = "Yes" Then
        Rows("14:17").EntireRow.Hidden = False
    End If

    If Range("F13").Value = "No" Then
      Rows("14:17").EntireRow.Hidden = True
    End If

    If Range("F13").Value = " " Then
        Rows("14:17").EntireRow.Hidden = True
    End If
End If
End Sub

您可能还想使用:

If Range("F13").Value = ""

而不是

If Range("F13").Value = " "

【讨论】:

  • 非常感谢您的帮助,这使我重回正轨并帮助我使代码正常工作! :)
【解决方案2】:

缺少一个End If。我假设需要测试目标单元格 (F13) 的值。如果值为“是”,则应取消隐藏第 14:17 行,如果为“”(空格键),则应隐藏它们,如果为“否”,则也应隐藏它们。其他值不会影响行的隐藏/取消隐藏。 在End Sub 之前应该有第二个End If,以便上面的所有if 语句都包含在地址检查中。

还请注意,此代码应放置在工作表本身中,因为您想挂接到 Worksheet_Change 事件。

在工作表模块中试试这个:

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$F$13" Then 'Check if the changed value is indeed in F13

    If Target.Value = "Yes" Then
        ActiveSheet.Rows("14:17").EntireRow.Hidden = False 'Show the rows if the value is Yes
    ElseIf Target.Value = "No" Then
        ActiveSheet.Rows("14:17").EntireRow.Hidden = True 'Hide them when it's No
    ElseIf Target.Value = " " Then
        ActiveSheet.Rows("14:17").EntireRow.Hidden = True 'Or space
    End If

End If
End Sub

其他说明:

  • 您也可以使用Me (Me.Rows...) 而不是ActiveSheet,在这种情况下他们可能会这样做。但是,如果您从另一个工作表更改工作表上的值(例如重新计算的公式),Me 将引用触发事件的更改工作表,而 activeworksheet 将影响当前活动的工作表。
  • 使用 Target 而不是再次引用 Range。 Target 是一个已经在内存中的范围对象。因此,与再次访问工作表相比,执行速度会更快。

【讨论】:

  • 非常感谢,这真的很有帮助,代码现在可以在工作表中正确工作了!我将代码从工作簿移到 Sheet1(清楚地向您展示了我有多大;)并添加了所有建议的编辑以及额外的缺失“End If”行。我真的很感激!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-04
  • 1970-01-01
  • 1970-01-01
  • 2020-12-02
相关资源
最近更新 更多