Scadenzario Excel VBA
Inserite le relative label e assegnate loro i nomi mostrati nella figura sottostante. Successivamente, cliccate una alla volta sia sulle label che sulle TextBox e, nella finestra delle proprietà (a sinistra), impostate i seguenti valori:
-
Width: 120
-
Height: 18
-
Caption: inserite il testo indicato per ciascuna label (è l’ottava voce dell’elenco proprietà)
Potete anche personalizzare il colore di sfondo: ad esempio, nel pulsante btnElimina ho scelto un verde (non amo il rosso), ma potete selezionare qualsiasi colore tramite la proprietà BackColor. Basta cliccarci sopra per aprire la palette.
Come mostrato in figura, aprite la ToolBox (Casella degli strumenti), selezionate Casella combinata (ComboBox) e affiancatele una label con Caption “Stato”.
Adesso fate doppio clic in un punto libero della UserForm: si aprirà il modulo della UserForm, come mostrato in figura. A questo punto copiate e incollate le seguenti due righe nella parte superiore del modulo, ed incollate le seguenti due righe
Assicuratevi che, nella barra superiore del modulo, siano selezionate:
-
a sinistra: General
-
a destra: Declarations
Se non le vedete, sceglietele dalle rispettive caselle a discesa.
π΅ Perché le voci in blu sono importanti
Quando incolliamo nel modulo della UserForm le righe:
le vediamo colorate in blu perché VBA le riconosce come parole chiave del linguaggio, cioè comandi speciali con un significato preciso. Ecco cosa fanno.
π΅ Option Explicit — cosa significa e perché usarlo
Option Explicit obbliga VBA a dichiarare tutte le variabili prima di usarle.
In pratica:
-
evita errori dovuti a variabili scritte male (es. rigaCorrentee invece di rigaCorrente)
-
rende il codice più stabile e professionale
-
aiuta a capire subito quali variabili esistono nel progetto
-
previene comportamenti imprevisti
Senza Option Explicit, VBA creerebbe automaticamente una variabile nuova ogni volta che sbagliamo a scrivere un nome. Con Option Explicit, invece, VBA ci avvisa subito dell’errore.
È una buona pratica sempre consigliata, soprattutto nei progetti che condividi con altri.
π΅ Dim — cosa significa e cosa fa
La parola chiave Dim serve per dichiarare una variabile, cioè per dire a VBA:
-
come si chiama
-
che tipo di dato conterrà
Nel nostro caso:
significa:
-
crea una variabile chiamata rigaCorrente
-
il suo tipo è Long, cioè un numero intero “lungo” (utile per numeri di riga, contatori, ID, ecc.)
Dichiarare le variabili con Dim è fondamentale per:
-
rendere il codice più chiaro
-
evitare errori
-
migliorare le prestazioni
-
sapere sempre che tipo di dati stiamo usando
π΅ In breve
-
Option Explicit → obbliga a dichiarare le variabili, evita errori e rende il codice più sicuro.
-
Dim → serve a dichiarare una variabile e definirne il tipo.
-
Le parole in blu → sono parole chiave del linguaggio VBA, quindi hanno un significato speciale.
π Nota didattica — Attivare automaticamente Option Explicit in tutti i nuovi moduli
Per evitare errori e rendere il codice più pulito e professionale, è consigliabile attivare Option Explicit in modo automatico per ogni nuovo modulo o UserForm che create in VBA. In questo modo non dovrete più inserirlo manualmente ogni volta.
Come attivarlo:
-
Aprite l’editor VBA con ALT + F11
-
Nel menu in alto, cliccate su Tools (Strumenti)
-
Selezionate Options… (Opzioni)
-
Nella finestra che si apre, attivate la casella Require Variable Declaration
-
Confermate con OK
Da questo momento, ogni nuovo modulo verrà creato automaticamente con:
Option Explicit
in cima al codice.
Perché è utile?
-
Evita errori dovuti a variabili scritte male
-
Rende il codice più stabile e leggibile
-
Aiuta a mantenere un progetto ordinato e professionale
-
È una buona pratica adottata da chiunque lavori seriamente con VBA
Inserite ora il codice seguente, immediatemente dopo le righe elencate in ( figura so)
Private Sub UserForm_Initialize()
With Me.ComboBox1
.Clear
.AddItem "In attesa"
.AddItem "Pagato"
.AddItem "Annullato"
End With
End Sub
significa che all'evento Initialize della UserForm, caricherà nella in Combobox1 le relative voci desiderate (vedi figura sotto).
Salvataggio / Modifica
Ora richiamiamo la frmInserimento. Fate doppio clic sul pulsante con Caption "Salva Scadenza": si aprirà automaticamente il modulo relativo a quel pulsante, come mostrato in figura.
Incollate ora il codice seguente, immediatemente dopo le righe elencate in ( figura sopra)
A questo punto incollate il seguente codice: sarà la Sub che gestisce l’evento, quella che “dirige l’orchestra” ogni volta che il pulsante viene premuto. (Benedetto il linguaggio di programmazione quando fa quello che gli chiediamo!). La sub ha funzioni di salvataggio/modifica; tra Private Sub btnSalva_Click() ed
-----------------------------------------------
End Sub
incollate il codice come in figura sotto:
Ti consiglio di scriverlo personalmente per comprenderlo meglio, ma se preferisci — o se vuoi semplicemente risparmiare tempo — ti metto comunque a disposizione il codice da copiare ed incollare.
__________________________________________________________________________________________________________________________________
Private Sub btnSalva_Click()
Dim ws As Worksheet Dim rigaVuota As Long
Set ws = ThisWorkbook.Sheets("Scadenze")
If rigaCorrente = 0 Then
rigaVuota = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row + 1
Else
rigaVuota = rigaCorrente
End If
ws.Cells(rigaVuota, 1).Value = TextBox1.Value
ws.Cells(rigaVuota, 2).Value = CDate(TextBox2.Value)
ws.Cells(rigaVuota, 3).Value = CDbl(TextBox3.Value)
ws.Cells(rigaVuota, 4).Value = ComboBox1.Value
MsgBox "Operazione completata!", vbInformation
rigaCorrente = 0
End Sub
_________________________________________
Adesso doppio click sul pulsante" btnCerca" Caption "Cerca" e tra le due istruzioni Private Sub btnCerca_Click() ed end sub incolla il seguente codice
Private Sub btnCerca_Click()
' Evento Click del pulsante "Cerca".
' Questa Sub viene eseguita ogni volta che l’utente preme il pulsante.
Dim ws As Worksheet ' Oggetto Worksheet che punta al foglio "Scadenze".
Dim i As Long ' Variabile contatore per scorrere le righe del foglio.
Set ws = ThisWorkbook.Sheets("Scadenze")
' Assegniamo alla variabile ws il foglio "Scadenze" del file corrente.
' Ciclo che scorre tutte le righe dalla 2 fino all’ultima riga compilata nella colonna A.
For i = 2 To ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
' Confronto tra il valore della colonna A e il testo inserito nella TextBox1.
' LCase rende tutto minuscolo per evitare problemi di maiuscole/minuscole.
If LCase(ws.Cells(i, 1).Value) = LCase(TextBox1.Value) Then
rigaCorrente = i
' Memorizziamo il numero della riga trovata nella variabile globale rigaCorrente.
TextBox2.Value = ws.Cells(i, 2).Value
' Riempie la TextBox2 con il valore della colonna 2 (descrizione, ad esempio).
TextBox3.Value = ws.Cells(i, 3).Value
' Riempie la TextBox3 con il valore della colonna 3 (data scadenza, ecc.).
ComboBox1.Value = ws.Cells(i, 4).Value
' Imposta la ComboBox con il valore della colonna 4 (stato, categoria, ecc.).
MsgBox "Record trovato!", vbInformation
' Messaggio di conferma per l’utente.
Exit Sub
' Uscita immediata dalla Sub: non serve continuare a cercare.
End If
Next i
MsgBox "Nessun record trovato."
' Avvisa l’utente che la ricerca non ha prodotto risultati.
End Sub
Adesso doppio Click sul pulsante con caption "Elimina" e, come sopra in mezzo alle istruzioni Private Sub btnElimina_Click() ed End sub inserite
' Evento Click del pulsante "Elimina".
' Questa Sub viene eseguita quando l’utente preme il pulsante.
' Controlliamo che sia stata trovata una riga valida in precedenza.
If rigaCorrente <> 0 Then
Sheets("Scadenze").Rows(rigaCorrente).Delete
' Elimina l’intera riga corrispondente al record trovato.
MsgBox "Record eliminato!"
' Conferma all’utente che l’eliminazione è avvenuta.
rigaCorrente = 0
' Reset della variabile: nessuna riga attualmente selezionata.
End If
End Sub
Per completare il lavoro riguardante La form principale in modo — diciamo — mezzo brillante ma soprattutto comodo, scaricate l’utility “Calendario” cliccando Qui: Download Utility
Una volta scaricato il file:
-
Salvatelo sul Desktop, creando prima una cartella dedicata (nominate la cartella come preferite).
-
Aprite il file del Calendario.
-
Premete ALT + F11 per aprire l’editor VBA.
-
Nel menu in alto cliccate su File → Export File…
-
Esportate i file del calendario nella cartella che avete creato sul Desktop.
Ora passiamo al vostro file Scadenzario:
-
Aprite il file dello scadenzario.
-
Premete di nuovo ALT + F11.
-
Cliccate su File → Import File…
-
Selezionate la cartella sul Desktop e importate il file Calendario.
Magia pura! La form Calendario apparirà come per incanto accanto alla vostra frmInserimento, pronta per essere richiamata e utilizzata nel progetto.
Bene! Ad ultimare la form una specifica, un Golden Premium all'utenza. Attiviamo ora il calendarietto Pop-Up appena scaricato.
Nel mio caso specifico ho inserito un ImageBox e dalle proprietà sopra elencate; ho inerito un'immagine scaricata dal web, importante: Excel Vba accetta solo i formati .ICO e .BMP altrimenti darà errore di caricamento. Al momento a posto vostro metterei un piccolo pulsante dell'altezza 18(uguale alla text box) magari larga 22-24 ed inserire un sempli GO viste le ridotte dimensioni.Se vuoi comunque provare, ecco cosa fare:
-
Apri la tua UserForm (frmInserimento).
-
Dalla cassetta degli attrezzi, trascina un controllo Image (ImageBox) a fianco della TextBox2 (quella della Data).
-
Vai nella finestra Proprietà (F4):
-
Name: Nominala imgCalendar.
-
Picture: Clicca sui tre puntini ... e seleziona il tuo file .BMP o .ICO.
-
PictureSizeMode: Imposta su 1 - fmPictureSizeModeStretch per adattare l'immagine alla dimensione del quadratino.
-
π οΈ Configurazione dell'Icona Calendario (Correzione del Codice)
Quando inserisci un'immagine per richiamare il calendario, Excel potrebbe proporti degli eventi "avanzati" che non ci servono. Segui questi passaggi per pulire il codice e renderlo funzionante.
1. Pulizia dell'evento di default
Se fai doppio clic sull'immagine nella UserForm e ti appare un blocco di codice simile a questo:
Cancellalo completamente. Excel genera questa riga pensando che tu voglia trascinare file sull'immagine, ma a noi serve un semplice clic.
2. Inserimento del codice corretto
Incolla il seguente codice, assicurandoti che il nome coincida con quello della tua immagine (di default Image1) e della tua casella di testo (es. TextBox2):
3. Personalizzazione del nome
Se hai rinominato la tua immagine per rendere il progetto più professionale (ad esempio imgCalendar), il codice dovrà riflettere il nuovo nome:
β οΈ Attenzione al Doppio Clic: > Non farti confondere dalla routine BeforeDragOver che Excel crea in automatico. È un evento per il trascinamento che non ci serve. Sostituiscila sempre con l'evento _Click() come mostrato sopra per garantire che il calendario si apra al tocco dell'utente.
π Il Risultato Finale: Un Click, Zero Errori
Una volta configurato il codice, ecco la magia. Non servono più inserimenti manuali o dubbi sul formato della data.
Come funziona nella pratica:
-
Fai doppio click (o click singolo, in base alla routine scelta) sull'icona o sul pulsante del calendario che hai inserito.
-
Apparirà istantaneamente il calendario Pop-Up (come mostrato nella figura sottostante).
-
Seleziona la data desiderata: il calendario si chiuderà automaticamente e la data apparirà perfettamente formattata nella tua TextBox.
Et Voilà! Credo non servano altre parole: la precisione è servita e l'errore umano è azzerato.
Adesso dedichiamoci alla parte meno difficile: la configurazione del foglio "Scadenze". Dobbiamo creare una formattazione condizionale per far si che a 7 giorni dalla scadenza, la data si colori in giallo(vedi figura) e se la data di scadenza è passata, la data si colori in rosso
π¨ Configurazione Formattazione Condizionale
Seleziona tutte le celle della colonna Data Scadenza (es. da B2 a B100) e segui questi passaggi:
1. Allerta Scadenza (Colore Giallo) π‘
Questa regola serve per avvisarti quando mancano 7 giorni o meno alla scadenza, ma la data non è ancora passata.
-
Vai su: Home > Formattazione condizionale > Nuova regola...
-
Scegli: "Utilizza una formula per determinare le celle da formattare".
-
Inserisci questa formula: =E(B2>=OGGI(); B2<=OGGI()+7)
-
Clicca su Formato..., vai alla scheda Riempimento e scegli il Giallo.
-
Nota: Questa formula dice: "Se la data è oggi o futura, MA mancano al massimo 7 giorni, colora di giallo".
2. Scadenza Passata (Colore Rosso) π΄
Questa regola evidenzia immediatamente le scadenze che hai già superato.
-
Vai di nuovo su: Nuova regola... > Utilizza una formula...
-
Inserisci questa formula: =B2<OGGI()
-
Clicca su Formato..., vai alla scheda Riempimento e scegli il Rosso.
-
Consiglio: Per una leggibilità migliore, in questa regola puoi impostare il colore del carattere in Bianco o Grassetto.
βοΈ Gestione delle Priorità (Importante!)
Se una data è passata, è tecnicamente anche "entro i 7 giorni" per Excel. Per evitare conflitti:
-
Vai su Gestisci regole...
-
Assicurati che la regola del Rosso sia sopra quella del Giallo.
-
Spunta la casella "Interrompi se vera" accanto alla regola del Rosso.
π Nota sulla lingua delle formule (EN vs IT)
β οΈ Importante per la riproduzione: Se guardando le immagini del tutorial notate delle formule leggermente diverse (come AND al posto di E o TODAY al posto di OGGI), non preoccupatevi.
Gli screenshot sono catturati da una versione di Excel in lingua Inglese (EN-US). Tuttavia, se state utilizzando la versione italiana di Microsoft Excel, dovrete utilizzare le formule che ho indicato nel testo sopra:
-
E() anziché AND()
-
OGGI() anziché TODAY()
Il funzionamento logico rimane identico, cambia solo la traduzione della funzione.
| Versione Italiana | Versione Inglese |
|---|---|
| =E(B2>=OGGI(); B2<=OGGI()+7 | =AND(B2>=TODAY(), B2<=TODAY()+7) |
| =B2<OGGI() | =B2<TODAY() |
Siamo arrivati al termine di questo percorso progettuale. È stata una sessione intensa che ha trasformato un'idea tecnica in un asset digitale completo, pronto per essere pubblicato e indicizzato.
Ecco il riassunto del nostro viaggio e di tutto ciò che abbiamo costruito e imparato:
1. Sviluppo di un Applicativo Gestionale (Excel VBA)
Abbiamo imparato a superare i limiti di un semplice foglio di calcolo, trasformandolo in un software:
-
UserForm Avanzate: Abbiamo progettato un'interfaccia di inserimento dati professionale, imparando a gestire gli eventi (come l'evento _Click) e a pulire il codice dalle routine inutili generate automaticamente (BeforeDragOver).
-
Integrazione di Moduli Esterni: Abbiamo visto come potenziare l'esperienza utente inserendo un Calendario Pop-up per la selezione delle date.
-
Vincoli Tecnici Grafici: Abbiamo imparato che VBA è selettivo: accetta solo formati .BMP o .ICO per le immagini, evitando i classici errori di caricamento dei formati moderni.
2. Controllo Visivo e Logica di Calcolo
Abbiamo reso il database "parlante" attraverso la visualizzazione dei dati:
-
Formattazione Condizionale: Abbiamo impostato regole logiche per colorare automaticamente le scadenze (Giallo per l'avviso a 7 giorni, Rosso per le scadenze passate).
-
Internazionalizzazione: Abbiamo chiarito la distinzione fondamentale tra le formule in Italiano (OGGI, E) e quelle in Inglese (TODAY, AND), garantendo che il tutorial sia utilizzabile indipendentemente dalla versione di Excel.
In sintesi: Abbiamo imparato che un progetto informatico di successo non è fatto solo di codice che funziona, ma di un mix tra usabilità tecnica, chiarezza comunicativa e visibilità sui motori di ricerca.
Crea il tuo sito web con Webador