【问题标题】:Excel macro execution crushing, trying to simplify the formulasExcel宏执行粉碎,试图简化公式
【发布时间】:2017-01-23 02:07:06
【问题描述】:

我对 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的值越小,隐藏行越多,隐藏行的值被清除。

【问题讨论】:

    标签: vba excel


    【解决方案1】:

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

    我还认为您只想在 Range("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
    

    【讨论】:

    • @Michael 不客气,请点击我的答案旁边的小 V 标记为答案
    • 对于同一个项目,你能不能给我一个解决方案? stackoverflow.com/questions/41810456/… תודה רבה לך 提前!
    • 很难理解你想在那里实现什么,你能在你的帖子中添加一个屏幕截图吗,目前的情况是什么以及想要的结果是什么
    【解决方案2】:

    这很慢,因为每次您的代码更改工作表时,都会再次调用更改事件。因此,您处于一个递归运行许多更改事件的位置。

    要查看代码中最初发生的情况,您可以使用 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
    

    【讨论】:

      【解决方案3】:

      自动计算可能会减慢您的速度。在慢速函数中关闭它总是一个好主意。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-26
        • 2011-07-06
        • 1970-01-01
        • 2019-08-27
        相关资源
        最近更新 更多