【问题标题】:VBA - Runtime error with END IFVBA - END IF 的运行时错误
【发布时间】:2016-11-12 09:09:21
【问题描述】:

我对 VBA 比较陌生。当我在工作表上工作时,我创建了一个代码,它根据列行中的条件自动隐藏/取消隐藏行(0 取消隐藏/1 隐藏)。这个相对简单的宏运行良好,直到我添加了不同的工作表。由于此表中没有宏,我认为它不相关。但是现在每次它都会在 END IF 函数上出现运行时错误,我不知道如何解决它。可能有一个简单的解决方案,但我找不到。

代码如下:

    Private Sub Worksheet_Calculate()
    Application.ScreenUpdating = False
    Dim LastRow As Long, c As Range
    Application.EnableEvents = False
    LastRow = Cells(Cells.Rows.Count, "BA").End(xlUp).Row
        On Error Resume Next
        For Each c In Range("BA34:BA56,BA73:BA74,BA76:BA107")
        If c.Value = 1 Then
            c.EntireRow.Hidden = True
        ElseIf c.Value = 0 Then
            c.EntireRow.Hidden = False
    End If
    Next
    On Error GoTo 0
    Application.EnableEvents = True
    Application.ScreenUpdating = True
    End Sub

【问题讨论】:

  • 可能不是错误的根源,但您可以将整个 If ... Else ... End If 包含为 c.EntireRow.Hidden = CBool(c.Value)
  • 该错误是否比“运行时错误”更能说明任何内容
  • 删除或注释掉 On Error Resume Next 并将父工作表引用应用于范围对象。由于其他工作表上的更改,该工作表可能具有触发计算事件的易失公式。
  • LastRow 应该做什么?
  • 如果父工作表不活动,这是否必须运行?另一个工作表中的更改会影响此工作表中的 BA 列吗?

标签: excel error-handling runtime vba


【解决方案1】:

如果您想要更完整的调试信息,请删除或注释掉 On Error Resume Next。在像 Worksheet_Calculate 一样频繁运行的事件宏中应该不需要它。

将父工作表引用应用于范围对象。由于其他工作表上的更改,该工作表可能具有触发计算事件的易失公式。

我添加了一个宽条件,以便代码仅在父工作表包含ActiveSheet property 时运行。由于另一个工作表(甚至另一个工作簿)的更改,工作表可能具有触发计算事件的易失性¹公式。

LastRow 在分配后什么都不做(这是有问题的)所以我删除了它。

我将Range.Hidden 属性简化为一行。

Private Sub Worksheet_Calculate()
    If Me.Name = Activesheet.Name Then
        Application.ScreenUpdating = False
        Application.EnableEvents = False
        Dim c As Range
        For Each c In Me.Range("BA34:BA56,BA73:BA74,BA76:BA107")
            c.EntireRow.Hidden = CBool(c.Value2)
        Next c
        Application.EnableEvents = True
        Application.ScreenUpdating = True
    End If
End Sub

¹ 当整个工作簿中的任何内容发生变化时,可变函数都会重新计算,而不仅仅是在影响其结果的某些内容发生变化时。 volatile 函数的示例有 INDIRECTOFFSETTODAYNOWRANDRANDBETWEENCELLINFO 工作表函数的一些子函数也会使它们变得易变。

【讨论】:

  • 感谢您的回复。事实上,最初的错误只是运行时错误,宏需要很长时间才能工作。工作表只是“Sheet1”。用你的建议替换它,它说运行时错误“1004”。非常感谢您的帮助和快速响应。
  • 只是为了完成线程。我根据您编写的代码和我的代码的组合解决了它,因为 0 也应该是取消隐藏的触发器。我猜是错误行导致了这个问题。
  • 我实际上并不理解这个问题,因为CBool(0) 解析为False。在几乎任何编程语言中,False 等于零,在布尔术语中,任何不为假的都是真;例如#define False 0:#define True Not False。
【解决方案2】:

只是为了完成线程。我根据您编写的代码和我的代码的组合解决了它,因为 0 也应该是取消隐藏的触发器。我猜是错误行导致了这个问题。

    Private Sub Worksheet_Calculate()
    Application.ScreenUpdating = False
    Dim LastRow As Long, c As Range
    Application.EnableEvents = False
    LastRow = Cells(Cells.Rows.Count, "BA").End(xlUp).Row
    On Error Resume Next
    For Each c In Range("BA34:BA56,BA73:BA74,BA76:BA107")
       If c.Value = 1 Then
            c.EntireRow.Hidden = True
        ElseIf c.Value = 0 Then
            c.EntireRow.Hidden = False
        End If
    Next
    Application.EnableEvents = True
    Application.ScreenUpdating = True
    End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-16
    • 2021-11-10
    • 2014-08-30
    • 2018-12-23
    相关资源
    最近更新 更多