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
,你不需要它。
我有一个充满 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
,你不需要它。