Excelmacros执行破碎,试图简化公式

我对excelmacros很陌生,所以我没有find为什么下面的macros是粉碎我的excel(mac和win)的原因。 因此,我想尝试简化公式,把许多if减less到一个公式。 能否请你帮忙?

Private Sub Worksheet_Change(ByVal Target As Range) Dim KeyCells As Range Set KeyCells = Range("B8") If Range("B8").Value = "0" Then Rows("14:24").EntireRow.Hidden = True Rows("13").EntireRow.Hidden = False Range("B14:B24").Clear Worksheets("Sheet1").Range("B9").Value = "Open" End If If Range("B8").Value = "1" Then Rows("15:24").EntireRow.Hidden = True Rows("13:14").EntireRow.Hidden = False Worksheets("Sheet1").Range("B9").Value = "Open" Range("B15:B24").Clear End If If Range("B8").Value = "2" Then Rows("16:24").EntireRow.Hidden = True Rows("13:15").EntireRow.Hidden = False Worksheets("Sheet1").Range("B9").Value = "Open" Range("B16:B24").Clear End If If Range("B8").Value = "3" Then Rows("17:24").EntireRow.Hidden = True Rows("13:16").EntireRow.Hidden = False Worksheets("Sheet1").Range("B9").Value = "Open" Range("B17:B24").Clear End If If Range("B8").Value = "4" Then Rows("18:24").EntireRow.Hidden = True Rows("13:17").EntireRow.Hidden = False Range("B18:B24").Clear End If If Range("B8").Value = "5" Then Rows("19:24").EntireRow.Hidden = True Rows("13:18").EntireRow.Hidden = False Range("B19:B24").Clear End If If Range("B8").Value = "6" Then Rows("20:24").EntireRow.Hidden = True Rows("13:19").EntireRow.Hidden = False Range("B20:B24").Clear End If If Range("B8").Value = "7" Then Rows("21:24").EntireRow.Hidden = True Rows("13:20").EntireRow.Hidden = False Range("B21:B24").Clear End If If Range("B8").Value = "8" Then Rows("22:24").EntireRow.Hidden = True Rows("13:21").EntireRow.Hidden = False Range("B22:B24").Clear End If If Range("B8").Value = "9" Then Rows("23:24").EntireRow.Hidden = True Rows("13:22").EntireRow.Hidden = False Range("B23:B24").Clear End If If Range("B8").Value = "10" Then Rows("24").EntireRow.Hidden = True Rows("13:23").EntireRow.Hidden = False Range("B24").Clear End If If Range("B8").Value = "11" Then Rows("13:24").EntireRow.Hidden = False End If End Sub 

正如你所看到的,公式的逻辑是:B8的值越高,隐藏13到24之间的行越less。 B8的值越小,隐藏行越多,清除隐藏行的值越多。

您可以首先将整行13-34行设置为可见( .Hidden = False ),稍后根据Range("B8").Value设置Range("B8").Value设置要隐藏的行数。

我也认为只有当范围(“B8”)中的值已经改变时,才想运行此代码,因此可以在Worksheet_Change事件中添加一行以检查: If Not Intersect(Target, Range("B8")) Is Nothing Then

 Private Sub Worksheet_Change(ByVal Target As Range) Application.EnableEvents = True If Not Intersect(Target, Range("B8")) Is Nothing Then ' <-- run this code only when changing the value of B8 Select Case Target.Value Case 0 To 11 Range("B13:B24").EntireRow.Hidden = False Range("B" & 14 + Target.Value & ":B24").EntireRow.Hidden = True Range("B" & 14 + Target.Value & ":B24").Clear Case Else 'do nothing End Select End If Application.EnableEvents = True End Sub 

这很慢,因为每次您的代码更改工作表时,再次调用更改事件。 所以你处于一个你有很多recursion运行的变化事件的位置。

要查看代码中最初发生的事情,可以使用F8“逐步”序列。 当标记到达Clear语句时,您将看到Worksheet_Change事件再次被调用

您可以通过跟踪原始更改事件何时完成,并在子例程之外声明的variables来停止此操作,如下所示:

 Public booCancelChange As Boolean Private Sub Worksheet_Change(ByVal Target As Range) Dim KeyCells As Range Set KeyCells = Range("B8") 'Test whether to run If Not booCancelChange Then 'Stop recursive calls booCancelChange = True If Range("B8").Value = "0" Then Rows("14:24").EntireRow.Hidden = True Rows("13").EntireRow.Hidden = False Range("B14:B24").Clear Worksheets("Sheet1").Range("B9").Value = "Open" End If If Range("B8").Value = "1" Then Rows("15:24").EntireRow.Hidden = True Rows("13:14").EntireRow.Hidden = False Worksheets("Sheet1").Range("B9").Value = "Open" Range("B15:B24").Clear End If If Range("B8").Value = "2" Then Rows("16:24").EntireRow.Hidden = True Rows("13:15").EntireRow.Hidden = False Worksheets("Sheet1").Range("B9").Value = "Open" Range("B16:B24").Clear End If If Range("B8").Value = "3" Then Rows("17:24").EntireRow.Hidden = True Rows("13:16").EntireRow.Hidden = False Worksheets("Sheet1").Range("B9").Value = "Open" Range("B17:B24").Clear End If If Range("B8").Value = "4" Then Rows("18:24").EntireRow.Hidden = True Rows("13:17").EntireRow.Hidden = False Range("B18:B24").Clear End If If Range("B8").Value = "5" Then Rows("19:24").EntireRow.Hidden = True Rows("13:18").EntireRow.Hidden = False Range("B19:B24").Clear End If If Range("B8").Value = "6" Then Rows("20:24").EntireRow.Hidden = True Rows("13:19").EntireRow.Hidden = False Range("B20:B24").Clear End If If Range("B8").Value = "7" Then Rows("21:24").EntireRow.Hidden = True Rows("13:20").EntireRow.Hidden = False Range("B21:B24").Clear End If If Range("B8").Value = "8" Then Rows("22:24").EntireRow.Hidden = True Rows("13:21").EntireRow.Hidden = False Range("B22:B24").Clear End If If Range("B8").Value = "9" Then Rows("23:24").EntireRow.Hidden = True Rows("13:22").EntireRow.Hidden = False Range("B23:B24").Clear End If If Range("B8").Value = "10" Then Rows("24").EntireRow.Hidden = True Rows("13:23").EntireRow.Hidden = False Range("B24").Clear End If If Range("B8").Value = "11" Then Rows("13:24").EntireRow.Hidden = False End If 'Now that the original change event has completed, allow future change evnets booCancelChange = False End If End Sub 

自动加载的机会正在减慢你的速度。 在缓慢的function中closures它总是一个好主意。

 Private Sub Worksheet_Change(ByVal Target As Range) Application.Calculation=xlCalculationManual Application.EnableEvents = False .... Application.Calculation=xlCalculationAutomatic Application.EnableEvents = True End Sub