Userform weergeven en ondertussen programma laten doorlopen

Status
Niet open voor verdere reacties.

VBAmateur

Gebruiker
Lid geworden
11 feb 2010
Berichten
18
Sommige VBA-code uitvoeren kost enige tijd en ik wil de gebruiker daarover informeren middels een UserForm (met een ProgressBar misschien). Maar de code na een UserForm.Show wordt pas uitgevoerd nádat de gebruiker de UserForm heeft gesloten. Heeft iemand een suggestie?
Ik ben vergelijkbare threads tegengekomen, maar nergens wordt een oplossing voor dit probleem geboden (ik kan er ook gewoon overheen gekeken hebben, wat heel goed mogelijk is :o).
Wat ik dus zou willen doen is:

Code:
MijnUserForm.Show
''---
''hier tijdrovende VBA.code
''---
MijnUserForm.Hide
Bij voorbaat dank,

VBAmateur
 
Laatst bewerkt:
Maak een Form met de naam Loading (als voorbeeld).
Zet hier een progresbar in met de naam: ProgressBar1 (als voorbeeld).
Zet hier een label in met de naam: Label1 (als voorbeeld).

Gebruik dan de volgende code...

Code:
Sub InProgress()

Dim Percentage As Long, i As Long

'opent het form loading met ShowModal als False (dan kan je andere dingen doen tijdens de uitvoering)
Loading.Show False
 
For i = 1 To 10000 'maak een loop van 1 tot 10000

'geef hier je code op die je wil laten uitvoeren, ik geef als voorbeeld een loop die de progresbar vult...

        Percentage = 100 / 10000 * i 'is het percentage wat oploopt per loop
        Loading.ProgressBar1.Value = Percentage 'vult de huidige value van de progressbar
        Loading.Label1 = Str(Percentage) & "%" 'geeft in label huidige(per loop) perc.
        DoEvents 'voer uit
Next 'loop nog een keer uitvoeren

MsgBox "Loop uitgevoerd!"

Unload Loading 'Het Form Loading weer sluiten

End Sub

Deze code wordt enorm snel uitgevoerd omdat de code weinig inhoud.
Als je in de loop een enorm proces opgang brengt zal je zien dat de progress bar zich langzaam vult totdat de loop is uitgevoerd.

Gr,
dprod
 
Laatst bewerkt:
dprod bedankt! Nog een vraagje

Dit was wat ik bedoelde. Heb wel eens eerder met DoEvents geprobeerd, maar kreeg het toen niet voor elkaar. Waarschijnlijk heb ik de instructie op de verkeerde plaats gezet. Als ik een dergelijke loop drie keer achter elkaar zou zetten, moet je dan elke keer DoEvents opnemen?
 
Misschien legt dit het duidelijk uit:

When you run a Windows Form, it creates the new form, which then waits for events to handle. Each time the form handles an event, it processes all the code associated with that event. All other events wait in the queue. While your code handles the event, your application does not respond. For example, the window does not repaint if another window is dragged on top.

If you call DoEvents in your code, your application can handle the other events. For example, if you have a form that adds data to a ListBox and add DoEvents to your code, your form repaints when another window is dragged over it. If you remove DoEvents from your code, your form will not repaint until the click event handler of the button is finished executing. For more information on messaging, see User Input in Windows Forms.

Bron: http://msdn.microsoft.com/en-us/library/system.windows.forms.application.doevents.aspx

Wanneer je DoEvents dus niet toepast ververst hij je Form niet met de nieuwe informatie die verbonden zit aan je ProgressBar & Label.

Je kan 'm uiteraard in meerdere loops laten werken, let alleen wel op dat je dan de juiste rekensom voor je percentage gebruikt.
De ProgressBar kan standaard niet boven de 100% komen (tenzij je dit instelt).
Dus als je rekensom niet klopt, kan er een error ontstaan!

In mijn rekensom gebruik ik een breukdeel * i (de loop), zo kom je altijd op 100% uit.
Als je meerdere loops gebruikt kan je het beste een variabele toevoegen die elke keer wordt opgehoogd, en deze gebruiken voor het breukdeel.
Ik heb zo 1-2-3 geen voorbeeld code...
Maar na wat geknutsel zal je er vast wel uitkomen, en zo leer je ook het snelst natuurlijk! (post desnoods je code)

Gr,
dprod
 
Ik snap het. Zal eens wat fröbelen om het uit te proberen:). Nogmaals bedankt!

Groet,

VBAmateur
 
Userform weergeven en ondertussen programma laten doorlopen in Word 2011:Mac

Ik heb dezelfde vraag maar dan voor Word 2011:Mac.
In Word 2011 is er geen optie Showmodal in de eigenschappen van het Userform.
Is er een andere oplossing?
 
Ik heb dezelfde vraag maar dan voor Word 2011:Mac.
In Word 2011 is er geen optie Showmodal in de eigenschappen van het Userform.
Is er een andere oplossing?

Allereerst excuses voor de late reactie!
Helaas heb ik zelf niets met Word, ik zou dus ook niet weten hoe je er dan mee om moet gaan.
Het kijkt me dat mijn voorbeeld code ook in MSword werkt, aangezien VBA gebaseerd is op VB6 (forms verschillen hierin niet volgens mij).
Echter kan je misschien beter een aparte post maken en MSword daarin noemen, deze post staat nu op opgelost.

Gr,
dprod
 
In Word 2011 is er geen optie Showmodal in de eigenschappen van het Userform

Helaas heb ik geen mogelijkheid om in Word 2011 te kijken, maar hier in 2003 versie staat deze optie er gewoon tussen.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan