[英]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.