繁体   English   中英

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

[英]VBA: hide and unhide code not working

我是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

对于为什么我的代码不起作用的任何帮助,或任何改进它的技巧都将非常感激。

重写Worksheet_Change:

在您的VBE中,将此代码粘贴到“ IS”工作表的代码表中(在“ Project - VBAProject窗格中双击它。如果“ Project - VBAProject窗格在您的VBE中不可见,请转到“ 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 Applications EnableEvents功能。 此功能使该Worksheet_Change()首先被触发。 通常,在代码中,我们会对工作表进行更多更改(例如,隐藏行或列),这将触发应用程序再次运行Worksheet_Change() ,而已在运行Worksheet_Change() 这可能导致代码多余地运行,并且经常导致无尽的循环,使excel崩溃。

该代码需要粘贴到您想要执行代码的工作表上。 一旦有了代码,您就不需要使用表格来限定范围。

您可以直接引用您的范围,而无需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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM