Anzeige
Archiv - Navigation
1364to1368
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Fehlerbehandlung in For Loop bei fehlendem Objekt

Fehlerbehandlung in For Loop bei fehlendem Objekt
13.06.2014 18:17:53
Malcolm_p

Hallo mit folgendem Code-Fragment frahe ich die Labels eine UF ab welche zuvor dynamisch erzeugt wurden. Naturlich gibt es eine Fahlermeldung wenn ein Objrkt nicht zu finden ist. wie kann ich diese umgehen und den fehlerhaften Wert i einfacch weiter hochzählen lassen. ich hab schon ne menge probiert, bspw. mit Resume Next und goto, aber nichts hilft immer wieder der Laufzeitfehler. Ich bitte um einen Hinweis
Herzlichen Dank!
For i = 2 To x 'MsgBox FGT.Name
If Charge.Controls("Label" & (i)).BackColor = &H8000000D Then
Set OptXPR = Sheets(TgtTAB).Columns(OptCH.Column).Find(what:=CDbl(Mid(Charge.Controls("Label" & (i)).Caption, 10, 8)), lookat:=xlWhole, LookIn:=xlValues)
p = i
' MsgBox FGT.Name & " das gewählte Feld wurde gewechselt"
For o = OptXPR.Row To Sheets(TgtTAB).Cells(Rows.Count, 4).End(xlUp).Row
If Sheets(TgtTAB).Cells(o, 4).Value = CDbl(Mid(Charge.Controls("Label" & (i)).Caption, 10, 8)) Then
l = o
If Sheets(TgtTAB).Cells(o, 5) = 1 Then
FGT.Label101 = Format(CDbl(Charge.Label101) - CDbl(Sheets(TgtTAB).Cells(o, 9)), "#,0.00 €")
Charge.Label102 = Format(CDbl(Charge.Label102) - CDbl(Sheets(TgtTAB).Cells(o, 9)), "#,0.00 €")
End If
If Sheets(TgtTAB).Cells(o, 5) = "0" Then
Charge.Label101 = Format(CDbl(Charge.Label101) - Sheets(TgtTAB).Cells(o, 9), "#,0.00 €")
End If
Charge.Label105 = Format(Charge.Label105 - (Sheets(TgtTAB).Cells(o, 10)), "#,0.00 €")
Charge.Label103 = "./. " & Format(((CDbl(Charge.Label101) - CDbl(Charge.Label105)) / CDbl(Charge.Label102)), "#,0.00 %")
Charge.Label104 = "./. " & Format(CDbl(Charge.Label101) - CDbl(Charge.Label105), "#,0.00 €")
End If
Charge.Controls("Label" & (i)).BackColor = &H8000000F
Next o
If CDbl(Mid(Charge.Controls("Label" & (i)).Caption, 10, 8)) = CDbl(Mid(FGT.Caption, 10, 8)) Then
Exit Sub
Else
End If
End If
Next i

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Fehlerbehandlung in For Loop bei fehlendem Objekt
13.06.2014 19:18:39
Christian
Hallo Malcolm,
ohne jetzt deine Codezeilen im einzelnen zu durchforsten - wenn du die Controls zuvor dynamisch erzeugt hast, müssten dir diese doch eigentlich auch bekannt sein!
"On Error Resume Next" ist idR. eine schlechte Idee, aber wenn's denn sein soll:
Was ist denn im VBE unter "Extras" - "Optionen" - "Allgemein" - "Unterbrechen bei Fehler" ausgewählt?
Gruß
Christian

AW: Fehlerbehandlung in For Loop bei fehlendem Objekt
13.06.2014 21:32:10
Mullit
Hallo,
hiermit wärst Du von den Bezeichnungen durch i generiert unabhängig:
(Denk' dran Option Explicit und Deine Variablendeklarationen zu eränzen)
Public Sub extract()

Dim ctrControl As Control

For Each ctrControl In Charge.Controls
  If TypeOf ctrControl Is MSForms.Label Then
    If ctrControl.BackColor = &H8000000D Then
      Set OptXPR = Sheets(TgtTAB).Columns(OptCH.Column).Find(what:=CDbl(Mid(ctrControl.Caption, _
         10, 8)), lookat:=xlWhole, LookIn:=xlValues)
      p = CLng(Mid$(ctrControl.Name, Len(TypeName(ctrControl)) + 1, _
         Len(ctrControl.Name) - Len(TypeName(ctrControl))))
      ' MsgBox FGT.Name & " das gewählte Feld wurde gewechselt" 

      For o = OptXPR.Row To Sheets(TgtTAB).Cells(Rows.Count, 4).End(xlUp).Row
        If Sheets(TgtTAB).Cells(o, 4).Value = CDbl(Mid(ctrControl.Caption, 10, 8)) Then
            l = o
            If Sheets(TgtTAB).Cells(o, 5) = 1 Then
              FGT.Label101 = Format(CDbl(Charge.Label101) - CDbl(Sheets(TgtTAB).Cells(o, 9)), _
               "#,0.00 €")
             Charge.Label102 = Format(CDbl(Charge.Label102) - CDbl(Sheets(TgtTAB).Cells(o, 9)), _
               "#,0.00 €")
    
            End If
            If Sheets(TgtTAB).Cells(o, 5) = "0" Then
              Charge.Label101 = Format(CDbl(Charge.Label101) - Sheets(TgtTAB).Cells(o, 9), _
               "#,0.00 €")
            End If
            Charge.Label105 = Format(Charge.Label105 - (Sheets(TgtTAB).Cells(o, 10)), "#,0.00 €")
            Charge.Label103 = "./. " & Format(((CDbl(Charge.Label101) - _
              CDbl(Charge.Label105)) / CDbl(Charge.Label102)), "#,0.00 %")
            Charge.Label104 = "./. " & Format(CDbl(Charge.Label101) - CDbl(Charge.Label105), _
              "#,0.00 €")
        End If
        Charge.ctrControl.BackColor = &H8000000F
      Next o
      If CDbl(Mid(Charge.ctrControl.Caption, 10, 8)) = CDbl(Mid(FGT.Caption, 10, 8)) Then
        Exit Sub
      End If
    End If
  End If
Next i
End Sub


VBA/HTML - CodeConverter für Office-Foren
AddIn für Excel/Word 2000-2010 - komplett in VBA geschrieben von Lukas Mosimann
Projektbetreuung durch mumpel



Code erstellt und getestet in Office 12
Gruß,

Anzeige
AW: Fehlerbehandlung in For Loop bei fehlendem Objekt
13.06.2014 22:16:52
Mullit
Hallo,
im letzten Teil muß 2xmal Charge entfernt werden:
'... 
        ctrControl.BackColor = &H8000000F
      Next o
      If CDbl(Mid(ctrControl.Caption, 10, 8)) = CDbl(Mid(FGT.Caption, 10, 8)) Then
        Exit Sub
      End If
    End If
  End If
Next i
End Sub


VBA/HTML - CodeConverter für Office-Foren
AddIn für Excel/Word 2000-2010 - komplett in VBA geschrieben von Lukas Mosimann
Projektbetreuung durch mumpel



Code erstellt und getestet in Office 12

Gruß,

Anzeige
AW: Fehlerbehandlung in For Loop bei fehlendem Objekt
18.06.2014 18:08:34
Malcolm_p
Christian, besten Dank...!

AW: Fehlerbehandlung in For Loop bei fehlendem Objekt
14.06.2014 10:35:29
Nepumuk
Hallo,
ich würde die Labels beim erzeugen einfach in eine, auf Modulebene deklarierte, Collection stecken. Eine Collection kannst du mit For-Each durchlaufen und du brauchst weder irgendeine Abfragen noch eine Fehlerbehandlung in deiner Schleife. Du musst nur, falls du einzelne Labels zur Laufzeit auch wieder entfernst, diese auch aus der Collection zu löschen. Nicht vergessen, in Terminate-Event des Userforms die Collection auf Nothing setzen! Genau für solche Fälle gibt es die Collection-Klasse.
Gruß
Nepumuk

AW: Fehlerbehandlung in For Loop bei fehlendem Objekt
14.06.2014 16:19:50
Mullit
Hallo Nepumuk,
uh ja, deutlich besser...Danke!
Gruß, Mullit

Anzeige
AW: Fehlerbehandlung in For Loop bei fehlendem Objekt
18.06.2014 17:54:55
Malcolm_p
Zunächst ein ganz herzliches Dankeschön an Mullit und Nepumuk...
für den Hinweis in Richtung Collection-Klasse. Leider reichen meine Kenntnisse zu VBA bei weitem nicht aus, auch nur annähernd eine derartige Klasse zu erstellen geschweige denn ans Laufen zu bekommen. Auch ist es mir auf einer fünfstündigen Zugfahrt von Berlin nach Köln nicht gelungen, mir die Systematik an Hand eines Besipiels plausibel zu machen. Daher meine Bitte, ob jemand gelegentlich einen Code hat, der Collection nutzt, welchen ich mir mal intensiv anschauen kann.
Danke für die Unterstützung.
Gruß Malcolm

Anzeige
AW: Fehlerbehandlung in For Loop bei fehlendem Objekt
18.06.2014 18:32:40
Nepumuk
Hallo,
eine Collection ist eine integrierte Klasse der VB-DLL. Die musst du nur deklarieren, instanziieren und benutzen:
' **********************************************************************
' Modul: UserForm1 Typ: Userform
' **********************************************************************

Option Explicit

Private mobjCollection As Collection

Private Sub CommandButton1_Click()
    
    'Beispiel für eine Schleife über alle Labels
    
    Dim objLabel As MSForms.Label
    
    For Each objLabel In mobjCollection
        
        MsgBox objLabel.Name & " - " & objLabel.Caption
        
    Next
End Sub

Private Sub UserForm_Activate()
    
    Dim objLabel As MSForms.Label
    Dim lngIndedx As Long
    
    Set mobjCollection = New Collection
    
    For lngIndedx = 1 To 5
        
        Set objLabel = Controls.Add("Forms.Label.1")
        
        With objLabel
            
            .Left = 10
            .Top = lngIndedx * 20
            .Caption = "Hallo " & CStr(lngIndedx)
            
        End With
        
        mobjCollection.Add objLabel, objLabel.Name
        
        Set objLabel = Nothing
        
    Next
End Sub

Private Sub UserForm_Terminate()
    Set mobjCollection = Nothing
End Sub

Mal so auf die schnelle hingeschmiert. Einfach ein neues Userform einfügen, darauf unten rechts einen Commandbutton und dazu obigen Code.
Gruß
Nepumuk

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige