Microsoft Excel

Herbers Excel/VBA-Archiv

Informationen und Beispiele zum Thema Userform
BildScreenshot zu Userform Userform-Seite mit Beispielarbeitsmappe aufrufen

Fortschrittsbalken + Keine Rückmeldung

Betrifft: Fortschrittsbalken + Keine Rückmeldung von: Alex
Geschrieben am: 08.03.2016 16:21:15

Hallo zusammen,

ich habe eine Berechnung (aus mehreren Subs, userformen,...) die ca. 1-3 Minuten läuft nach Start-Klick.
Teilweise kommt auch nach der Hälfte "Keine Rückmeldung" in der Userform, aber wenn man wartet, wird hinterher alles korrekt angezeigt.

Frage1: Ich habe mir schon selber aus verschiedenen Baukästen einen Fortschrittsbalken gebastelt, funktioniert auch super für EINE For-schleife...
Die Funktion bei mir hat aber an die 10 Schleifen, wobei 2 Schleifen wahrscheinlich für 95% der Laufzeit verantwortlich sind. Es würde also reichen, wenn ich diese 2 Schleifen abdecke und daraus mir einen Gesamtfortschritt bastel.

Hat jemand sowas schon mal gemacht oder ist das möglich?
Hab selber leider keine Ahnung wie das aussehen könnte....

Frage 2: Gibt es eine Möglichkeit, dass "Keine Rückmeldung" unterdrückt wird?
Habe was mit "DoEvents" gefunden, aber leider wurde mir nicht klar, wie ich das anwenden muss bzw. an welche Stelle ich das schreib muss.
Der Fehler tritt an einer "For each" Schleife auf, an der er 1-2 Minuten rumrechnet.

DANKE!!
Gruß Alex

  

Betrifft: 10 Schleifen? von: RPP63
Geschrieben am: 08.03.2016 17:00:26

Hi Alex!
Schon klar, dass sich Schleifen manchmal nicht verhindern lassen.
Ich will nichts versprechen, aber hier wurde Code schon um den Faktor 2.000 beschleunigt.
Schon mal über Arrays nachgedacht.
Anyway: die Kenntnis des Codes wäre nicht verkehrt.
Ich lasse hier natürlich offen.

Gruß Ralf


  

Betrifft: AW: 10 Schleifen? von: Alex
Geschrieben am: 09.03.2016 10:05:10

Hallo Ralf,

Hier in einem anderen Thread von mir, hat jemand mir einen Tipp gegeben und dadurch hat sich das Programm um den Faktor 1000 beschleunigt, der Hammer, was ein kleiner "Codebaustein" ausmacht :)
Leider ist meine Datei zu groß, um sie direkt hier im Forum hochzuladen.
Daher leider auf einem externen Server.
Nicht wundern über den Inhalt der Worksheets, habe einfach mit aaa dfg etc. den Inhalt ersetzt.

http://www.file-upload.net/download-11376619/HerberForum.xlsm.html

Alle für den Fortschrittsbalken relevanten Sub's sind in Modul 1 und Userform PB1.
Bedienung für den Fortschrittsbalken:
-Excel öffnen
- "Kick" auf Unterstützungstool für anlaufprojekte
- Links oben unter der Kategorie Immobilien "Neubau" auswahlen
- auf anzeigen klicken
Dann kommt der Fortschrittsblaken für eine Schleife (Sub checkliste) der 2 aufwendigen schleifen

Wie schaffe ich auch noch einen Fortschrittsbalken für den "Sub Gruppieren" einzubauen
und dann natürlich ein Traum, die beiden Fortschrittsbalken in einem darzustellen.
Besten Dank für jede Hilfe!

Gruß Alex


  

Betrifft: nur ein Hinweis, von: Michael
Geschrieben am: 14.03.2016 15:59:31

Hi Alex,

ich persönlich mag keine Datein, die auf irgendwelchen Servern liegen - es muß doch möglich sein, sie so abzuspecken, daß sie ins Forum passen: ca. 350 KB ist schon ein Haufen Holz!

Aber gut: ich sehe beim Überfliegen nirgends "10 Schleifen"; gib bitte an, in welchem Modul welche Sub/Function der Übeltäter ist.

Was definitiv falsch ist, ist der Block in Modul1:

Sub gruppieren() ' Hier soll auch eine Fortschrittsbalken hinterlegt werden

     Dim rngZelle As Range
      
For Each rngZelle In Worksheets("PM").UsedRange.Columns(1).Cells
      If Left(rngZelle.Value, 2) = "1." Or _
         Left(rngZelle.Value, 2) = "2." Or _
         Left(rngZelle.Value, 2) = "3." Or _
         Left(rngZelle.Value, 2) = "4." Or _
         Left(rngZelle.Value, 2) = "5." Or _
         Left(rngZelle.Value, 2) = "6." Or _
         Left(rngZelle.Value, 2) = "7." Or _
         Left(rngZelle.Value, 2) = "8." Or _
         Left(rngZelle.Value, 2) = "9." Or _
         Left(rngZelle.Value, 2) = "10." Or _
         Left(rngZelle.Value, 2) = "11." Or _
         Left(rngZelle.Value, 2) = "12." Or _
         Left(rngZelle.Value, 2) = "13." Or _
         Left(rngZelle.Value, 2) = "14." Or _
         Left(rngZelle.Value, 2) = "15." Or _
         Left(rngZelle.Value, 2) = "16." Or _
         Left(rngZelle.Value, 2) = "17." Or _
         Left(rngZelle.Value, 2) = "18." Or _
         Left(rngZelle.Value, 2) = "19." Or _
         Left(rngZelle.Value, 2) = "20." Then
           rngZelle.Rows.Group
      End If
Next rngZelle
ActiveSheet.Outline.ShowLevels RowLevels:=1
End Sub
Das Ding ist a) relativ langsam, weil es alle Zellen "im Blatt" durchläuft; das Ermitteln des untersten Wertes und Laden in ein Array ist ein bißchen schneller.

Der "echte" Fehler ist allerdings die Abfrage ab "10.": mit "left" holst Du Dir nur die linken 2 Werte, und "10." hat 3 Zeichen. Ich würde nach dem "." suchen, und wenn der an 2. oder 3. Position liegt, schauen, ob links Zahlen bzw. Ziffern sind:
Sub gruppieren() ' Hier soll auch eine Fortschrittsbalken hinterlegt werden

     Dim rngZelle As Range
     Dim t As String, p As Long
     Const ziffern = ".1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20."
For Each rngZelle In Worksheets("PM").UsedRange.Columns(1).Cells
   t = rngZelle.Text
   p = InStr(t, ".")
   If p = 2 Or p = 3 Then
     t = Left(t, p)
     If InStr(ziffern, "." & t) > 0 Then rngZelle.Rows.Group
   End If
Next rngZelle
ActiveSheet.Outline.ShowLevels RowLevels:=1
     
End Sub
Vielleicht hilft Dir das ein Stückchen weiter...

Schöne Grüße,

Michael