2016-04-21 2 views
1

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 

Antwort

1

Das ist nicht, wie Fehlerbehandlungs Arbeiten in VBA.

Ja, es ist ein Sprung, aber es ist ein Sprung zu einer Fehlerbehandlungsunterprogramm. NotTheObjsUrLooking4 ist kein Unterprogramm, es ist nur ein "Weiter" -Label, das Teil Ihres Kontrollflusses/Logik ist.

Machen Sie ein CleanFail Label:

... 
    Exit Sub 

CleanFail: 
    Err.Clear 
    Resume NotTheObjsUrLooking4 
End Sub 

Und dann On Error Anweisung anpassen, anstatt zu CleanFail springen:

On Error GoTo CleanFail 

Das wird die Ausführung Sprung aus der Schleife und in diese Fehlerbehandlung machen Unterprogramm, das den Fehler löscht und grundsätzlich sagt das sind nicht die Droiden Objekte, die Sie suchen ... und res geht zur nächsten Iteration über.

Entfernen Sie On Error GoTo 0, Sie brauchen es nicht.

+0

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? –

+0

@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 ;-) –

Verwandte Themen