Gestire form con vbmodeless



  • Gestire form con vbmodeless
    di Fernando (utente non iscritto) data: 19/07/2017 19:54:13

    In passato ho risolto alcuni problemi grazie a questo forum.
    Spero che anche questa volta qualcuno più esperto del sottoscritto mi possa aiutare.
    Arrivo al dunque, nel moduloA richiamo un secondo moduloB con una call
    la quale all'interno esegue una UserFormxx.Show vbModeless alla fine di questo secondo modulo
    esegue unload userformxx.
    La cosa strana è che la prima volta che viene richiamato il moduloB tutto ok e cioè evidenzia
    il nome che sta elaborando.
    La seconda volta che richiamo il moduloB e per tutte le successive Call la maschera appare tutta bianca
    anche nelle posizioni della form che contiene delle costanti definite in form.
    L'elaborazione alla fine risulta esatta ma purtroppo non vedo chi sta elaborando.
    Tale informazione mi necessita in quanto è visibile lo stato dell'elaborazione visto che dura circa 20 minuti.
    In attesa di un vostro aiuto saluto cordialmente
    Fernando

    p.s. sono due anni che mi diverto a scrivere moduli per le mie figlie, però ritengo di non essere un esperto

     
    ModuloA()
    Elaborazioni generiche
    For K = 1 To ultimo
    'prelevo il nominativo e lo metto in una variabile definita public che verrà utilizzata nella userformxx.
    Call ModuloB
    Next K
    Elaborazioni conclusive
    End Sub
    
    ModuloB()
    Userformxx.Show vbModeless
    Application.Wait Now + TimeSerial(0, 0, 1)
    Esegue l'elaborazione con varie tabelle fogli ecc. ecc. alla fine
    Unload Userformxx
    End Sub
    
    
    
    



  • di Vecchio Frac data: 19/07/2017 23:10:32

    Premetto che è veramente difficile capire qualcosa dall'oscura spiegazione :) probabilmente basta un'istruzione DoEvents all'interno del punto dove viene svolta l'elaborazione lunga (20 minuti!!). DoEvents assicura che il processore ritorni l'esecuzione al processo principale (cioè a Excel) il quale deve avere il tempo di rinfrescare le finestre. Secondo me il punto è qui ma ripeto non ho capito molto dal tuo post ;)






  • di Fernando (utente non iscritto) data: 20/07/2017 00:37:34

    Vecchio Frac,
    ammetto di non aver spiegato in modo chiaro il mio problema.
    Comunque, ho preso spunto dalla tua risposta nella quale evidenzi l'istruzione Doevents.
    Ho inserito DoEvents come prima istruzione nel moduloB, risultato, funziona tutto alla grande.
    Inserirò questa istruzione anche su altri progetti che ogni tanto si mangiano qualche form vbmodeless.
    Ti ripeto, non sono un esperto e credo di dire e fare cose da far ridere.
    Grazie della tua preziosa risposta.

    Fernando



  • di Vecchio Frac data: 20/07/2017 10:31:39

    cit. "credo di dire e fare cose da far ridere. "
    ---> No non è così perchè nessuno nasce imparato (tranne Alfredo ^_^)
    Attento però che se ti serve la performance l'istruzione DoEvents rallenta l'esecuzione (perchè sottrae tempo a Excel per dar modo a Windows di passare ad eseguire gli altri task in memoria, compreso il repaint delle finestre attive)





  • di Fernando (utente non iscritto) data: 20/07/2017 12:13:09

    Vecchio Frac,
    effettivamente ho notato un rallentamento dell'elaborazione passata da 20/21 minuti a 22/23 minuti.
    Considerando che tale trattamento dei dati è una elaborazione batch, il rallentamento è praticamente irrisorio.
    Comunque ancora grazie della dritta.

    Fernando



  • di Vecchio Frac data: 20/07/2017 12:49:26

    Comunque una ventina di minuti per un'elaborazione è una mostruosità certo dipende dalle operazioni che si svolgono. Sono quasi sicuro che si può ottimizzare in qualche modo (una cosa che mi viene in mente è, per esempio, forzare il ricalcolo da automatico a manuale, questo aiuta molto se vengono elaborate e calcolate molte formule di cui però interessa il risultato finale, e non l'elaborazione in tempo reale).





  • di Fernando (utente non iscritto) data: 21/07/2017 15:25:05

    Vecchio Frac,
    a prima vista vista 20 minuti possono sembrare eccessivi però c'è da considerare che stiamo parlando
    a tutt'oggi di oltre 5000 record che a fine anno raggiungeranno i 10000 record.
    Tale elaborazione batch viene lanciata ogni mese al fine di riepilogare i dati su un foglio raggruppati
    per mese e causale. Inoltre, è richiesto dal committente (mia figlia) un secondo foglio da evidenziare i
    movimenti relativi ad un nominativo in un certo modo (entrate e uscite).
    Alla fine produrre due file pdf di quanto si è generato.
    Tutte queste operazioni devono ripetersi per circa 80 nominativi.
    Quindi, non ho nessun calcolo automatico sui fogli (almeno in questa elaborazione) sono io che raggruppo
    calcolo ecc. ecc.
    Chiaramente tutti i dati che vengono inseriti a man mano attivano una quantità rilevante di calcoli automatici
    per ottenere simultaneamente quadri contabili di attività e passività in modo automatico.
    Comunque, dietro tuo stimolo vedrò di studiare bene quanto da me sviluppato.
    Ciao alla prossima discussione.

    Fernando





  • di Vecchio Frac data: 21/07/2017 15:37:52

    Buon lavoro... e buona gestione condominiale che secondo me puoi fare più agevolmente con Access ^_^





  • di Fernando (utente non iscritto) data: 23/07/2017 14:58:48

    Vecchio Frac,
    ho seguito il tuo consiglio e cioè sospendere il calcolo automatico delle formule.
    Tale sospensione l'ho attivata come prima istruzione della macro interessata ed ho riattivato il calcolo
    prima del salvataggio dei dati e l'uscita dalla macro.
    Ho utilizzato Application.Calculation = xlCalculationManual per sospendere e Application.Calculation = xlCalculationAutomatic per ripristinare.
    Devo dire a meno di mie errate interpretazioni, gli inserimenti dei dati avviene più velocemente.
    Chiaramente le elaborazioni batch non hanno subito nessun miglioramento in quanto non utilizzo fogli con
    formule che producono calcoli in automatico.
    A titolo informativo, ciò che ho sviluppato non è una gestione condominiale ma semplicemente come la chiama
    il committente "Owners management" appartamenti affittati direttamente dai proprietari.
    Ancora grazie a risentirci

    Fernando