显示/隐藏每个下拉选择行

时间:2016-02-01 17:32:02

标签: excel vba excel-vba show-hide

我发现在线代码作为一个例子,我已调整显示或隐藏特定行,具体取决于我在Excel文件的下拉列表中选择的选项。

无论我尝试什么,宏都无法正常工作。

我的代码如下(还附有问题2(2a - 2d)中未显示/隐藏的行的截图)Screenshot of Excel Doc

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

2 个答案:

答案 0 :(得分:1)

这是正确使用您的代码帮助您确定问题的一个很好的示例。你错过了一个结束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 = " "

答案 1 :(得分:0)

缺少End If。我假设需要测试目标单元格(F13)的值是否值。如果值是"是",它应该取消隐藏第14:17行,如果它是" " (空格键)它应该隐藏它们,如果它是"否"也应该隐藏它们。其他值不会影响行的隐藏/取消隐藏。 在End If之前应该有第二个End Sub,以便上面的所有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

其他评论:

  • 您可以使用ActiveSheetMe代替Me.Rows...而不是Me。在这种情况下,他们可能也会这样做。但是,如果您从另一个工作表更改工作表上的值(例如重新计算的公式),configureStates.$inject = ['$stateProvider']; export default function configureStates($stateProvider) { getStates().forEach(state => $stateProvider.state(state.name, state.config)); } function getStates() { return [ { name: 'contracts', config: { url: '/contracts', template: require('./contracts.html'), controller: 'ContractsController', controllerAs: 'vm', title: 'CONTRACTS', settings: { nav: 2, content: '<i class="fa fa-dashboard"></i> CONTRACTS' }, resolve: {} } } ]; } 将引用触发事件的已更改工作表,而activeworksheet将影响当前活动的工作表。
  • 使用Target而不是再次引用Range。 Target是已在内存中的范围对象。因此,与再次访问工作表相比,执行速度会更快。