VBA:隐藏和取消隐藏代码不起作用

时间:2018-06-07 18:12:43

标签: excel-vba vba excel

我是VBA的新手,并且一直在尝试根据某个单元格地址的输入值编写一个隐藏和取消隐藏行的代码。但是,它不起作用,我不知道为什么。我在下面发布了我的代码:

Sub Hide()

If Worksheets("IS").Range("B8").Value = "Show All" Then
   Worksheets("IS").Rows("12:165").EntireRow.Hidden = False
End If

If Worksheets("IS").Range("B8").Value = "Just Revenue" Then
   Worksheets("IS").Rows("12:165").EntireRow.Hidden = False
   Worksheets("IS").Rows("28:165").EntireRow.Hidden = True
End If

If Worksheets("IS").Range("B8").Value = "Just Expenses" Then
   Worksheets("IS").Rows("12:165").EntireRow.Hidden = False
   Worksheets("IS").Rows("12:27").EntireRow.Hidden = True
   Worksheets("IS").Rows("160:165").EntireRow.Hidden = True
End If

If Worksheets("IS").Range("B8").Value = "Just Cogs" Then
   Worksheets("IS").Rows("12:165").EntireRow.Hidden = False
   Worksheets("IS").Rows("12:27").EntireRow.Hidden = True
   Worksheets("IS").Rows("64:165").EntireRow.Hidden = True
End If

If Worksheets("IS").Range("B8").Value = "Just Totals" Then
   Worksheets("IS").Rows("12:165").EntireRow.Hidden = False
   Worksheets("IS").Rows("12:25").EntireRow.Hidden = True
   Worksheets("IS").Rows("28:61").EntireRow.Hidden = True
   Worksheets("IS").Rows("64:91").EntireRow.Hidden = True
   Worksheets("IS").Rows("93:155").EntireRow.Hidden = True
End If

End Sub

为什么我的代码无法正常工作或任何改进提示的任何帮助都会非常感激。

2 个答案:

答案 0 :(得分:3)

重写Worksheet_Change:

在您的VBE中,将此代码粘贴到" IS"的代码表中。工作表(在Project - VBAProject窗格中双击它。如果您的VBE中看不到Project - VBAProject窗格,请转到View>> Project Explorer):

Private Sub Worksheet_Change(ByVal Target As Range)

    'Ensure that we don't trigger another change event while this code is running
    Application.EnableEvents = False

    'Check if cell B8 triggered this change:
    If Not Intersect(Target, Range("B8")) Is Nothing Then

       'B8 changed... which means B8 is "Target" variable
        Select Case Target.Value
            Case "Show All"
                Worksheets("IS").Rows("12:165").EntireRow.Hidden = False
            Case "Just Revenue"
                Worksheets("IS").Rows("12:165").EntireRow.Hidden = False
                Worksheets("IS").Rows("28:165").EntireRow.Hidden = True
            Case "Just Expenses"
                Worksheets("IS").Rows("12:165").EntireRow.Hidden = False
                Worksheets("IS").Rows("12:27").EntireRow.Hidden = True
                Worksheets("IS").Rows("160:165").EntireRow.Hidden = True
            Case "Just Cogs"
                Worksheets("IS").Rows("12:165").EntireRow.Hidden = False
                Worksheets("IS").Rows("12:27").EntireRow.Hidden = True
                Worksheets("IS").Rows("64:165").EntireRow.Hidden = True
            Case "Just Totals"
                Worksheets("IS").Rows("12:165").EntireRow.Hidden = False
                Worksheets("IS").Rows("12:25").EntireRow.Hidden = True
                Worksheets("IS").Rows("28:61").EntireRow.Hidden = True
                Worksheets("IS").Rows("64:91").EntireRow.Hidden = True
                Worksheets("IS").Rows("93:155").EntireRow.Hidden = True
        End Select
    End If

    'Turn events back on so this code triggers again
    Application.EnableEvents = True
End Sub

我们可以将VBA挂钩到很多事件(SelectionChange,DoubleClick,Workbook_Close等)。在这种情况下,我们正在与Worksheet_Change()挂钩。

每次此工作表发生更改时,都会触发此代码。 Target变量将保存触发事件的范围。因此,我们测试Target是否与Range("B8")相交,这意味着B8已更改。然后我们在If块内执行代码。

我将If/ElseIf转换为Select/Case只是因为我们一遍又一遍地测试单个条件(B8的值),因此它使代码更清晰。

在此代码中,我们还关闭了Excel应用程序EnableEvents功能。此功能允许首先触发此Worksheet_Change()。通常在代码中我们对工作表进行更多更改(例如,隐藏行或列),这将触发应用程序再次运行Worksheet_Change() ...当它已经运行Worksheet_Change()时。这可能会导致代码无法运行,并且通常会导致无限循环,从而导致excel崩溃。

答案 1 :(得分:0)

此代码需要粘贴到您希望执行代码的工作表上。一旦代码存在,您也不需要使用工作表限定范围。

如果没有Worksheets("IS").,您可以直接参考您的范围:
 Rows("so and so").EntireRow.Hidden = True

您现在也可以像变量一样引用TargetRange变量:
If MyTarget = "Just Revenue" Then

我在代码中插入了您的一个条件作为示例

Option Explicit

Private Sub worksheet_change(ByVal target As Range)

Dim MyTarget As Range
Set MyTarget = Range("B8")

If Not Intersect(target, MyTarget) Is Nothing Then
Application.EnableEvents = False

'Your CODE HERE
If MyTarget = "Show All" Then
Rows("12:165").EntireRow.Hidden = False
End If

Application.EnableEvents = True
End If

End Sub