Excel宏执行破碎,试图简化公式

时间:2017-01-22 13:03:14

标签: excel vba excel-vba

我是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的值越小,隐藏行的数量越多,隐藏行的值越清。

3 个答案:

答案 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