2016-10-07 5 views
3

Ich habe gelesen stackoverflow auf wie Fortschrittsbalken zu verwenden.Fortschrittsanzeige, reagiert nicht in VBA

Es funktioniert gut, aber nach einer kurzen Zeit 6%, Zeile 14 in meinem Array von 235 sagt es nicht reagiert, und dies bis zum Ende der Schleife.

Also ich laufe es VbModeless:

ProgressBar.Show vbModeless 

ProgressBar.Label_WhatsGoingOn.Caption = "Reading data from database.." 

projectNumber = "32966" 
docOutArray = Post.helpRequest("xdnjgjrdin.asp?Dok4=" & projectNumber) 

If CPearson.IsArrayEmpty(docOutArray) Then 
    MsgBox "No document registered in database!" 
End If 

ProgressBar.Label_WhatsGoingOn.Caption = "Creating Docout.." 

Set doc_ = NEwDocOut.createDocOutDocument(projectNumber) 

numOfRows = UBound(docOutArray, 1) 


For i = LBound(docOutArray, 1) To numOfRows 
    ProgressBar.Label_WhatsGoingOn.Caption = "Creating Row.." 

    sPercentage = (i/numOfRows) * 100 
    ProgressBar.progress (sPercentage) 

Mein progressbar Code:

Private Sub UserForm_Initialize() 
Me.Text.Caption = "0% Completed" 
End Sub 

Public Sub progress(pctCompl As Single) 

Me.Text.Caption = Format(pctCompl, "##") & "% Completed" 
Me.Bar.Width = pctCompl * 2 
Me.Repaint 
DoEvents 

End Sub 

Irgendwelche Ideen, warum dies geschieht?

enter image description here

Antwort

2

Dies hat für eine Weile ärgerlich mich gewesen, und Sie haben mich dazu veranlasst eine Antwort- zu schauen Sie danken.

Es ist tatsächlich bemerkenswert einfach, fallen nur DoEvents innerhalb der Schleife, in Ihrem Fall:

For i = LBound(docOutArray, 1) To numOfRows 
    'Add this line here: 
    DoEvents 

    ProgressBar.Label_WhatsGoingOn.Caption = "Creating Row.." 

    sPercentage = (i/numOfRows) * 100 
    ProgressBar.progress (sPercentage) 
+0

Ich denke "DoEvents" alle Ereignisse betrachtet, nicht nur die Ereignisse, die den Fortschrittsbalken aktualisieren. Im Allgemeinen ist dies kein Problem, aber wenn Sie andere Schaltflächen/Formulare haben, die geöffnet werden können, auf die die Leute klicken könnten, sollten Sie Vorkehrungen treffen, um sicherzustellen, dass diese Klicks Ihren bereits laufenden Code nicht beeinträchtigen. – Shimeon

+0

@skatun Haben Sie diese Antwort gefunden? – User632716

+0

Ja, @tompreston es funktioniert irgendwie, das Problem ist jetzt, dass manchmal die Fortschrittsbalken im Hintergrund und manchmal der Code schlägt fehl, sagend, dass Fortschrittsbalken nicht vbmodeless angezeigt werden kann, weil es bereits existiert oder etw. Ich untersuche das gerade jetzt. – skatun

2

Hier Vorschlag meine aktualisierten Code:

Public Sub progress(pctCompl As Single) 
    Me.Text.Caption = Format(pctCompl, "##") & "% Completed" 
    Me.Bar.Width = pctCompl * 2 
    Me.Repaint 
End Sub 

Public Sub setMessage(message As String, Optional percentage As Single = 0#) 
    If Not ProgressBar.Visible Then ProgressBar.Show vbModeless 
    ProgressBar.Label_WhatsGoingOn.Caption = message 
    If percentage <> 0 Then Call ProgressBar.progress(percentage) 
End Sub