Show/Hide 每个下拉选择的行数
Show/Hide Rows Per Dropdown Selection
我在网上找到了一个代码示例,我已根据我在 Excel 文件的下拉列表中选择的选项来调整显示或隐藏特定行。
无论我怎么尝试,宏都不起作用。
我的代码如下(附上问题 2 (2a - 2d) 下不是 showing/hiding 的行的屏幕截图)
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$F" 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
这是正确设计代码的一个很好的例子,可以帮助您识别问题。您缺少 End IF 语句。试试这个:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$F" 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 = " "
缺少 End If
。我假设需要测试目标单元格 (F13) 的值的值。如果值为 "Yes",它应该取消隐藏行 14:17,如果它是 " "(空格键)它应该隐藏它们,如果它是 "No" 也应该隐藏它们。其他值不会影响行的 hiding/unhiding。
在 End Sub
之前应该有第二个 End If
,这样上面的所有 if 语句都包含在地址检查中。
另请注意,此代码应放在工作sheet 本身中,因为您要挂接到 Worksheet_Change
事件。
在工作sheet模块中试试这个:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$F" 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
。在这种情况下,他们可能会做同样的事情。但是,如果您从另一个工作 sheet 更改工作 sheet 的值(例如重新计算的公式),Me
将引用触发事件的更改工作 sheet,而 activeworksheet 将影响当前活跃的 sheet.
- 使用 Target 而不是再次引用 Range。 Target 是一个已经在内存中的范围对象。因此,与再次访问作品相比,执行速度会更快sheet。
我在网上找到了一个代码示例,我已根据我在 Excel 文件的下拉列表中选择的选项来调整显示或隐藏特定行。
无论我怎么尝试,宏都不起作用。
我的代码如下(附上问题 2 (2a - 2d) 下不是 showing/hiding 的行的屏幕截图)
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$F" 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
这是正确设计代码的一个很好的例子,可以帮助您识别问题。您缺少 End IF 语句。试试这个:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$F" 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 = " "
缺少 End If
。我假设需要测试目标单元格 (F13) 的值的值。如果值为 "Yes",它应该取消隐藏行 14:17,如果它是 " "(空格键)它应该隐藏它们,如果它是 "No" 也应该隐藏它们。其他值不会影响行的 hiding/unhiding。
在 End Sub
之前应该有第二个 End If
,这样上面的所有 if 语句都包含在地址检查中。
另请注意,此代码应放在工作sheet 本身中,因为您要挂接到 Worksheet_Change
事件。
在工作sheet模块中试试这个:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$F" 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
。在这种情况下,他们可能会做同样的事情。但是,如果您从另一个工作 sheet 更改工作 sheet 的值(例如重新计算的公式),Me
将引用触发事件的更改工作 sheet,而 activeworksheet 将影响当前活跃的 sheet. - 使用 Target 而不是再次引用 Range。 Target 是一个已经在内存中的范围对象。因此,与再次访问作品相比,执行速度会更快sheet。