Eventi in USERFORM



  • Eventi in USERFORM
    di marinoernestoch data: 08/02/2014 19:44:40

    Aiuto.
    Sto lavorando sui formati condizionali (vedere altra discussione ancora aperta).
    Ora sono alle prese con un form dove stabilisco cosa fare e su quali celle lavorare.
    Se ho una sola cella selezionata chiedo se lavorare solo sulla cella, su tutta la sua colonna o su tutta la sua riga oppure ancora su tutto il foglio.
    Se invece ho un numero imprecisato di celle selezionate, chiedo se devo lavorare sull'area selezionata o su tutto il foglio.
    Per le varie possibilità ho definito dei checkbox che attivo o spengo.
    Le routines, attivate dagli eventi click, se vedono il flag acceso spengono gli altri. Mi succede che, sia accendendo che spegnendo i checkbox nelle routines, si attivano i relativi eventi, che fanno partire, a loro volta altre routines. E cosi, c'è un proliferare di istruzioni che girano inutilmente generando anche errori di logica. Ho pensato di inserire un "Application.EnableEvents = False", all'inizio ed un TRUE alla fine, sia nella macro iniziale che nelle subrutines degli eventi, non ho risolto il problema.
    La macro che visualizza la mappa è "AAA_vediamo_la_mappa()".
    MI sapete aiutare? Vi vedo molto forti sul VBA! Ringrazio in anticipo



  • di Zer0Kelvin data: 09/02/2014 09:44:08

    Ciao.
    Intanto ti posso dire che sarebbe MOLTO più semplice sostituire (in questo caso) i controlli CheckBox con degli OptionButton che si escludono automaticamente a vicenda!
    Le checkbox vanno bene quando ci sono più opzioni che possono essere contemporaneamente attive, mentre quando si deve selezionare una sola opzione il controllo giusto da usare è optionbutton.
    Dai un'occhiata al demo che ho caricato; è puramente didattica e non ha nulla a che fare col tuo file, ma fa saltare agli occhi la differenza fra i due tipi di controlli usati.
    Ti consiglio di rivedere in questo senso la tua userform.



  • di marinoernestoch data: 09/02/2014 11:47:56

    Ti ringrazio molto della dritta, Zer0Kelvin.
    Il mio errore di fondo è che pensavo che gli optionbotton fossero validi a due a due. Invece mi sembra di capire che sono tutti alternativi tra loro, all'inteno di una frame (o indipendentemente dalla presenza o meno della frame?.(Ora farò delle prove).
    Poi modificherò il formato come mi hai suggerito. Rinnovo i ringraziamenti.
    A vantaggio di tutti, invece, dico che, questa mattina, cercando in rete sono ritornato su un sito, che consiglio di visitare, se non l'avete già fatto, ("h_t_t_p_:_/_ /_ cpearson.com_/_ excel_/_topic.aspx", togliere la sottolineatura) dove si dice a chiaramente che Application.EnableEvents non sono validi per le userforms, e di adottare degli sw booleani per una gestione "personale". Così ho fatto ed allego il risultato.
    Di questo form mi resta solo un errore: se ho in alternativa "solo cella attiva" o "tutto il foglio", il messaggio di errore appare più piccolo, mentre se ho l'alternativa "solo l'area selezionata" o "tutto il foglio", il messaggio di errore appare con carattere più grosso. Ciò nonostante abbia forzato al messaggio la stessa dimensione di carattere in tutte le routines. Avete un'idea del perchè? Grazie.



  • di marinoernestoch data: 09/02/2014 15:18:19

    Richiamando i suggerimenti avuti da Zer0Kelvin ho modificato il form da checkbox in optionbotton. Ho risolto il problema iniziale e reso più leggero il codice di gestione.
    Considero quindi chiusa la discussione. Allego la nuova versione.
    Però, a futura memoria, x quando la discussione sarà scarica nello storico, posto le istruzioni per gestire in modo personale gli eventi in una USERFORM.
    Spereo di essere stato chiaro
    Ringrazio e saluto tutti.
     
    'nel modulo dello USERFORM
    Option Explicit
    Public gestione_eventi As Boolean ' definisco uno sw pubblico
    
    Private Sub UserForm_Activate()
    gestione_eventi = False      ' questo annullarà l'esecuzione delle routines
    .
        Height = 280        ' fino a 142 e meno ancora 126
        solo_riga = False
        solo_colonna = False
        Tutto_il_foglio = False
    ' eccetera
    gestione_eventi = True   ' da adesso in poi eseguirò le routines degli eventi
    end sub
    
    ' un esempio di evento
    Private Sub solo_colonna_Click()
     If gestione_eventi Then      ' se spento inibisce le successive istruzioni
        gestione_eventi = False   ' se attivo per il momento lo spengo
        If solo_colonna Then                       'faccio quello che serve
           Attenzione.Visible = False            'cioè modifico dei campi di userform
        ' eccetera  
        Else
        ' eccetera 
          
        End If
       gestione_eventi = True          '   quindi lo riattivo
     End If
    End Sub
    ' e così tutte le altre routines abbinate agli eventi di USERFORM
    



  • di marinoernestoch data: 09/02/2014 15:21:07

    Attivo flag di chiusura



  • di Zer0Kelvin data: 10/02/2014 04:18:54

    Felice che tu abbia risolto.
    A proposito di OptionButton:
    Formano automaticamente un gruppo a seconda del "contenitore" in cui li inserisci: form, frame, page; ed è anche possibile assegnare esplicitamente un gruppo tramite la proprietà OptionButton.GroupName.

    Non ti ho accennato il metodo per "disabilitare" gli eventi, in quanto ero certo che usando OptionButton il problema si sarebbe risolto da solo.

    Il sito che hai citato è un "must" per chi lavora con Excel, una vera miniera d'oro.
    Ciao e buon lavoro.



  • di marinoernestoch data: 10/02/2014 07:49:57

    1000 thanks z0k.