Ich habe ein Arbeitsblatt voller ActiveX-Steuerelemente. Ich weiß, dass sie auf Arbeitsblättern fehlerhaft sind, also ist dies die Funktion, die ich implementiert habe, um die Steuerelemente zurückzusetzen und ihr Verhalten in Schach zu halten.VBA-Fehlerhandler schlägt für "For Each __ in __" beim Verweis auf ActiveX-Steuerelemente fehl: Laufzeitfehler 438
Das Problem ist, dass der Error-Handler keinen Laufzeitfehler 438 abfängt, der auftritt, weil versucht wird, auf die Eigenschaft auto-size einer ListBox zuzugreifen (Listenfelder haben keine Eigenschaft für automatische Größe. daher der Laufzeitfehler 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
Es begann Probleme hat, wenn ich eine neue ActiveX-List-Box hinzugefügt, was seltsam ist, weil ich schon ein anderes hatte, die nie Probleme hatte.
Danke für jede Hilfe, die jemand zu bieten hat!
Edit:
Dank Mat, dass es.
Der neue Code funktioniert mit:
...
'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
Warum brauchen Sie "On Error GoTo 0" nicht? Ich musste immer das Fehlerverhalten zurücksetzen, oder macht Resume innerhalb des Fehlerhandlers das für Sie? –
@BryanHarper Sie brauchen nur 'GoTo 0', um" Fehlerbehandlung zurückzusetzen "(normalerweise nach dem Setzen von 'On Error Resume Next') -' On Error GoTo' sind immer prozedur-lokal, so dass es nach einer sauberen Laufzeitbehandlung nichts zurücksetzen kann Error; das 'Resume'-Schlüsselwort setzt den Fehlerzustand zurück (Beweis: Versuche,' Resume' aufzurufen, ohne in einem Fehlerzustand zu sein ;-) –