AfeterUpdate dopo UNLOAD



  • AfeterUpdate dopo UNLOAD
    di marinoernestoch data: 05/08/2014 10:54:24

    Buon giorno.
    Ho una UserForm con diversi campi, molti dei quali hanno attive le sub xx_afterupdate().
    Cos'ho notato: Se l'ultimo campo che modifico ha attiva la sub _afterupdate(), e subito dopo clicco un commandbutton, che alla fine mi lancia un UNLOAD della USERFORM, si attiva la _afterupdate.
    Mi sembra strano! esiste una tecnica o un parametro che elimini ciò?
    Allego un foglio con il caso. Per attivare la UserForm cliccare sulla barra personalizzata l'icona contrassegnata da un imbuto e un riquadro (fig.excel 603) che attiva la sub filtra_versamenti. Sulla mappa flaggare "si vuole dettaglio" e "si vuole i totali" ed inserire un valore in uno o più campi Importo.
    Attivare il debugging con F9 sull'istruzione UNLOAD ME della routine FRM_ESEGUI_CLICK.
    Ringrazio



  • di Vecchio Frac data: 05/08/2014 13:32:30

    Ciao,
    ho guardato attentamente il file (una fatica notevole districarsi nel codice che è molto ben avviluppato ^_^) e ho verificato che l'evento AfterUpdate si verifica non solo con l'UnLoad del form ma (ovviamente) anche con la chiusura del form stesso mediante pressione del pulsante chiudi (la X della finestra), perchè viene eseguito l'evento QueryClose.
    Un modo semplice per aggirare l'ostacolo è creare una variabile a livello di modulo (i.e. nella stessa finestra di codice del form, non serve una variabile globale di modulo) di tipo booleano la quale se è impostata su True all'esecuzione della sub frm_Esegui_click e forza l'uscita dai singoli eventi _AfterUpdate.
    Vedi esempio qui sotto.
    Il codice dell'intero progetto è complesso e forse in alcuni punti anche piuttosto complicato (immagino che sia un porting da un vecchio applicativo scritto magari in QB). Non ho detto che non sia funzionale... solo che si potrebbe alleggerire :)
     
    'nel codice dell'userform
    
    'in testa, dopo Option Explicit, prima di tutte le altre routines
    Private exit_now As Boolean
    
    
    'nella routine di inizializzazione del form
    Private Sub UserForm_Initialize()
    Dim controlli As Control, ictr As Single, comodo As String
    exit_now = False
    
    
    'all'inizio di frm_Esegui_click()
    exit_now = True 
    'attenzione, prima di ogni Exit Sub all'interno di questa routine bisogna resettare exit_now = False
    
    
    'all'inizio di ogni _AfterUpdate interessata
    'per esempio:
    Private Sub frm_imp_ver_min_AfterUpdate()
        If exit_now Then Exit Sub    '<<<<<
        Call controlla_importo_minimo_versamenti
        If errori(8) <> "" Or errori(10) <> "" Then Call segnalo_errori(Me.Name)
    End Sub
    
    
    






  • di marinoernesto (utente non iscritto) data: 05/08/2014 15:41:30

    Grazie vecchio frac.
    Ho scritto questo codice circa un mese fa, mutuandolo da altro foglio, scritto 2 mesi fa! che ha la stessa logica,
    ma ovviamente dati diversi. (la logica è: data una base dati, offro la possibilità di visualizzare solo le informazioni che soddisfano particolari richieste. La ciliegina è che quando ho i dati estratti, li posso copiare su un nuovo foglio, per altre elaborazioni, lasciando la base dati originaria intatta. La tecnica di analisi che uso è per approssimazione: sviluppo la macro struttura delle funzioni, poi, pian piano la abbellisco/arricchisco di funzioni di dettaglio. Adotto (o cerco di adottare) la tecnica del linguaggio strutturato, anche se a volte, sopratutto x la gestione degli errori, questo non mi è possibile (eh vai di goto). Conosco poche istruzioni di vba, ecco perchè ad un occhio preparato, la codifica appare pedante e, forse, ridondante: inoltre, sviluppo su EXCEL 2010, ma le macro verranno usate su EXCEL2007. Questa è la risposta alla giusta perplessità sul codice. Veniamo, invece, all'evento afterudate.
    Mesi addietro te o scossa, non ricordo, mi avevate confermato che gli "enableevents = false" nelle userform non erano supportate e mi avevate consigliato l'uso una variabile boleana. Così feci, per altre macro. Qui, invece, per il problema dell'afterupdate (scoperto casualmente), pensavo ci fosse qualche parametro da specificare. grazie