Creazione di moduli utente VBA

Moduli utente VBA

Il form utente è una parte molto importante della programmazione in VBA. Ti consente di creare un'interfaccia utente dall'aspetto professionale per comunicare con gli utenti della tua applicazione VBA. Ti consente inoltre di controllare totalmente l'utente in ciò che sta facendo sulla tua cartella di lavoro.

Ovviamente puoi utilizzare le celle del foglio di lavoro per accettare i parametri dall'utente, ma il form utente produce un'esperienza utente di gran lunga migliore.

Espandendo l'altezza e la larghezza del form utente alle dimensioni della finestra di Excel, puoi far sembrare la tua applicazione una normale applicazione Windows, con l'utente totalmente all'oscuro di utilizzare Excel come host.

Tutti i normali controlli di Windows, come menu a discesa, caselle di riepilogo, caselle di spunta sono a tua disposizione. Hai anche una vasta gamma di metodi, eventi e proprietà da utilizzare per migliorare l'esperienza dell'utente.

Un punto importante è che quando si visualizza un form utente integrato o modale, non è possibile modificare il codice nel VBE né accedere a nessuna funzionalità di Excel. Solo quando il modulo è chiuso apparirà il cursore nel tuo codice.

Moduli utente VBA integrati

Excel VBA come diversi moduli incorporati che possono essere utilizzati per comunicare con l'utente.

Casella dei messaggi

Questa è la forma più comunemente usata in VBA. Visualizza semplicemente un messaggio di testo, possibilmente informando un utente che ha inserito un input non valido o che un processo VBA ha terminato l'esecuzione. Nella loro forma più semplice, visualizzano una stringa di testo, ma puoi anche aggiungere un'icona come una domanda o un punto esclamativo e assegnare alla finestra del messaggio un titolo diverso.

Questo è un esempio di base. C'è solo un pulsante su cui fare clic e la barra del titolo dice "Microsoft Excel"

Il codice per produrre questo è molto semplice:

123 Sub TestMsgBox()MsgBox "Questo processo è stato completato"Fine sottotitolo

Puoi utilizzare diversi parametri per aggiungere pulsanti, icone e modificare la barra del titolo

123456789 Sub TestMsgBox()Dim Ret come varianteRet = MsgBox("Sei sicuro?", vbYesNo Or vbQuestion, "La mia applicazione")Se Ret = vbSì Allora'Il tuo processo quiAltroEsci SottoFinisci seFine sottotitolo

Questo codice aggiunge un pulsante "Sì" e "No" e un'icona con un punto interrogativo e imposta la barra del titolo. Nota che puoi combinare gli stili della finestra di messaggio usando l'operatore "O"

Inoltre, quando si restituisce un valore da una finestra di messaggio, la variabile di ritorno deve essere definita come variante o vbMsgBoxResult e l'istruzione della finestra di messaggio deve utilizzare parentesi,

Casella di inserimento

C'è una casella di input molto semplice integrata in VBA, sebbene sia piuttosto restrittiva in ciò che puoi fare con essa. Se puoi, è meglio progettare un form utente personalizzato

12345 Sub TestInputBox()Dim Ret As StringRet = InputBox("Inserisci il tuo nome", "Inserisci nome")MsgBox RetFine sottotitolo

È inoltre possibile aggiungere un valore predefinito per l'input nei parametri.

Ottieni nome file aperto

Ciò consente di utilizzare la finestra di dialogo dei file di Windows all'interno del codice VBA. Sembra molto impressionante per l'utente quando è in esecuzione, ma è molto semplice da incorporare e con esso si ottengono automaticamente tutte le funzionalità di dialogo dei file.

Il codice limita l'utente a vedere solo i file Excel. Sfortunatamente, potrebbero digitare un nome file non Excel nella casella Nome file e fare clic sul pulsante Apri, quindi avresti bisogno di un codice per assicurarti che sia stato selezionato un file Excel.

Utilizzare il comando "ChDir" per modificare la directory predefinita secondo le proprie esigenze prima di visualizzare la finestra di dialogo del file

Si noti l'uso di caratteri jolly nel parametro FileFilter. I file Excel da visualizzare potrebbero essere precedenti al 2007, avere macro o essere binari, quindi il filtro è ".xls*".

123456 Sub TestFileDialog()Dim MyFile As StringChDir "C:\temp"MyFile = Application.GetOpenFilename("File Excel (*.xls*),*.xls*", , "Seleziona un file")MsgBox MyFileFine sottotitolo

Se necessario, è possibile consentire all'utente di selezionare più file contemporaneamente utilizzando il parametro MultiSelect. L'impostazione predefinita è False (solo selezione singola)

12345678 Sub TestFileDialog()Dim MyFile As VariantChDir "C:\temp"MyFile = Application.GetOpenFilename("File Excel (*.xls*),*.xls*", , "Seleziona un file", , True)Per ogni f In MyFileMsgBox fAvanti fFine sottotitolo

L'utente tiene premuto il tasto Maiusc nella finestra di dialogo dei file per selezionare più file.

Il ciclo For Each mostra il percorso completo e il nome di ogni file selezionato

Finestre di dialogo predefinite di Excel

All'interno di Excel VBA, è presente una raccolta Dialogs che è possibile utilizzare per visualizzare qualsiasi finestra di dialogo Excel standard. Lo svantaggio è che non è possibile accedere ai parametri scelti dall'utente o modificare l'aspetto della finestra di dialogo, ma queste finestre di dialogo possono essere utili per indirizzare l'utente a una funzione Excel standard e consentire loro di scegliere parametri specifici all'interno della finestra di dialogo.

Un buon esempio di ciò è visualizzare la finestra di dialogo "Stampa" da VBA:

123 Sub TestPrintDialog()Application.Dialogs(xlDialogPrint).ShowFine sottotitolo

Quando apri le parentesi nella raccolta Dialogs, vedrai un elenco di un numero enorme di costanti per le finestre di dialogo integrate. Vale la pena sperimentare alcune di queste opzioni all'interno del codice

Inserimento di un nuovo modulo utente

Puoi progettare i tuoi moduli utente personalizzati inserendo un modulo utente nell'editor di Visual Basic (VBE)

Puoi farlo selezionando Inserisci | UserForm sulla barra dei menu di VBE.

Fai clic su "Modulo utente" e apparirà un nuovo modulo vuoto pronto per essere sviluppato

Il modulo stesso (mostrato come "UserForm1") sembra piuttosto piccolo, ma puoi usare le maniglie attorno ad esso per ingrandirlo o ridurlo ancora trascinando le maniglie con il cursore.

C'è una finestra delle proprietà nell'angolo in basso a sinistra dello schermo. Poiché lo stato attivo è direttamente sul modulo stesso, questo contiene tutte le proprietà del modulo specifico per quel modulo.

Tieni presente che quando inizi ad aggiungere controlli come caselle combinate e pulsanti di comando, questi controlli hanno tutti il ​​proprio set di proprietà e possono essere molto diversi in ciò che puoi fare con ciascuno di essi.

Le proprietà che vedi attualmente si applicano solo al modulo stesso.

La proprietà "Nome" è il nome utilizzato per definire l'oggetto modulo all'interno del codice VBA. Potresti voler usare qualcosa di più significativo per il nome dell'oggetto, in modo che quando stai rivedendo il tuo codice, sia ovvio quale forma viene utilizzata.

La proprietà "Nome" si rifletterà anche nella finestra "Esplora progetto" nell'angolo in alto a sinistra dello schermo

Dovrai modificare la barra del titolo del tuo modulo in qualcosa di diverso da "UserForm1" e puoi farlo digitando il tuo nuovo testo nella proprietà "Caption"

Puoi apportare un numero enorme di modifiche al modo in cui il tuo modulo viene visto dall'utente. È possibile modificare i colori, aggiungere immagini, ad es. un logo aziendale, cambia la posizione usando "Sinistra" e "In alto", cambia la dimensione usando "Altezza" e "Larghezza", cambia il puntatore del mouse e molti altri

Tutte queste proprietà possono essere modificate anche a livello di codice per qualsiasi controllo aggiunto al form. Ad esempio, un utente può selezionare da un controllo casella di riepilogo e potresti voler disabilitare o nascondere altri controlli in base alla scelta dell'utente

Utilizzo della cassetta degli attrezzi

Noterai che quando fai clic sul modulo stesso, viene visualizzato un pop-up della casella degli strumenti. Se fai clic in qualsiasi altro punto, ad es. il pannello delle proprietà, scomparirà, ma riapparirà quando fai clic sul modulo.

La cassetta degli attrezzi fornisce la vera meccanica del design del modulo. Ciò consente di aggiungere al modulo i normali controlli di Windows con cui gli utenti hanno familiarità.

Avrai notato che sul modulo c'è una rete di punti. Questa è una "griglia snap" in modo che quando aggiungi un controllo al modulo, allineerà automaticamente la posizione alle righe e alle colonne di punti. Questo aiuta enormemente ad allineare i controlli in modo da non avere un aspetto irregolare dei controlli

Se fai clic su un controllo e poi decidi di non utilizzarlo, facendo clic sull'icona "Freccia" nell'angolo in alto a sinistra della casella degli strumenti, il cursore tornerà alla normalità.

È possibile aggiungere ulteriori controlli alla casella degli strumenti utilizzando Strumenti | Controlli aggiuntivi nel menu VBE. Ce ne sono un numero considerevole disponibili, ma a seconda delle versioni di Windows ed Excel, non sempre funzionano, quindi è spesso necessaria una certa sperimentazione.

Inoltre, gli utenti potrebbero non avere accesso ad alcuni di questi controlli aggiuntivi o eseguire versioni precedenti di Windows ed Excel, il che potrebbe causare problemi. Nelle grandi organizzazioni, specialmente se sono globali, non esiste un PC standard su cui puoi fare affidamento!

Aggiunta di un pulsante di uscita al modulo

Un pulsante di comando è semplice da aggiungere al modulo. Ha lo stesso aspetto dei pulsanti che vedi in altri moduli di Windows, di solito come un pulsante "OK" o "Annulla".

Fare clic sull'icona del pulsante di comando nella casella degli strumenti. Questa è la seconda icona da sinistra nella riga inferiore di icone. Vedi l'immagine sopra. Ha le lettere "ab" su di esso.

Puoi tenere premuto il pulsante del mouse e trascinare il controllo sul modulo, oppure puoi spostare il cursore sul modulo, dove cambierà in un cursore a "croce" e potrai posizionare e ridimensionare il pulsante

Se trascini il controllo sul form, otterrai il dimensionamento predefinito del pulsante. Spostare il cursore sul modulo consente di modificare le dimensioni del pulsante trascinando il cursore a "croce" sul modulo

Il tuo modulo ora sarà simile a questo:

Il pulsante avrà il testo predefinito come didascalia, ma vorrai cambiarlo in base alle tue esigenze. Puoi fare clic sul testo all'interno del pulsante ("CommandButton1") e questo ti consentirà di modificare direttamente la didascalia.

Puoi anche cambiarlo nella finestra delle proprietà (angolo in basso a sinistra dello schermo). Vedrai una proprietà chiamata "Caption" e potrai modificare il valore per questo. Cambia questo in "Esci"

Come con le proprietà del modulo, la proprietà "Nome" definisce il nome che verrà utilizzato nel codice VBA. Potresti voler usare un nome che sia più significativo e ovvio all'interno del tuo codice. Puoi inserirlo nella proprietà "Nome".

Puoi riposizionare il pulsante trascinandolo sul modulo e puoi ridimensionarlo facendo clic sulle maniglie del pulsante (caselle quadrate bianche) e trascinando le maniglie per ingrandirlo o rimpicciolirlo

Puoi anche ridimensionare il pulsante cambiando i valori di Altezza e Larghezza nella finestra delle proprietà

Puoi visualizzare il tuo modulo in Excel facendo clic sul triangolo verde nella barra degli strumenti VBE o premendo F5

Puoi chiamare il tuo modulo dal codice VBA all'interno di un modulo utilizzando il metodo "Mostra"

123 SottoMostraModulo()UserForm1.ShowFine sottotitolo

Il tuo modulo utente è effettivamente un oggetto globale e può essere chiamato da qualsiasi punto all'interno del tuo codice

Attualmente, il tuo pulsante di comando non fa nulla perché non c'è codice VBA dietro. Devi scriverlo tu! Tutto ciò che può succedere al momento è che puoi fare clic sulla X "Chiudi" nell'angolo in alto a destra del modulo.

Per aggiungere il codice VBA, fai doppio clic sul pulsante nel modulo

Questo ti porterà alla normale finestra del codice VBA e mostrerà l'evento predefinito del clic.

Utilizzi il metodo "Nascondi" per chiudere il modulo e puoi anche aggiungere qualsiasi altro codice, come una finestra di messaggio per confermare all'utente cosa è successo.

Nota che la finestra del codice ha due menu a discesa in alto. Il primo ti consente di selezionare i controlli del modulo e il secondo mostra tutti gli eventi disponibili per l'aggiunta di codice. Quello più ovvio per un pulsante è l'evento "Click", ma ce ne sono altri come "Doppio clic" o "Mouse Move"

Quando esegui il modulo ora, il pulsante fa effettivamente qualcosa. Il modulo scompare e viene visualizzata una finestra di messaggio che conferma che il modulo è chiuso

Ovviamente puoi ingrandire il codice di uscita. Potresti voler visualizzare un altro modulo o agire sui parametri che l'utente ha inserito nel tuo modulo

Aggiunta di un controllo etichetta a un modulo

I controlli etichetta servono per chiedere all'utente quale tipo di dati devono inserire in un controllo nel modulo, ad es. casella di testo, menu a discesa, ecc. Un'etichetta non ha bordi per impostazione predefinita, ma possono essere aggiunti tramite la finestra delle proprietà, se necessario.

Come controllo, vengono letti solo dall'utente e sono semplicemente un modo per inserire del testo nel modulo, che si tratti di un'intestazione in grassetto o di un'istruzione su cosa inserire o scegliere.

Per aggiungere un'etichetta, fai clic sull'icona "A" nella casella degli strumenti (riga in alto, seconda da sinistra) e fai doppio clic su di essa o sposta il cursore sul modulo e seleziona posizione e dimensione.

Utilizzando la proprietà "Caption" nella finestra delle proprietà o facendo clic sul controllo etichetta, è possibile inserire il testo per il controllo etichetta.

Si noti che il testo andrà a capo in base alla dimensione del controllo etichetta e, se la stringa di testo è troppo lunga, non apparirà completamente nel modulo, quindi è necessario prestare attenzione al dimensionamento del controllo etichetta.

Utilizzando la finestra delle proprietà, è possibile modificare l'aspetto del controllo dell'etichetta, con diversi colori, caratteri, stile del dorso, ad es. se si sovrappone a un'immagine e vuoi che sia trasparente

Non è necessario creare alcun codice per un controllo etichetta. Lo scopo principale è aggiungere testo al modulo in modo che l'utente possa vedere come funzionano tutti gli altri controlli

Aggiunta di un controllo di testo al form

Un controllo di testo viene utilizzato per consentire all'utente di inserire del testo, ad esempio inserendo un nome o commenti

Il controllo di testo viene aggiunto dalla casella degli strumenti facendo clic sull'icona del controllo di testo (riga in alto, terza da sinistra) e facendo doppio clic o trascinando il controllo in posizione sul modulo.

Il controllo del testo viene spesso confuso con il controllo dell'etichetta, ma il controllo del testo è quello per l'input dell'utente

Il testo "Inserisci il tuo nome" è un controllo etichetta, come descritto in precedenza, e ora abbiamo una casella di testo bianca pronta per consentire all'utente di digitare qualcosa in

Utilizzando la finestra delle proprietà, è possibile modificare i colori, i caratteri, gli effetti speciali o utilizzare i caratteri della password per la casella di testo. È disponibile un'enorme flessibilità

Una proprietà molto importante per una casella di testo è la proprietà "MultiLine". Se vuoi che l'utente inserisca una grande quantità di testo nel controllo del testo, ad es. commenti, la proprietà "MultiLine" deve essere impostata su True.

È un valore predefinito di False, il che significa che per quanto grande sia la tua casella di testo, il testo inserito rimarrà su una riga continua e scorrerà fuori dalla casella di testo. Non si avvolgerà all'interno della scatola.

Non c'è alcun pop-up quando fai clic con il pulsante destro del mouse sulla casella di testo quando è in esecuzione, ma CTRL+V funzionerà per Incolla e CTRL+C funzionerà per Taglia, se l'utente desidera tagliare e incollare il testo da e verso altri applicazioni

Ancora una volta, devi scrivere il tuo codice per gestire il testo che l'utente ha digitato. Potresti voler trasferirlo in una cella in un foglio di lavoro

Puoi aggiungere questo codice nell'evento "Cambia" per la casella di testo

123 Sub TextBox1_Change privato ()Fogli("Foglio1").Intervallo("A1").Valore = TextBox1.ValoreFine sottotitolo

Potresti anche voler inserire un codice di convalida per verificare che l'utente non stia inserendo spazzatura che avrà effetti disastrosi sulla tua applicazione

L'evento change non va bene per questo perché viene chiamato ogni volta che l'utente digita un nuovo carattere. L'utente potrebbe iniziare a digitare una stringa di testo e scoprire immediatamente di aver infranto le regole di convalida prima di aver completato un testo valido.

Utilizzi l'evento "Esci". Questo viene attivato quando l'utente sposta lo stato attivo su un altro controllo del modulo, il che significa che l'utente non sta più immettendo dati.

123456 Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)If IsNull(TextBox1.Value) Or Len(TextBox1.Value) < 4 ThenMsgBox "Il nome non è valido", vbCriticalTextBox1.SetFocusFinisci seFine sottotitolo

Quando l'utente fa clic su un altro controllo nel modulo, questo codice verifica un valore nullo nella casella di testo o meno di 4 caratteri. Se il test è vero, viene visualizzata una finestra di messaggio con un'icona critica per informare l'utente che il nome non è valido e lo stato attivo viene spostato di nuovo sulla casella di testo in questione per consentire all'utente di correggere.

Nota che anche se l'utente fa clic sul pulsante Esci, l'evento di uscita dalla casella di testo verrà eseguito per primo, quindi questo impedisce all'utente di uscire senza correggere l'input

Inizializza e attiva gli eventi su un modulo

Quando VBA crea e costruisce per la prima volta un modulo, attiva un evento "Inizializza". Tuttavia, poiché a questo punto viene visualizzato anche il modulo, viene attivato anche un evento "Attiva". Da quel momento in poi, ogni volta che il modulo appare utilizzando il metodo 'Mostra' o appare come parte di una gerarchia di moduli, viene attivato l'evento 'Attiva', ma non l'evento 'Inizializza'

L'evento "Inizializza" si verifica solo una volta, ma l'evento "Attiva" può verificarsi molte volte

Sul modulo potresti voler impostare i valori predefiniti dal foglio di lavoro nei controlli di input, ad es. caselle di testo, in modo che appaiano al primo utilizzo del modulo, ma l'utente può sovrascrivere i valori predefiniti e questi nuovi valori rimarranno al loro posto finché il codice è in esecuzione

12345678 Private Sub UserForm_Initialize()TextBox1.Value = Fogli("Foglio1").Intervallo("A1").ValoreSe TextBox1.Value="" AlloraTextBox1.Visible=FalseAltroTextBox1.Visible=TrueFinisci seFine sottotitolo

Puoi trovare l'evento "Inizializza" nel secondo menu a discesa nella finestra del codice e il nome del modulo utente nel primo menu a discesa.

Questo codice utilizzerà il valore della cella A1 su "Foglio1" come valore predefinito nella casella di testo creata in precedenza in questo articolo. Quando il modulo viene visualizzato per la prima volta, verrà visualizzato il valore predefinito. L'utente può quindi sovrascrivere il valore predefinito e questo verrà mantenuto. Se CellA1 è vuoto, la casella di testo verrà nascosta, altrimenti sarà visibile

Il valore predefinito potrebbe anche essere hardcoded:

1 TextBox1.Value = "John Smith"

Potresti anche voler assicurarti che i valori che l'utente ha inserito riappaiano ogni volta che l'utente attiva quel modulo all'interno di quella particolare sessione di Excel. Il codice VBA può facilmente riscrivere i valori nelle celle all'interno della cartella di lavoro utilizzando l'evento "Esci" su un controllo e reintegrarli utilizzando l'evento "Attiva" nel modulo

123 Private Sub TextBox1_Exit(ByVal Cancel as MSForms.ReturnBoolean)Fogli("Foglio1").Intervallo("A10").Valore = TextBox1.ValoreFine sottotitolo
123 Modulo utente secondario privato_Activate()TextBox1.Value = Fogli("Foglio1").Intervallo("A10").ValoreFine sottotitolo

Questo codice renderà persistenti i valori dell'utente e garantirà anche che vengano salvati con il resto della cartella di lavoro

Salvataggio della domanda e dei moduli

Quando si salva la cartella di lavoro di Excel contenente i moduli, vengono salvati anche tutti i moduli e il relativo codice VBA. Tuttavia, tutti i valori che i moduli contengono mentre vengono visualizzati andranno persi.

È importante scrivere il codice in modo che quando l'utente esce dalla cartella di lavoro o dal modulo, i valori vengono riscritti nelle celle all'interno della cartella di lavoro e quindi vengono mantenuti.

Forme modali e non modali

Il modulo stesso ha una proprietà "Mostra modale". Questo è impostato per impostazione predefinita su True, ma può essere modificato in False (non modale)

Se un modulo è modale, significa che non è possibile accedere a nessuna delle funzionalità di Excel durante la visualizzazione del modulo. Questo include il tuo codice nella finestra VBE. È possibile visualizzare il codice, ma il cursore e la tastiera sono disabilitati.

In un modulo non modale, puoi accedere a tutte le funzionalità di Excel, inclusa la finestra VBE, mentre il modulo viene visualizzato.

Questo è importante dal punto di vista del controllo del comportamento degli utenti

Chiusura di un modulo

Per quanto bene scrivi il tuo codice per costringere l'utente a seguire un determinato percorso, può facilmente aggirarlo facendo clic sulla X "Chiudi" nell'angolo in alto a destra del modulo

Puoi evitare che ciò accada modificando l'evento "QueryClose" del modulo

1234 Private Sub UserForm_QueryClose (Annulla come intero, CloseMode come intero)Annulla = VeroMsgBox "Questa azione è disabilitata"Fine sottotitolo

L'evento "QueryClose" viene attivato quando l'utente fa clic sulla X "Chiudi" del modulo. Questo codice annulla l'azione, quindi l'utente è costretto a utilizzare il pulsante "Esci" e il codice che hai dietro.

Abilitare e disabilitare i controlli

Tutti i controlli sul tuo modulo hanno una proprietà chiamata "Abilitato" che è impostata su True o False. Se è False, il controllo è disattivato. Si vede ma non si usa.

C'è anche una proprietà chiamata "Visible" che è di nuovo impostata su True o False.

È possibile scrivere codice per rendere inutilizzabile un determinato controllo o per renderlo totalmente invisibile all'utente. Usando un'istruzione "Se", puoi scegliere le circostanze in cui devi farlo

Ad esempio, è possibile disabilitare inizialmente il pulsante "Esci", fino a quando l'utente non ha inserito un valore nel TextBox1 (nome)

123 Private Sub UserForm_Initialize()CommandButton1.Enabled = FalseFine sottotitolo
1234567 Sub TextBox1_Change privato ()Se Len(TextBox1.Value) > 0 AlloraCommandButton1.Enabled = TrueAltroCommandButton1.Enabled = FalseFinisci seFine sottotitolo

Questo codice utilizza l'evento "Inizializza" del modulo per disabilitare il pulsante di uscita (Pulsante di comando 1) quando viene visualizzato per la prima volta il modulo e quindi utilizza l'evento "Cambia" su TextBox1 (nome) per abilitare il pulsante Esci se è stato digitato o disabilitato qualcosa se la casella è vuota.

L'evento "Cambia" viene attivato ogni volta che un nuovo carattere viene digitato o eliminato dalla casella di testo. Se l'utente tenta di inserire del testo per abilitare il pulsante, quindi elimina tutto il testo, il pulsante verrà immediatamente disabilitato

wave wave wave wave wave