Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Fortschritt einer Schleife anzeigen

Fortschritt einer Schleife anzeigen
03.08.2015 12:03:53
Uli
Hallo liebe Experten.
ich lese aus einem externen Programm jeden Monat per VBA eine txt-Datei in eine Excel-Tabelle ein. Außerdem formatiert die Programmierung diese Datei. Die Datei hat ca. 40.000 Zeilen. 8 Schleifen prüfen jeweils diese Zeilen auf bestimmte Varianten und optimieren diese Tabelle. Das ganze dauert ca. 20-30 min.
Meine Frage. Kann ich in meiner Userform einen Fortschritt einbauen, der mir anzeigt, bei wieviel % ich angekommen bin? Gibt es sowas?
lg
Uli

Anzeige

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Fortschritt einer Schleife anzeigen
03.08.2015 12:09:35
Sepp
Hallo Uli,
ja das geht.
Lade eine Beispieldatei mit ein paar Hundert Zeilen und deinem UF hoch.
Gruß Sepp

AW: Fortschritt einer Schleife anzeigen
03.08.2015 16:46:48
Uli
Danke Sepp,
komme leider erst später zum hochladen.
lg. Uli

Anzeige
AW: Fortschritt einer Schleife anzeigen
03.08.2015 12:43:54
Daniel
Hi
ich vermute mal, dass dein Code noch Verbesserungspotential hat und sich die Bearbeitungszeit noch deutlich nach unten bringen lässt.
ansonsten ist der einfachste Weg den Fortschritt anzuzeigen, die Statusleiste am unteren Fensterrand.
dort zeigt Excel normalerweise an, was es gerade macht, du kannst diese Zeile aber auch für eigene Hinweise nutzen.
Beispielsweise so:
For i = 1 to 1000
Application.Statusbar = "Schleife 1, bearbeitet: " & Format(i / 1000, "0%")
Next
For i = 1 to 1000
Application.Statusbar = "Schleife 2, bearbeitet: " & Format(i / 1000, "0%")
Next
Application.Statusbar = False ' gibt die Statusleiste wieder für Excel frei
ansonten gibt es in der Userform noch das Steuerelement "Progressbar"
falls es in deiner Werkzeugsammlung nicht vorhanden ist, kannst du es über das Kontextmenü "weitere Steuerelemente" hinzufügen ("Microsoft Progressbar Control")
in der Schleife dann den .Value-Wert der Progressbar mit einem Wert zwischen 1 und 100 befüllen, dieser wird dann angezeigt.
Aber wie gesagt, vorrangiges Ziel sollte sein, die Bearbeitungszeit soweit nach unten zu bringen, dass eine Progressbar nicht notwendig ist und daher dem Ratschlag von Sepp folgen und erst mal eine Beispieldatei mit deinem Code und aussagekräftigen Beispielwerten hochladen.
Gruß Daniel

Anzeige
AW: Fortschritt einer Schleife anzeigen
04.08.2015 09:06:25
Uli
Guten Morgen,
ich habe die Datei nun angefügt. Ich musste Sie natürlich aus Datenschutz erheblich verändern und kürzen, aber damit kann man trotzdem arbeiten.
https://www.herber.de/bbs/user/99307.xlsm

AW: Fortschritt einer Schleife anzeigen
04.08.2015 10:01:13
Sepp
Hallo Uli,
abseits eine Fortschritsanzeige, solltest du deinen Code erst einmal optimieren.
Anstatt 5 mal 20000 Zeilen abzuklappern geht das mit einem Aufwaschen. Und auch die Zeilen im Block zu löschen anstatt einzeln ist viel schneller. Und so zieht sich das durch den ganzen Code.
Beispiel:
Sub Hauptprogramm()
Dim zeile7 As Integer
Dim rngDel As Range
Dim lngR As Long

'On Error GoTo fehler
Application.ScreenUpdating = False

'Worksheets(2).Name = Worksheets(1).Cells(16, 2)
Call Tabelle_formatieren
'zeile7 = 1

With Sheets(1)
  For lngR = 1 To .Cells(.Rows.Count, 1).End(xlUp).Row
    If Left(.Cells(lngR, 1), 1) = "*" Or Left(.Cells(lngR, 1), 16) = "Abrechnungsliste" Or _
      Left(.Cells(lngR, 1), 1) = "=" Or Left(.Cells(lngR, 1), 11) = "Suchbegriff" Or _
      Left(.Cells(lngR, 1), 1) = "-" Then
      If rngDel Is Nothing Then
        Set rngDel = .Cells(lngR, 1)
      Else
        Set rngDel = Union(rngDel, .Cells(lngR, 1))
      End If
    End If
  Next
  If Not rngDel Is Nothing Then rngDel.EntireRow.Delete
End With

'Do
' If zeile7 > 20000 Then Exit Do
' If Left(Sheets(1).Cells(zeile7, 1), 1) = "*" Then
' Sheets(1).Cells(zeile7, 1).EntireRow.Delete
' Else
' zeile7 = zeile7 + 1
' End If
'Loop
'zeile7 = 1
'Do
' If zeile7 > 20000 Then Exit Do
' If Left(Sheets(1).Cells(zeile7, 1), 16) = "Abrechnungsliste" Then
' Sheets(1).Cells(zeile7, 1).EntireRow.Delete
' Else
' zeile7 = zeile7 + 1
' End If
'Loop
'zeile7 = 1
'Do
' If zeile7 > 20000 Then Exit Do
' If Left(Sheets(1).Cells(zeile7, 1), 1) = "=" Then
' Sheets(1).Cells(zeile7, 1).EntireRow.Delete
' Else
' zeile7 = zeile7 + 1
' End If
'Loop
'zeile7 = 1
'Do
' If zeile7 > 20000 Then Exit Do
' If Left(Sheets(1).Cells(zeile7, 1), 11) = "Suchbegriff" Then
' Sheets(1).Cells(zeile7, 1).EntireRow.Delete
' Else
' zeile7 = zeile7 + 1
' End If
'Loop
'zeile7 = 1
'Do
' If zeile7 > 20000 Then Exit Do
' If Left(Sheets(1).Cells(zeile7, 1), 1) = "-" Then
' Sheets(1).Cells(zeile7, 1).EntireRow.Delete
' Else
' zeile7 = zeile7 + 1
' End If
'Loop

Call Seitenumbruch_loeschen
Call zeilen_auffuellen
Call Leerzeile_einfuegen
Call HHST_anpassen
Call Datum_erstellen
Call WfB
Call Krippe
Call IGruppe
Call IKrippe
Call AW
fehler:
'Worksheets(1).Activate 'Zielblatt aktivieren
'Worksheets(1).Cells(1, 1).Select
'Worksheets(1).[b22].Value = "Fehler! " & Format(Now(), "DD.MM.YY")
'Application.ScreenUpdating = True
'
'Sheets(1).Range("a:g").Columns.AutoFit 'stellt Spaltenbreite optimal ein
'[b22] = "formatiert"
'Sheets(1).Name = "formatierte Liste"
''Sheets("Menü").Select
'Range("B2").Select

End Sub


Gruß Sepp

Anzeige
AW: Fortschritt einer Schleife anzeigen
04.08.2015 11:14:52
Uli
Danke Sepp, hab ich gemacht. Der code ist natürlich jetzt viel kürzer. Aber in meiner Original-Datei dauert die Prozedur dennoch ca. 10 Min.
Gibt es dafür eine Fortschrittsanzeige?

Sepps Vorschlag gilt auch für Subs
04.08.2015 11:31:28
EtoPHG
Ulli,
Denn deine Prozeduren
Call Seitenumbruch_loeschen
Call zeilen_auffuellen
Call Leerzeile_einfuegen
Call HHST_anpassen
Call Datum_erstellen
Call WfB
gehen nochmals alle 20'000 Zeile durch: Also integriere deren Code in Sepps For-Next Schlaufe!
Es ist nicht zielführend auf eine Fortschrittsanzeige zu beharren, solange der Code nicht wenigstens ansatzweise optimiert ist.
Gruess Hansueli

Anzeige
AW: Fortschritt einer Schleife anzeigen
04.08.2015 11:32:09
Rudi
Hallo,
der ist nicht nur kürzer sondern spart auch ein paar Schleifen und somit Laufzeit.
Du kannst noch das Entfernen der Seitenumbrüche integrieren.
With Sheets(1)
For lngR = 1 To .Cells(.Rows.Count, 1).End(xlUp).Row
If Left(.Cells(lngR, 1), 1) = "*" Or Left(.Cells(lngR, 1), 16) = "Abrechnungsliste" Or _
Left(.Cells(lngR, 1), 1) = "=" Or Left(.Cells(lngR, 1), 11) = "Suchbegriff" Or _
Left(.Cells(lngR, 1), 1) = "-" Then
If rngDel Is Nothing Then
Set rngDel = .Cells(lngR, 1)
Else
Set rngDel = Union(rngDel, .Cells(lngR, 1))
End If
End If
If Len(.Cells(lngR, 3)) - Len(Replace(.Cells(lngR, 3), "-", "")) = 2 Then
If rngDel Is Nothing Then
Set rngDel = .Cells(lngR, 1).Offset(-1).Resize(, 4)
Else
Set rngDel = Union(rngDel, .Cells(lngR, 1).Offset(, -1).Resize(, 4))
End If
Next
If Not rngDel Is Nothing Then rngDel.EntireRow.Delete
End With

Da geht aber noch mehr. z.B. Zeilen auffüllen.
Gruß
Rudi

Anzeige
AW: Fortschritt einer Schleife anzeigen
04.08.2015 10:09:46
Daniel
Hi
Zeilen einzeln löschen ist sehr langsam.
bei grösseren Datenmengen sollte man zum löschen von Zeilen nach Bedingung folgendes tun:
1. in einer Hilfsspalte am Tabellenende alle Zeilen die gelöscht werden sollen mit 0 markieren und die die stehen bleiben müssen mit der aktuellen Zeilennummer.
am besten mit einer Formel in diesem Stil: =Wenn(Bedingung erfüllt;0;Zeile())
Vorteil der Formellösung ist, dass man die Formel in alle Zellen gleichzeitig eintragen kann was dann auch sehr schnell geht.
2. in die überschriftenzeile der Hilfsspalte trägt man ebenfalls die 0 ein
3. zum Löschen der mit 0 markierten Zeilen dann die Aktion DATEN - DATENTOOLS - DUPLIKATE ENTFERNEN ausführen, mit der Hilfsspalte als Kriteriumsspalte.
Gruß Daniel
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige
Anzeige

Infobox / Tutorial

Fortschritt einer Schleife in Excel anzeigen


Schritt-für-Schritt-Anleitung

Um den Fortschritt einer Schleife in Excel anzuzeigen, kannst du die Statusleiste oder ein Progressbar-Steuerelement verwenden. Hier ist eine Schritt-für-Schritt-Anleitung:

  1. Statusleiste verwenden:

    • Füge in deinem VBA-Code die folgende Schleife ein, um den Fortschritt in Prozent anzuzeigen:
      For i = 1 To 1000
      Application.StatusBar = "Fortschritt: " & Format(i / 1000, "0%")
      Next
      Application.StatusBar = False ' gibt die Statusleiste wieder für Excel frei
  2. Progressbar hinzufügen:

    • Öffne das VBA-Editor und füge das Steuerelement "Microsoft Progressbar Control" hinzu, falls es nicht vorhanden ist.
    • Füge in deiner Userform eine Progressbar hinzu und aktualisiere den Wert innerhalb deiner Schleife:
      ProgressBar1.Value = (i / 1000) * 100
  3. Fortschritt in einer Zelle anzeigen:

    • Alternativ kannst du den Fortschritt auch direkt in einer Zelle anzeigen, indem du den Wert in einer bestimmten Zelle aktualisierst:
      Cells(1, 1).Value = "Fortschritt: " & Format(i / 1000, "0%")

Häufige Fehler und Lösungen

  1. Fortschritt wird nicht angezeigt:

    • Stelle sicher, dass die Codezeilen zur Aktualisierung der Statusleiste oder des Progressbars innerhalb der Schleife platziert sind.
  2. Fortschritt wird nicht korrekt berechnet:

    • Überprüfe die Schleifenbedingungen und stelle sicher, dass der Zähler korrekt hochgezählt wird.
  3. Excel friert ein:

    • Wenn du große Datenmengen verarbeitest, kann es hilfreich sein, Application.ScreenUpdating = False am Anfang deiner Prozedur zu verwenden, um die Bildschirmaktualisierung zu deaktivieren.

Alternative Methoden

  • Verwenden von Hilfsspalten: Du kannst eine Hilfsspalte am Ende deiner Tabelle verwenden, um die Zeilen zu markieren, die gelöscht werden sollen. Dies beschleunigt den Löschvorgang erheblich.
  • Bedingte Formatierung: Setze bedingte Formatierungen ein, um beim Durchlaufen der Daten visuelle Indikatoren anzuzeigen.

Praktische Beispiele

Hier ist ein vollständiges Beispiel, wie du den Fortschritt in einer Schleife und in einer Zelle anzeigen kannst:

Sub FortschrittAnzeigen()
    Dim i As Long
    Dim totalZeilen As Long
    totalZeilen = 1000 ' Beispielwert

    For i = 1 To totalZeilen
        Application.StatusBar = "Fortschritt: " & Format(i / totalZeilen, "0%")
        Cells(1, 1).Value = "Fortschritt: " & Format(i / totalZeilen, "0%")
        ' Deine weitere Verarbeitung hier
    Next i
    Application.StatusBar = False
End Sub

In diesem Beispiel wird sowohl der Fortschritt in der Statusleiste als auch in der Zelle A1 angezeigt.


Tipps für Profis

  • Optimierung des Codes: Reduziere die Anzahl der Schleifen und verwende effizientere Algorithmen, um die Verarbeitungsgeschwindigkeit zu erhöhen.
  • Verwende Arrays: Wenn du mit großen Datenmengen arbeitest, kann das Arbeiten mit Arrays die Geschwindigkeit erheblich verbessern.
  • Debugging: Nutze die Debugging-Funktionen in VBA, um Engpässe in deinem Code zu identifizieren.

FAQ: Häufige Fragen

1. Wie kann ich den Fortschritt in Prozent anzeigen? Du kannst den Fortschritt in Prozent anzeigen, indem du den aktuellen Schleifenindex durch die Gesamtanzahl der Schleifen dividierst und das Ergebnis formatierst.

2. Was mache ich, wenn Excel während der Schleife einfriert? Deaktiviere die Bildschirmaktualisierung zu Beginn deiner Prozedur mit Application.ScreenUpdating = False und aktiviere sie am Ende wieder mit Application.ScreenUpdating = True.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige