› Sviluppare funzionalita su Microsoft Office con VBA › Abilitare e Disabilitare un userform
-
AutoreArticoli
-
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
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...)
`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?
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?
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.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
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.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
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
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
oh raga io ci provo ma ho una grande confusione specialmente sulla booleana
Public Sub DisabilitaForm() If ModificaFogli.Show = True Then ModificaFogli.Enabled = True Else If ModificaFogli.Show = False Then ModificaFogli.Enabled = False End Sub
tipo cosi?
bandiera biancaaaaaa
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.
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.Il Tasto è Modifica Fogli
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 è)?
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
quale e dove sarebbe il pulsante che apre la userform?
Penso che fosse solo un discorso teorico, come lo era il mio.
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
dico la verità? mi sono perso
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.
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).
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.
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.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
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.
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
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
-
AutoreArticoli