VBA 引用 ActiveX 控件时 "For Each __ in __" 的错误处理程序失败:运行-时间错误 438

VBA Error Handler Fails for "For Each __ in __" While Referencing ActiveX Controls: Run-time Error 438

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

问题是错误处理程序没有捕获由于尝试访问列表框的自动大小 属性 而发生的 运行 次错误 438(列表框不没有自动调整大小 属性,因此出现 运行-time 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 ListBox 时,它开始出现问题,这很奇怪,因为我已经有另一个,从来没有问题。

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

编辑:

谢谢 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 中错误处理的方式。

是的,它是一个跳转,但它是一个到错误处理子例程的跳转。 NotTheObjsUrLooking4 不是子例程,它只是一个 "continue" 标签,是您的控制流/逻辑的一部分。

制作一个CleanFail标签:

    ...
    Exit Sub

CleanFail:
    Err.Clear
    Resume NotTheObjsUrLooking4
End Sub

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

    On Error GoTo CleanFail

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

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