Wachten totdat scherm is afgesloten.

Status
Niet open voor verdere reacties.

dandiep

Gebruiker
Lid geworden
18 apr 2016
Berichten
27
Goedenavond,

Ik heb een vraag over tijdelijk stoppen van VBA uitvoering zolang een formulier open is.
Het gewenste gedrag:
1) Er loopt een import procedure;
2) Na de import procedure wordt (indien van toepassing) formulier1 geopend met de records die niet zijn geïmporteerd. (omdat ze niet aan bepaalde voorwaarden voldoen) ;
3) Na het sluiten van formulier 1 wordt formulier 2 geopend. ( weergave van de geïmporteerde records)
4 Indien alle records zijn geïmporteerd worden stap 2+3 overgeslagen en zal formulier 2 direct worden geopend.

In stap 3 ligt mijn uitdaging.

Ik had gehoopt dat dit op te lossen was door het formulier modaal en pop-up te maken, maar dit werkt helaas niet.
Ik wil dit niet met een timer oplossen, maar puur op basis van de interactie met de gebruiker, wanneer formulier 1 gesloten is.
Op het WWW heb ik diverse mogelijkheden gevonden, de meest logische (naar mijn inzicht) is:

Samenvatting van de code:

Code:
DoCmd.OpenForm "formulier 1", acFormDS, , , acFormReadOnly, acDialog
     
        Dim oAccessObject As AccessObject
        Dim IsLoad As Boolean
        Dim cFormName As String
        cFormName = "frmDuplicateRecords"
        
        Do
            Set oAccessObject = CurrentProject.AllForms(cFormName)
            If oAccessObject.IsLoaded Then
                If oAccessObject.CurrentView <> acCurViewDesign Then
                    IsLoaded = True
                End If
            End If
        Loop While IsLoaded = True
        
        DoCmd.OpenForm "formulier 2", acFormDS, , , acFormEdit, acWindowNormal

Het probleem hier is echter dat Access vastloopt als ik deze code laat lopen terwijl het in debug mode prima werkt.

Heeft iemand een idee hoe dit het beste aangepakt kan worden?

Groeten,
Danny
 
Niet zo :). Ik heb nooit problemen met 'gestopte' code als het formulier met acDialog wordt geopend. Ik snap dus niet waarom jij er wél problemen mee hebt. En waarom check je een geopend formulier op Design modus? Dat lijkt mij de laatste status waar je last van zou kunnen hebben.
Maar doe er een voorbeeldje bij zou ik zeggen, want deze procedure moet echt probleemloos kunnen werken.
 
Ik heb een test project gemaakt waarbij zich hetzelfde probleem voor doet.
Ik heb de code iets aangepast, maar het probleem blijft zich voor doen.
Het lijkt er dat mijn machine hangt zodra deze een loop uitvoert.

Nu sta ik nog voor de uitdaging...115kb gezipt is >=100kb en kan niet worden geupload....:mad:
 
Met WinRar kun je een zip maken die uit deelbestanden van 100kb bestaan. Andere optie: hernoem de zip naar bestand.xlsb, dan kun je ineens 1Mb uploaden. Wij veranderen de extensie dan wel weer.
 
Bedankt, hierbij de bijlage.

Test.xlsb hernoemen naar Test.accdb.

Gr.
Danny
 

Bijlagen

Je hebt er twee formulieren ingezet die helemaal niks doen. Daar kun je toch niks op controleren?
 
Beste Octafish,

Het projectje bevat twee lege formulieren omdat dit een projectje is om het principe uit te vogelen, .Ontdaan van alle overige informatie blijft het probleem aanwezig.

Als ik de code start wordt frmForm1 geopend en bevriest het beeld meteen. Als ik vervolgens het formulier probeer te sluiten krijg ik de melding dat access niet reageerd.

Werkt het bij jou wel?
 
Jouw code niet nee. En dat is logisch omdat hij in een loop terecht komt die het formulier geopend houdt. En omdat er verder geen enkele actie plaats vindt (kan vinden) kom je daar ook nooit meer uit. Je hebt een kamer voor jezelf gemetseld zonder ramen en deuren, waarbij je vanuit de binnenkant de laatste steentjes hebt gelegd. En nu vraag je jezelf verwonderd af waarom je de kamer niet uit kan...
 
Beste Octafish,

Het kon natuurlijk niet anders dan dat er weer een mooie metafoor zou komen..., waarvoor dank.
De subtiele hints hebben me al menig keer verder geholpen :thumb:r, maar deze keer helaas niet.

Ik open formulier 1, en wacht tot deze is gesloten voordat er ander code uitgevoerd mag worden. Het lijkt er op dat de DO "nothing" WHILE form1 IS OPEN mijn zelf gebouwde booby trap is.

Ik heb mijn doel maar eens in een plaatje uitgewerkt.
Ik weet dat je meestal geen concrete oplossingen geeft maar meer subtiele hints geeft (een gewaardeerde methodiek). Zo je me deze keer iets concreter kunnen helpen?

Alvast bedankt voor de hulp.

Gr.


Bekijk bijlage Form explanation bw.pdf
 
Prachtig plaatje, en dat is best te doen denk ik. Maar, zoals je in je plaatje al laat zien, gebeurt er van alles op formulier 1. Althans: dat hoop ik dan toch :). En dat is dus de grap waar je nu tegen aan loopt: je doet niks, anders dan een formulier openen en wachten. Een beetje wat wij in Rotterdam doen: afgedankte spelers kopen en dan hopen dat je kampioen wordt :D. Of, zoals ik vandaag tegen een Amsterdamse collega zei: ik weet dat Johan Cruyff dood is, maar ook dan hebben we meer aan hem in de spits dan aan Michiel Kramer...
Kortom: het openen van formulier 2 is afhankelijk van een gebeurtenis op formulier 1. En zolang je die niet hebt, valt er niks te triggeren. Persoonlijk zou ik dus die gebeurtenis als trigger gebruiken om formulier 1 te sluiten en 2 te openen, en niet het kijken naar of formulier 1 nog wel open staat of niet.
 
:d:d:d:d:d
Mijn indruk is echter niet dat het probleem niet in het triggeren zit, maar in loopen.
Zodra je in een loop zit kun je niets anders meer doen.

Ik heb nu een lang sub zoals in de afbeelding uitgelegd.
Mijn gevoel zegt nu dat ik formulier 1 aan het einde van een sub moet openen en bij het sluiten van formulier 1 een nieuwe sub moet aanroepen met de resterende code.

Is loopen een gebruikelijke methode om code te laten wachten?

Gr.
Danny
 
Mijn gevoel zegt nu dat ik formulier 1 aan het einde van een sub moet openen en bij het sluiten van formulier 1 een nieuwe sub moet aanroepen met de resterende code.
Niet erg wetenschappelijk.... Wellicht heb je veel sneller een bruikbaar antwoord als je eens vertelt wat nu eigenlijk de bedoeling is. Een loop maken die alleen loopt heeft m.i. niet zoveel zin. Kun je beter een timer gebruiken. Maar dan nog...
 
Wachten totdat scherm is afgesloten - DE OPLOSSING

Goedenavond en EUREKA!

Na een overleg met mijn gewaardeerde college Edwin Broeks heb ik de gouden tip toegepast...

DoEvents is de truc!

Zie bijlage voor een werkende oplossing.
De bijlage renamen van .xls naar .accdb en voila, veel plezier er mee!

Bekijk bijlage test.xls

Ook OctaFish bedankt voor het meedenken en de vlotte reactie tijden!

Gr.
Danny

Code:
Option Compare Database
Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)         'Required for Sleep command.

Function TestForm()
    Dim oAccessObject As AccessObject
    Dim IsLoaded As Boolean
    Dim cFormName As String
    cFormName = "frmForm1"
       
    IsLoaded = True
    DoCmd.OpenForm "frmForm1"
    
    Do
        Set oAccessObject = CurrentProject.AllForms(cFormName)
        If oAccessObject.IsLoaded Then
            Sleep 100                                                   'This reduced my CPU load from ~35% to 2%!!!!
            DoEvents                                                    'This is the trick to prevent a continous hourglass and frozen MS Access screens! Many thanks to Edwin Broeks!
        Else
            IsLoaded = False
        End If
    Loop While IsLoaded = True
    
    DoCmd.OpenForm "frmForm2"
End Function
 
Laatst bewerkt:
tip

Ik denk dat ik zoiets gelijkaardigs doe maar tegelijk een stap verder ga; nml bij het importeren van een inschrijvingslijst wordt er vooraleer die eigenlijke procedure wordt gestart een pop-up formulier getoond met daarin een aantal subformuliertjes waar de mogelijke fouten in de inschrijvingslijst worden getoond, de gebruiker krijgt een standaard messagebox melding of hij de importprocedure wil verderzetten (gebruiker heeft nml in één oogopslag gezien dat de fouten niet"levensbedreigend" zijn) of hij kan nee kiezen en dan dubbelklikken op die recordkiezers van de fouten en die dan direct aanpassen in de inschrijvijngslijst, als die fouten dan zijn aangepast en de gebruiker sluit dat pop-up formulier dan loopt de importprocedure verder. Op die manier zie ikdus dat als dat pop-up formulier leeg is dat ik gerust de import kan verder zetten en vervalt dus de stap om de niet geïmporteerde records te tonen en moet je niet meer gaan zoeken wat de fout nu eigenlijk was, etc..... :thumb:
 
En dat is dus precies wat ik steeds bedoel: Formulier 1 doet wat, dan klik je ergens op, of laat je wat acties triggeren, en dan sluit je het formulier en open je formulier 2. Wat dandiep doet is een formulier openen, dan niks en dan moet het proces zichzelf maar zien te redden :). Ik vind het maar onlogisch....
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan