Progressbar

  • Excel

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von Sam85.

    Progressbar

    Hallo,

    ich wollte eine Progressbar in einen Prozess mit einbinden. Gefunden habe ich das hier. Nun hab ich mich gefragt ob Sheet1.Cells.Clear als angegebener Prozess sich auf das hier bezieht Cells(i, 1).Value = j ?
    Und wenn ich sowas dann ich meinen Prozess mit einarbeiten will (siehe 4), beziehe ich mich dann erst auf die Worksheets und dann auf die Zeilen die übertragen werden? Oder sollte ich besser vorher alle Worksheets mit den Zeilen in ein Array packen und daraus den Bezug schaffen? Freue mich über Feedback.

    (1) aus dem Bsp. Link
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Sub code()
    2. Dim i As Integer, j As Integer, pctCompl As Single
    3. Sheet1.Cells.Clear
    4. For i = 1 To 100
    5. For j = 1 To 1000
    6. Cells(i, 1).Value = j
    7. Next j
    8. pctCompl = i
    9. progress pctCompl
    10. Next i
    11. End Sub



    (2) aus dem Bsp. Link
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Sub progress(pctCompl As Single)
    2. frmPB.Text.Caption = pctCompl & "%"
    3. frmPB.Bar.Width = pctCompl * 2
    4. DoEvents
    5. End Sub



    (3) aus dem Bsp. Link
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Option Explicit
    2. Private Sub UserForm_Activate()
    3. Me.Caption = ""
    4. Call code
    5. End Sub




    (4)
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Option Explicit
    2. Dim wks As Worksheet, cntCol As Long, cntRow As Long, fzeile As Long, tbl As ListObject
    3. Dim wkz As Worksheet, arr As Variant, i As Integer, wsf As WorksheetFunction, cntarr As Variant, y As Integer
    4. Dim cntTbl As Long, lr As ListRow, x As Long
    5. Sub Import()
    6. Set wsf = Application.WorksheetFunction
    7. Set wkz = ThisWorkbook.Worksheets("Data")
    8. cntCol = wkz.Cells(1, Columns.Count).End(xlToLeft).Column
    9. cntRow = wkz.Cells(Rows.Count, 1).End(xlUp).Row
    10. Set tbl = wkz.ListObjects(1)
    11. cntTbl = tbl.ListRows.Count
    12. For x = cntTbl To 1 Step -1
    13. Set lr = tbl.ListRows(x)
    14. lr.Delete
    15. Next x
    16. For Each wks In Worksheets
    17. If wks.Name <> "Data" And wks.Name <> "Data2" Then
    18. cntCol = wks.Cells(1, Columns.Count).End(xlToLeft).Column
    19. cntRow = wks.Cells(Rows.Count, 1).End(xlUp).Row
    20. 'letzte Zeile in Spalte 3
    21. fzeile = wkz.Cells(wkz.Rows.Count, 3).End(xlUp).Row
    22. wks.Range(wks.Cells(2, 1), wks.Cells(cntRow + 1, cntCol - 2)).Copy Destination:=wkz.Cells(fzeile, 3)
    23. End If
    24. Next
    25. cntCol = wkz.Cells(1, Columns.Count).End(xlToLeft).Column
    26. cntRow = wkz.Cells(Rows.Count, 1).End(xlUp).Row
    27. wkz.Range(wkz.Cells(cntRow, 1), wkz.Cells(cntRow, cntCol)).Delete
    28. wkz.Cells(2, 1).FormulaLocal = "=Zeile(A1)"
    29. wkz.Cells(2, 2).FormulaLocal = "=Links([@[ns1:HMV]];2)"
    30. End Sub


    Ganz ehrlich: Ich hab keine Ahnung, was Du meinst. Das externe Beispiel zur Implementierung ist ja simpel. Aber dann geht's los:

    Sam85 schrieb:

    Nun hab ich mich gefragt ob Sheet1.Cells.Clear als angegebener Prozess sich auf das hier bezieht Cells(i, 1).Value = j ?
    What? Sheet1.Cells.Clear löscht aus Sheet1 den Inhalt aller Zellen. Daher kapier bei dem Satz überhaupt nicht, was Du erfahren willst. »als angegebener Prozess«? Hat das irgendwas mit Deiner Wunsch-Progressbar zu tun? Und was ist das mit dem, wie Du das einbinden musst? Bleibt doch Dir überlassen. Bzw.: Was willst Du denn als Fortschritt angezeigt bekommen? Bisher hast Du eine For-Schleife über den Import der Worksheets. Das ist als Wert für die Fortschrittsanzeige nutzbar. D.h. Du kannst den Wert der PBar immer dann um 1 erhöhen, wenn die For-Schleife beim Next angekommen ist (bzw. beim End If). Dazu erstmal rausfinden, wieviele Worksheets es gibt, die die Bedingung aus Zeile 21 erfüllen (diese Zahl ist dann Dein Maximum), und dann eben die bisherige For-Schleife durcharbeiten. Ggf. sinnvoller dann mit For x = 1 To statt mit For Each, damit Du das x als aktuellen Wert für Deine PBar nutzen kannst.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    Ach ich hab einfach übersehen, dass das "Clear" nur dazu da war, um Platz zu machen (Beispiel Code). :) Wollte nur das Beispiel richtig verstehen. Ist ja einfach nur das in 100 Zeilen die Werte von 1 bis 1000 erstellt werden sollen (was dann ja nach 100 Zellen aufhört..wenn ich das Beispiel richtig verstanden habe).

    Und ja du hast recht nun will ich es in meinen Code implementieren :)...hatten zwischendurch noch erfahren, dass es auch ein fertiges Steuerelement gibt (aber irgendwie scheint das in Excel 2016 nicht mehrvorhanden zu sein). Weißt du etwas darüber? Hab da ein dutzend Sachen gelesen und probiert aber klappen will da nichts. (hat irgendwie mit der mscomctl.ocx zu tun). Naja und nun kehre ich wieder zum manuellen Beispiel zurück :).

    Mit dem Code komme zähle ich die Blätter..kann ich das so auch machen?
    Spoiler anzeigen

    VB.NET-Quellcode

    1. cntWks = 0
    2. For Each wks In Worksheets
    3. If Left(wks.name, 2) = "PG" Then cntWks = cntWks + 1
    4. Next wks



    Und nun wollte ich den übrigen Code einspeisen...hier ist mir jedoch nicht bewusst, ob "a" einfach die prozentuale Darstellung und "j" das Zählen der Blätter darstellt?
    Spoiler anzeigen

    VB.NET-Quellcode

    1. frmMenü.Frame_Sheet.Visible = True
    2. For a = 1 To 100
    3. For j = 1 To 1000
    4. Next j
    5. pctCompl = a
    6. progress pctCompl
    7. Next a



    Und dann wollte ich es in den Code verpflanzen...und hier hab ich mir dann überlegt zwei Progressbars zu machen (einmal für die Sheets und einmal für die Zeilen aus dem jeweiligen Sheet).
    Ich vermute das zweite ist relativ einfach, da ich ja bereits eine Zählung habe in einer For-Next-Schleife
    Spoiler anzeigen

    VB.NET-Quellcode

    1. For Each wks In Worksheets
    2. If Left(wks.name, 2) = "PG" Then
    3. cntCol = wks.Cells(1, Columns.Count).End(xlToLeft).Column
    4. cntRow = wks.Cells(Rows.Count, 1).End(xlUp).Row
    5. 'Spalte mit HMV und "." austauschen mit der Spalte HMV ohne "."
    6. For i = 2 To cntRow
    7. If wks.Cells(i, 18) <> "" Then
    8. wks.Cells(i, 5) = wks.Cells(i, 18)
    9. End If
    10. Next i
    11. 'letzte Zeile in Spalte 3 aufsuchen
    12. fzeile = wkz.Cells(wkz.Rows.Count, 3).End(xlUp).Row
    13. wks.Range(wks.Cells(2, 1), wks.Cells(cntRow + 1, cntCol - 2)).Copy Destination:=wkz.Cells(fzeile, 3)
    14. End If
    15. Next wks

    Sam85 schrieb:

    Mit dem Code komme zähle ich die Blätter

    Sam85 schrieb:

    einmal für die Sheets und einmal für die Zeilen aus dem jeweiligen Sheet

    Sam85 schrieb:

    in einer For-Next-Schleife
    Geht es dir um empirische Versuche oder um das Zählen an sich?
    Es gibt sowohl die Property Worksheets.Count als auch Rows.Count.
    Damit ist ganz schnell gezählt.

    Visual Basic-Quellcode

    1. For Each wks In Worksheets
    2. Debug.Print wks.Name & ": " &wks.UsedRange.Rows.Count
    3. Next
    Da lohnt sich dann auch kein Progressbar, weil das so schnell geht, dass der ruckzuck von 0 auf 100 wäre.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --