Sviluppare funzionalita su Microsoft Office con VBA Abilitare e Disabilitare un userform

Login Registrati
Stai vedendo 25 articoli - dal 1 a 25 (di 39 totali)
  • Autore
    Articoli
  • #46086 Score: 0 | Risposta

    FROST220684
    Partecipante

      Ciao a tutti,

      Ho bisogno di sapere se è possibile decidere di abilitare/disabilitare un userform con vba. Mi spiego meglio:

      Vorrei poter aprire un userform con un pulsante ma alla sua chiusura vorrei che non si riuscisse più ad aprire. Successivamente dopo aver fatto una determinata operazione vorrei che si riabilitasse. è possibile?

      Grazie a tutti

      #46091 Score: 0 | Risposta

      vecchio frac
      Senior Moderator
        247 pts

        Domanda: come avviene l'apertura del form? con quale comando? c'è una riga di codice in cui ordini l'apertura? (in questa ultima  mia domanda c'è la risposta alla tua domanda...)

        #46093 Score: 0 | Risposta

        FROST220684
        Partecipante
          `Sub AvviaUserForm()
          ModificaFogli.Show
          End Sub`

          con questa gli ordino di aprirsi ma come faccio a dirgli che non si deve più aprire dopo essersi chiuso?   

          immagino debba inserire un codice nei bottoni di chiusura ma che tipo di codice?

          #46094 Score: 0 | Risposta

          vecchio frac
          Senior Moderator
            247 pts

            Ok, il punto in cui comandi l'apertura del form è questo.

            Qui, in qualche modo, Excel deve ricordarsi che dopo che il form è stato chiuso in precedenza, non deve più riaprirlo finchè non è stata soddisfatta un'altra condizione. Qualcosa del genere:

            'pulsante di chiusura dentro il form pinco pallo
            private sub btnEsci_click()
                ...Excel, ricordati che non voglio più aprire il form pinco pallo!
                possoaprireilformPincoPallo = False
            end sub
            
            'pulsante di un altro form che apre il form pinco pallo
            private sub btnApri_click()
                if possoaprireilformPincoPallo = False then exit sub
                formpincopallo.show
            end sub

            Sono stato un po' meno criptico stavolta?  o ti ho confuso meglio?  

            #46095 Score: 0 | Risposta

            vecchio frac
            Senior Moderator
              247 pts

              Ho modificato un pochino lo pseudocodice di cui sopra per instradarti meglio. Considera anche che siccome io dichiaro sempre Option Explicit mi obbligo sempre a dichiarare le variabili che uso. Qui non faccio eccezione. Ma allora come mai non vedi nessuna Dim possoaprireilformPincoPallo? Questa è la soluzione del gioco.

              #46096 Score: 0 | Risposta

              FROST220684
              Partecipante
                Private Sub btnConferma2_Click()
                Dim k As Byte
                Dim y As Variant
                
                y = Array("C12", "D12", "C13", "D13", "C14", "D14", "C15", "D15", "A23", "A24", "A28", "A29", "A30", "A31", "A32", "A33", "A34", "A35", "A36", "A37", "A38")
                
                With ThisWorkbook.Worksheets("Output")
                    For k = 1 To 21
                        'se textbox vuota allora lascia invariata la cella processata
                        
                        
                        If Controls("Textbox" & k + 11) <> "" Then
                        .Range(y(k - 1)) = Format(Controls("Textbox" & k + 11), "#")
                            
                        End If
                    Next k
                End With
                Call DisabilitaForm
                End Sub

                Allora sul pulsante esci richiamo "DisabilitaForm" in cui dichiaro una public sub come questa:

                Public Sub DisabilitaForm()
                ModificaFogli = False
                End Sub

                Ma sinceramente non funziona   

                #46100 Score: 0 | Risposta

                vecchio frac
                Senior Moderator
                  247 pts

                  Il concetto e' creare una variabile pubblica booleana (cioe' che sia solo vera o falsa, da dichiarare in un modulo semplice) che faccia da semaforo per l'apertura del form. Nel corso del programma, vuoi oppure no permettere l'apertura del form? imposti rispettivamente a True oppure a False questa variabile globale. In tutti punti del codice dove chiami l'apertura del form devi prima controllare che questa variabile sia a True, cioe' ti consenta di aprire il form, altrimenti esce dal codice.
                  Nella sub "btnConferma2_Click", prima di uscire dalla routine, imposti tale variabile a False. In questo modo il form non si aprira' mai. Nel codice che invece gestisce la condizione che deve verificarsi per consentire l'apertura del form, imposti la variabile a True.

                   

                  #46101 Score: 0 | Risposta

                  FROST220684
                  Partecipante

                    mmmmmmmmmmm no non ho capito.

                    Allora io ho dei tasti nell'userform che mi confermano alcune modifiche sul foglio e fanno chiudere l'userform (io qui gli devo dire non mi fare aprire più l'userform)

                    Poi ho una macro che stampa ed in quella macro gli devo dire permettimi di aprire di nuovo l'userform

                    #46102 Score: 0 | Risposta

                    alexps81
                    Moderatore
                      30 pts

                      Ehhh....no no   

                      Devi dichiarare un variabile boolena a livello di modulo. Questa variabile deve essere modificata a True quando apri la Form. A questo punto se è True fai in modo che il commandbutton che apre la Form si imposti .Enabled = False

                      Non appena esegui questa tua determinata operazione, allora imposti questa variabile boolena a False cosicché il button ritorni abilitato... ovviamente nella condizioni devi mettere anche .Enabled = True

                      Almeno questa è una strada...poi penso che ce ne siano altre. 

                       

                      EDIT: Mentre scrivevo siete andati avanti con il ragionamento   

                      #46103 Score: 0 | Risposta

                      vecchio frac
                      Senior Moderator
                        247 pts

                        alexps81 ha scritto:

                        Almeno questa è una strada...poi penso che ce ne siano altre. 

                        Come vedi Alex ha ideato un'altra soluzione. Invece che impedire l'apertura del form, lui disabilita il pulsante che permette di aprirlo... all'atto pratico e' la stessa cosa. Adesso non ho il tempo di spiegarti nel dettaglio il ragionamento della variabile che fa da semaforo, ma se rileggi con attenzione il mio post combinato con quello di Alex, vedi che non e' cosi' complicato come sembra   

                        #46104 Score: 0 | Risposta

                        FROST220684
                        Partecipante

                          oh raga io ci provo ma ho una grande confusione specialmente sulla booleana   

                          #46105 Score: 0 | Risposta

                          FROST220684
                          Partecipante
                            Public Sub DisabilitaForm()
                            If ModificaFogli.Show = True Then
                            
                            ModificaFogli.Enabled = True
                            Else
                            If ModificaFogli.Show = False Then
                            ModificaFogli.Enabled = False
                            
                            End Sub

                            tipo cosi?

                            #46110 Score: 0 | Risposta

                            FROST220684
                            Partecipante

                              bandiera biancaaaaaa       

                              #46111 Score: 0 | Risposta

                              scossa
                              Partecipante
                                26 pts

                                vecchio frac ha scritto:

                                Come vedi Alex ha ideato un'altra soluzione. Invece che impedire l'apertura del form, lui disabilita il pulsante che permette di aprirlo...

                                Sinceramente non ho capito! quale e dove sarebbe il pulsante che apre la userform?

                                Poi sarebbe necessario capire come viene "chiusa" la userform (hide?, unload?).

                                @frost220684 allegare un file aiuterebbe ad aiutarti.

                                #46112 Score: 0 | Risposta

                                FROST220684
                                Partecipante

                                  Ciao Scossa,

                                  Il pulsante che apre l'userform si trova sul foglio di lavoro.

                                  Mentre la userform si chiude dai suoi tasti interni sempre con Unload

                                  Il Tasto è Modifica Fogli

                                  Allegati:
                                  You must be logged in to view attached files.
                                  #46114 Score: 0 | Risposta

                                  scossa
                                  Partecipante
                                    26 pts

                                    FROST220684 ha scritto:

                                    Il Tasto è Modifica Fogli

                                    FROST220684 ha scritto:

                                    Poi ho una macro che stampa ed in quella macro gli devo dire permettimi di aprire di nuovo l'userform

                                    E quella macro che tasto la lancia (ed in che modulo è)?

                                    #46115 Score: 0 | Risposta

                                    FROST220684
                                    Partecipante

                                      Tasto Form = Modifica Fogli

                                      Tasti di Stampa (si trovano in alto a sinistra) e richiamano le Sub "Saveas" (modulo1) e "SaveAsComitive (modulo3)"

                                      Procedimento:

                                      1. io clicco su Modifica Fogli durante un preventivo, quando chiudo il form (dai vari tasti ce ne sono parecchi) non devo più poterlo aprire.

                                      2. Quando poi lancio le due sub che stanno sopra riabilito il tasto modifica fogli perchè riparto per fare un nuovo preventivo

                                      #46118 Score: 0 | Risposta

                                      vecchio frac
                                      Senior Moderator
                                        247 pts

                                        scossa ha scritto:

                                        quale e dove sarebbe il pulsante che apre la userform?

                                        Penso che fosse solo un discorso teorico, come lo era il mio.

                                        #46121 Score: 0 | Risposta

                                        scossa
                                        Partecipante
                                          26 pts

                                           

                                          vecchio frac ha scritto:

                                          Penso che fosse solo un discorso teorico, come lo era il mio.

                                          In che senso?

                                           

                                          Comunque, anche restando sul teorico, credo sia importante capire quale "logica" teorica ha in mente nel suo quesito teorico   

                                          #46122 Score: 0 | Risposta

                                          FROST220684
                                          Partecipante

                                            dico la verità? mi sono perso   

                                            #46123 Score: 0 | Risposta

                                            FROST220684
                                            Partecipante

                                              in realtà a me sembra una cosa semplice ma mi sono ingarbugliato mi sa.

                                              Ditemi cosa non è chiaro che magari ci riprovo. Vecchio Frac mi conosce sa che sono un bravo interlocutore.

                                              #46125 Score: 0 | Risposta

                                              vecchio frac
                                              Senior Moderator
                                                247 pts

                                                scossa ha scritto:

                                                In che senso?

                                                Non vorrei farla piu' complicata di quello che e'. Intendevo dire che io cercavo di restare su un piano teorico, non conoscendo la struttura del progetto. In astratto, per un obiettivo simile io costruirei una variabile pubblica che funziona da interruttore per pilotare un comportamento: se True, una certa azione e' consentita, se False, l'azione e' negata. Il ragionamento funziona anche se scelgo, invece di una variabile pubblica, una cella del foglio (le celle del foglio sono tutte variabili pubbliche, di fatto). Ho presunto che l'intervento di Alex fosse orientato a immaginare che ci fosse un ipotetico pulsante che attiva il form. Solo dopo ho visto la spiegazione di Frost e ho capito che il pulsante c'e' davvero (sul foglio).

                                                FROST220684 ha scritto:

                                                Vecchio Frac mi conosce sa che sono un bravo interlocutore.

                                                Si' e' vero anche se ogni tanto sei un po' di coccio perche' mi fai scrivere fiumi di post e ancora mi fai sentire come se non riuscissi a spiegarmi   

                                                Comunque dal post #46115 qui sopra io deduco che sei sempre tu che manualmente avvii il form dei preventivi. Quindi che bisogno hai di inibire l'avvio del form? C'e' pericolo di avviarlo inavvertitamente? ma allora fai come dice Alex, quando chiudi il form del preventivo disabiliti il tasto che lo avvia e lo riabiliti solo con i "tasti di stampa" di cui sopra.

                                                #46127 Score: 1 | Risposta

                                                vecchio frac
                                                Senior Moderator
                                                  247 pts

                                                  Prova la revisione che allego.

                                                  Quando avvi il form del foglio Input, poi non lo puoi piu' riaprire perche' "openme" viene settata su False. Ritorna apribile solo se clicchi l'icona di saveas o l'icona di saveascomitiva. Credo che volessi questo, eventualmente dimmi se ho sbagliato.

                                                  Allegati:
                                                  You must be logged in to view attached files.
                                                  #46131 Score: 0 | Risposta

                                                  FROST220684
                                                  Partecipante

                                                    vecchio frac ha scritto:

                                                    Si' e' vero anche se ogni tanto sei un po' di coccio perche' mi fai scrivere fiumi di post e ancora mi fai sentire come se non riuscissi a spiegarmi 

                                                    ahahahhahah che ti devo dire ogni tanto mi perdo nel vuoto ogni tanto ho lampi di genio   

                                                    vecchio frac ha scritto:

                                                    Comunque dal post #46115 qui sopra io deduco che sei sempre tu che manualmente avvii il form dei preventivi. Quindi che bisogno hai di inibire l'avvio del form? C'e' pericolo di avviarlo inavvertitamente? ma allora fai come dice Alex, quando chiudi il form del preventivo disabiliti il tasto che lo avvia e lo riabiliti solo con i "tasti di stampa" di cui sopra.

                                                    c'è un array che prende in memoria delle formule, se apro l'userform e modifico qualcosa e poi inavvertitamente lo riapro mi si sballano alcune formule. Ma cosi il problema è risolto.

                                                     

                                                    vecchio frac ha scritto:

                                                    Quando avvi il form del foglio Input, poi non lo puoi piu' riaprire perche' "openme" viene settata su False. Ritorna apribile solo se clicchi l'icona di saveas o l'icona di saveascomitiva. Credo che volessi questo, eventualmente dimmi se ho sbagliato.

                                                    Va beh me lo sono ricopiato pezzo per pezzo davvero 2 righe di codice     

                                                    Grazie Fra

                                                    #46134 Score: 0 | Risposta

                                                    scossa
                                                    Partecipante
                                                      26 pts

                                                      vecchio frac ha scritto:

                                                      In astratto, per un obiettivo simile io costruirei una variabile pubblica che funziona da interruttore per pilotare un comportamento: se True, una certa azione e' consentita, se False, l'azione e' negata.

                                                      Sono d'accordo con te, anche se io, piuttosto di una variabile pubblica (capita che si "perdano"), preferisco affidarmi ad un named range. 

                                                      Nell'evento di apertura (nel modulo di ThisWorkbook):

                                                      Private Sub Workbook_Open()
                                                        Me.Names.Add "bShowUF", RefersTo:=True
                                                      End Sub

                                                      Poi il codice del pulsante che apre la userform:

                                                      Sub AvviaUserForm()
                                                        If [bShowUF] Then
                                                          ModificaFogli.Show
                                                        End If
                                                      End Sub
                                                      

                                                      Ovviamente nell'evento UserForm_Terminate settare il name a False:

                                                      Private Sub UserForm_Terminate()
                                                        ThisWorkbook.Names("bShowUF").RefersTo = False
                                                      End Sub
                                                      

                                                      Invece nei pulsanti di stampa invece basta aggiungere l'istruzione

                                                        ThisWorkbook.names("bShowUF").RefersTo = True
                                                    Login Registrati
                                                    Stai vedendo 25 articoli - dal 1 a 25 (di 39 totali)
                                                    Rispondi a: Abilitare e Disabilitare un userform
                                                    Gli allegati sono permessi solo ad utenti REGISTRATI
                                                    Le tue informazioni: