我是excel-Macros的新手,因此我找不到下面的宏压碎我的excel的原因(在mac和win上)。因此,我想尝试简化公式,将许多if减少到单个公式。你能帮忙吗?
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之间的行越少。 B8的值越小,隐藏行的数量越多,隐藏行的值越清。
答案 0 :(得分:3)
您可以先将整个行集13-34设置为可见(junit/textui/TestRunner runFailed
),然后根据.Hidden = False
中的值设置要隐藏的行数。
我还认为您只想在Range(" B8")中的值发生更改时才运行此代码,因此您可以在Range("B8").Value
事件中添加一行来检查:{{ 1}}。
代码
Worksheet_Change
答案 1 :(得分:0)
这很慢,因为每次代码更改工作表时,都会再次调用change事件。因此,您处于一个可以递归运行许多更改事件的位置。
要查看代码中最初发生的情况,您可以使用F8“逐步”执行序列。您将看到标记何时到达Clear语句,再次调用Worksheet_Change事件
您可以通过跟踪在子例程之外声明的变量完成原始更改事件的时间来停止此操作,如下所示:
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
答案 2 :(得分:0)
自动计算的机会正在减慢你的速度。在缓慢的功能中关闭它总是一个好主意。
Private Sub Worksheet_Change(ByVal Target As Range)
Application.Calculation=xlCalculationManual
Application.EnableEvents = False
....
Application.Calculation=xlCalculationAutomatic
Application.EnableEvents = True
End Sub