Microsoft Excel

Herbers Excel/VBA-Archiv

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

Ladebalken

Betrifft: Ladebalken von: Philipp
Geschrieben am: 13.04.2015 09:50:10

Hallo Zusammen,

Ich habe in einem älteren Beitrag ( https://www.herber.de/forum/archiv/900to904/902228_Ladebalken_fuer_Makros.html - zweitletzte Antwort) eine sehr schöne Beispieldatei gefunden, wie ein Ladebalken über ein vba-Formular generiert wird (1. Beispiel).

Diesen Ladebalken wollte ich gerne in meiner Datei integrieren, wobei ich gänzlich versagt habe und auf eure Hilfe hoffe. Ich habe schon viel rum probiert, aber bekomme jedes mal einen anderen Fehler. Leider befasse ich mich erst seit kurzer Zeit mit VBA und bin daher (noch) kein Profi :)

Meine Vorgehensweise:
Ich war so frech und habe das Formular (Den Balken) einfach mal in mein Excel-dokument gespeichert. Der erste Unterschied zur Beispieldatei ist, dass meine Subs nicht in einem externen Modul, sondern in den Worksheets stehen.

Dieser Code steht in in meinem Worksheet Tabelle1:

'Initialisierung für den Prozessbalken
Public SW As Long
Public Schritt As Double
Public Länge As Double


Public Sub plan_load_Click()

Dim i As Long
Dim speichergroesse As Long
Dim pep_zeilen As Long
Dim woche_zeilen As Long
Dim erste_ladezeile As Long

If Tabelle9.Cells(1, 2) > 0 Then

PB1.Show

erste_ladezeile = 0
pep_zeilen = 7
woche_zeilen = 12
i = 3
speichergroesse = Tabelle9.Cells(2, 1)

'Deklarationen für den Prozessbalken
SW = 3005                                       'Schrittweite festlegen
Länge = 0
Schritt = PB1.Label1.Width / SW

    While i <= speichergroesse 'Routine laden ins PEP-Modell
    
        If Tabelle9.Cells(i, 1) = Tabelle1.Cells(1, 3) Then
        
            If erste_ladezeile = 0 Then
            erste_ladezeile = i 'Definiert die erse Zeile des Speicherblocks der ausgewählten  _
Filiale
            End If
                                        
            If pep_zeilen = 22 Or pep_zeilen = 42 Or pep_zeilen = 62 Or pep_zeilen = 82 Or  _
pep_zeilen = 102 Or pep_zeilen = 122 Then
            pep_zeilen = pep_zeilen + 5
            End If
                       
'blablabla
        
        pep_zeilen = pep_zeilen + 1
        i = i + 1
        
        Else
        
        i = i + 105
        
        End If
        
            If pep_zeilen = 141 Then
            i = i + 1000000
            End If
            
        Länge = Länge + Schritt
        PB1.Label2.Width = Länge
        PB1.Label3.Caption = Format(i / SW, "0 %")
        DoEvents
    
    Wend
    
    i = erste_ladezeile
    
    While woche_zeilen < 216 'Routine: Laden in die Wochenpläne
                       
'bla bla bla
        
        woche_zeilen = woche_zeilen + 7
        i = i + 1
        
    Wend
    
    Unload PB1
    
    MsgBox "Planung geladen..."

Else

MsgBox "Zu dieser Filiale wurde noch kein Plan gespeichert!"

End If

End Sub
"Unnötigen Code", bei welchem einfach nur irgendwelche Dinge hin und her kopiert werden habe ich durch ein "'bla bla bla" ersetzt :)

In meinem Formular steht folgendes:
Option Explicit

Public SW As Long

Public Sub UserForm_Activate()
SW = 0
Label2.Width = 0
Call Tabelle1.plan_load_Click


End Sub


Bin für jede Hilfe dankbar!

Liebe Grüße, Philipp

  

Betrifft: AW: Ladebalken von: fcs
Geschrieben am: 13.04.2015 10:41:55

Hallo Philipp,

du solltest den Code für den Fortschrittsbalken in einem allgemeinen Modul belassen, da Variablen als Public deklariert werden und dies funktioniert nur in allgemeinen Modulen.

Da du im Code bei allen Zellobjekten mit den Code-Namen der Tabellenblätter arbeitest sollten auch keine Probleme bei der Bearbeitung der Zellen auftreten.


Achtung: wenn du einen 64-bit Rechner verwendest könnte DoEvents Probleme machen. Zumindest hatte ich da kürzlich einen Problemfall, dass die Anzeige der Sytemzeit in Textboxen Kummer bereitete.

Gruß
Franz


  

Betrifft: AW: Ladebalken von: Philipp
Geschrieben am: 13.04.2015 16:08:44

Hallo Franz,

Erstmal vielen Dank für deine Antwort!
Ich habe nun folgendes getan...

Das steht in meinem Code der Tabelle1:

Public Sub plan_load_Click()

Call plan_load_modul

End Sub
Dies habe ich getan, damit er auf den button reagiert.

Im Modul habe ich nun das eingebaut, was ich vorhin im Code der Tabelle1 hatte.

Im Code des Formulars steht folgendes:
Option Explicit

Public Sub UserForm_Activate()
SW = 0
Label2.Width = 0
Call plan_load_modul

End Sub
Wenn ich jetzt den button klicke, erscheint folgender Fehler:

Laufzeitfehler '400':
Formular wird bereits angezeigt und kann daher nicht gebunden dargestellt werden.


Beim Klick auf Debuggen wir die Zeile PB1.Show markiert.

Hat jemand eine Idee?

Und dann noch eine Frage zu DoEvents: Kann ich das einfach weg lassen? was macht es überhaupt?

Nochmals vielen Dank,
Philipp


  

Betrifft: AW: Ladebalken von: fcs
Geschrieben am: 13.04.2015 16:34:07

Hallo Philipp,

das Makro zur Schaltfläche muss das Userform starten

Public Sub plan_load_Click()

 PB1.Show  'Name des Userforms ggf. anpassen

End Sub
Frage zu DoEvents: Kann ich das einfach weg lassen?
Hier nicht! Dann bleibt die Balkenanzeige auf einem festen Wert stehen.

Mit DoEvents wird die Steuerung an das Betriebssystem übergeben.
In der Summe wird dadurch die Anzeige des UF nach jedem Durchlauf deiner Schleife aktualisiert.

Was man ggf. machen muss, wenn man ein 64-bit-System hat weiss ich nicht.

Gruß
Franz


  

Betrifft: AW: Ladebalken von: Philipp
Geschrieben am: 13.04.2015 17:49:46

Hallo Franz,

Na logisch... sitze heute einfach schon zu lange vorm PC :)

Vielen, vielen Dank!

PS: Ich habe jetzt mal DoEvents verwendet, bei mir funktioniert es.
Ich hoffe bei den Kollegen, die mit dem Tool arbeiten müssen tut es das auch :D