VBA formulier loopt vast op Me.Hide

Status
Niet open voor verdere reacties.

Jesse99

Gebruiker
Lid geworden
2 dec 2010
Berichten
13
De titel is misschien niet echt duidelijk, dus ik zal zo uitgebreid mogelijk laten zien wat het probleem is.
Ik ben aan het werk met VBA onder Excel 2003.

Ik heb een formulier gemaakt met 2 knoppen, om 2 verschillende rapporten automatisch te laten maken. Het formulier is heel simpel, en is genaamd "Rapport".
De knoppen hebben de namen "btnKlant" en "btnSig" meegekregen.

De code achter het formulier ziet er als volgt uit:
Code:
Private Sub btnKlant_Click()
    Me.Tag = 0
    Me.Hide
End Sub

Private Sub btnSig_Click()
    Me.Tag = 1
    Me.Hide
End Sub

De code die het formulier aanroept ziet er zo uit (heb even enkel de code gerelateerd tot het formulier en de verwerking ervan genomen):
Code:
Sub RapportMaken()
    ' Userform Rapport.
    Dim myForm As Rapport
    Set myForm = New Rapport

    ' Show the custom MsgBox, asking to make report for Customer (0) or Sig (1).
    myForm.Show

    Select Case myForm.Tag
    Case 0
        ' Contains code to make report for customer.
    Case 1
        ' Contains code to make report for team Sig.
    End Select

    ' Unload the MsgBox form.
    Unload myForm
    Set myForm = Nothing
End Sub

Als ik de Sub "RapportMaken" uitvoer, komt het formulier naar voren en vraagt mij netjes welke van de 2 rapporten ik wil maken. Maar het maakt niet uit op welke knop ik klik, het formulier verdwijnt een milliseconde en verschijnt terug. Het lijkt alsof de "Me.Hide" niet wordt uitgevoerd, en het programma vastzit in een oneindige lus.

Maar nu komt het. Als ik de macro met Foutopsporing uitvoer, en stap voor stap ga tot op de "End Sub" na de "Me.Hide" in de formuliercode, en daarna op Afspelen klik, gaat alles helemaal goed!

Heeft iemand een idee waarom dit de soep in loopt?
 
Laatst bewerkt:
Ik kan het niet reproduceren op 2003 of 2010. De afgekorte voorbeeldcode die je opgeeft werkt perfect voor mij.

dit is wat ik heb gebruikt:
Code:
Sub test()
Dim myForm As UserForm1
Set myForm = New UserForm1
myForm.Show
Select Case myForm.Tag
Case 0
MsgBox ("0")
Case 1
MsgBox ("1")
End Select
Unload myForm
Set myForm = Nothing
End Sub
 
Laatst bewerkt:
In dat geval ga ik jouw code eens proberen, en deze dan stap voor stap uitbouwen naar de mijne. Dan moet ik het wel vinden!
 
Gevonden wat het probleem lijkt te zijn, maar nog niet waarom het er is.

Ik ben van jouw code gaan uitbouwen naar de mijne, en op het laatst had ik enkel jouw MsgBox nog in de beide Cases staan (met álles van mijn code), en het werkte. Na verwijderen van de MsgBoxen niet meer!
Lijkt wel of het programma 'ergens' even een vertraging nodig heeft...

Mijn Form heeft ShowModal op True staan, ik neem aan dat de rest van de macro op de 'Me.Hide' van het formulier wacht?

In mijn 2 Cases worden alleen enkele variabelen gedefinieerd. De programmacode staat in een For-Next blok eronder. Mijn gok is dat na het verbergen van het formulier de programmacode net iets te snel doorgaat. Hoe en waarom is me onduidelijk.

[Edit]
Het wordt nog vager. Ik heb de MsgBox (die er dus niet in moet) vervangen door een 1 seconde vertraging:
Application.Wait Now + TimeSerial(0, 0, 1)
en nu loopt alles weer op een andere foutcode vast!
Het is duidelijk geen kwestie van tijd (onmiddellijk de MsgBox sluiten geeft geen problemen).
 
Laatst bewerkt:
Formulierconflict

Het lijkt erop dat er ergens een conflict optreedt met een tweede formulier dat ik gebruik om een 'progress bar' weer te geven.

Ik heb een testbestandje bijgevoegd waarin ik het probleem gereproduceerd heb, met beide formulieren.
 

Bijlagen

Code:
doevents
is de veroorzaker. Blijkbaar gooit deze functie je vorige message terug op de stack oid. Ik ga er even mee spelen, maar door dit commando even te remarken gaat het goed. Gooi je een doevents voor je "case" werken beide opties niet meer.

*EDIT*: DoEvents kan niet goed omgaan met 2 modal schermen blijkbaar. Door progress pas te tonen nadat de selectie is gemaakt gaat het allemaal goed.
 
Laatst bewerkt:
Bedankt voor het al zo ver te testen, nu weet ik tenminste wat het probleem precies is.

Progress tonen na de keuze is niet echt mogelijk, omdat dan het programma zelf blijft wachten op een input van dit formulier. Gezien die er niet is, verschijnt er een lege Progress balk en zal het programma niet meer verder kunnen.

Vandaar dat het hoofdprogramma vanuit de 'Activate' van dit Progress formulier werd aangeroepen.
 
jawel hoor, ik heb het werkend ;)

zal het ff uploaden en deze post editen. je zal alleen de keuze over moeten brengen.
 
Laatst bewerkt:
Nogmaals bedankt, maar ik stuit toch op een probleem.

Je hebt het dan omzeild door Test op te splitsen in Test3 & Test2, en als volgt uit te voeren:
Test3 -> Progress -> Test2
Hierdoor werkt de Progressbar wel, maar de variabele 'Uitkomst' die in Test3 reeds gedefinieerd wordt, is in Test2 verloren gegaan en kan dus niet worden weggeschreven.

In de echte versie is het nog iets gecompliceerder. Daar worden alle bewerkingen uitgevoerd binnen de For-Next in Test2 die ook de Progressbar update. Deze bewerkingen zijn dan weer afhankelijk van waarden die in Test3 gedefinieerd werden aan de hand van de keuze in het Rapport formulier.
 
Laatst bewerkt:
je kunt je keuze doorgeven aan test2. Afhankelijk van de hoeveelheid variabelen kun je ze ook allemaal doorgeven. Je kunt ook gebruik maken van een aantal globale variabelen of een lijst die je tijdelijk opslaat. Er zijn dus een aantal mogelijkheden om het probleem heen.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan