【问题标题】:VBA Error Handler Fails for "For Each __ in __" While Referencing ActiveX Controls: Run-time Error 438引用 ActiveX 控件时“对于 __ 中的每个 __”的 VBA 错误处理程序失败:运行时错误 438
【发布时间】:2016-08-15 02:47:25
【问题描述】:

我有一个充满 ActiveX 控件的工作表。我知道它们在 Worksheets 上存在问题,所以这是我实现的功能,用于重置控件并检查它们的行为。

问题是错误处理程序没有捕获由于尝试访问列表框的自动大小属性而发生的运行时错误 438(列表框没有自动大小属性,因此运行时 438 错误)。

    Public Sub RefreshCtrlSheet(Optional ByRef HiddenElements As Variant)

    'This sub refreshes ActiveX Objects on the Ctrl Sheet
    Dim objX As Object          'Holds OLEObjects from Control Sheet
    Dim tempWidth As Double     'Store size of object to restore
    Dim tempHeight As Double    'after resetting
    Dim tempLeft As Double
    Dim tempTop As Double
    Dim i As Integer

    With Sheet1

        'Error Handler
        On Error GoTo NotTheObjsUrLooking4

        For Each objX In .OLEObjects

            'If Name has Button in it
            If InStr(objX.Name, "Button") > 0 Then

                'Implement different button sizes
                If objX.Name = "LoadDataButton" Then
                    tempHeight = 24.75
                    tempWidth = 24.75
                Else
                    tempHeight = 30
                    tempWidth = 80
                End If

            Else
                tempHeight = objX.Height
                tempWidth = objX.Width
            End If

            'Check to see if elements should be hidden
            If Not IsMissing(HiddenElements) Then
                For i = 1 To UBound(HiddenElements)
                    If InStr(objX.Name, HiddenElements(i)) Then
                        objX.Visible = False
                    End If
                Next i
            End If

            tempLeft = objX.Left
            tempTop = objX.Top

            'Autosize to refresh shingking controls (ActiveX Bug)
            objX.object.AutoSize = True '----------------------RUNTIME ERROR HERE!
            objX.object.AutoSize = False
            objX.Width = tempWidth
            objX.Height = tempHeight
            objX.Left = tempLeft
            objX.Top = tempTop

NotTheObjsUrLooking4: '----------------------------THIS WORKS EVERY OTHER ERROR
        Next objX

    On Error GoTo 0
    End With
End Sub

当我添加一个新的 ActiveX 列表框时,它开始出现问题,这很奇怪,因为我已经有了另一个,但从未出现过问题。

感谢任何人提供的任何帮助!

编辑:

谢谢Mat,就是这样。

新代码适用于:

...
'Error Handler
On Error GoTo CleanFail
...

'Other code

...
NotTheObjsUrLooking4:
      Next objX
   End With 
   On Error GoTo 0
Exit Sub

CleanFail:
   Err.Clear
   Resume NotTheObjsUrLooking4
End Sub

【问题讨论】:

    标签: vba foreach error-handling runtime-error activex


    【解决方案1】:

    这不是 VBA 中错误处理的工作方式。

    是的,它是一个跳转,但它是一个到错误处理子程序的跳转NotTheObjsUrLooking4 不是子程序,它只是一个“继续”标签,是您的控制流/逻辑的一部分。

    制作CleanFail 标签:

        ...
        Exit Sub
    
    CleanFail:
        Err.Clear
        Resume NotTheObjsUrLooking4
    End Sub
    

    然后调整您的On Error 语句以跳转到CleanFail

        On Error GoTo CleanFail
    

    这将使执行跳出循环并进入错误处理子例程,这会清除错误并基本上说这些不是您要查找的 droids 对象 em>...并继续下一次迭代。

    删除On Error GoTo 0,你不需要它。

    【讨论】:

    • 为什么不需要“On Error GoTo 0”?我一直认为您需要重置错误行为,或者错误处理程序中的 Resume 是否会为您执行此操作?
    • @BryanHarper 你只需要GoTo 0 来“重置错误处理”(通常在设置On Error Resume Next 之后)-On Error GoTo 跳转总是过程本地的,所以在干净地处理后没有什么需要重置的运行时错误; Resume 关键字重置错误状态(证明:尝试在不处于错误状态的情况下调用 Resume ;-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-01
    相关资源
    最近更新 更多