VBA - END IF

时间:2016-07-10 07:30:40

标签: excel excel-vba error-handling runtime vba

我对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

2 个答案:

答案 0 :(得分:1)

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

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

我添加了一个宽条件,以便只有在父工作表中包含ActiveSheet property时代码才会运行。由于其他工作表(甚至是其他工作簿)的更改,工作表可能具有触发计算事件的volatile¹公式。

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

¹当整个工作簿中的任何内容发生变化时,不仅在影响其结果的某些内容发生变化时,挥发性函数都会重新计算。 易失性函数的示例包括INDIRECTOFFSETTODAYNOWRANDRANDBETWEENCELLINFO工作表函数的某些子函数也会使它们变得不稳定。

答案 1 :(得分:0)

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

 <?php
foreach($folderFiles as $file)
                $metaArg1=array();
                        foreach ($file->ResourceMeta as $key => $value) {

                            $metaArg1[$value->key] = $value->value;

                        }
}
echo $metaArg1['doc_Type'];

                    ?>