我是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
为什么我的代码无法正常工作或任何改进提示的任何帮助都会非常感激。
答案 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