Usare VBA in Microsoft Access permette di superare i limiti delle automazioni più semplici e costruire logica personalizzata per maschere, report, query, importazioni, esportazioni, controlli e integrazioni. VBA, Visual Basic for Applications, è l’ambiente di programmazione integrato nelle applicazioni Office desktop tradizionali e in Access viene utilizzato soprattutto negli eventi delle maschere, nei moduli standard e nelle funzioni richiamate da query o macro.
Questa guida è pensata per Access per Microsoft 365 e Access 2024 su Windows. Access Runtime può eseguire codice VBA incluso nell’applicazione ma non fornisce l’ambiente completo di sviluppo. Inoltre la compatibilità tra Office 32 bit e 64 bit deve essere considerata quando il progetto usa API Windows, ActiveX, COM, provider o librerie esterne. Vedremo un metodo pratico per iniziare e soprattutto le regole per scrivere codice manutenibile e sicuro.
Indice
- Che cos’è VBA in Access
- Aprire l’editor
- Moduli e procedure
- Eventi
- DoCmd
- DAO
- Query e recordset
- Error handling
- Debug
- 32/64 bit
- Runtime e sicurezza
- FAQ
Che cosa puoi fare con VBA
Con VBA puoi validare dati prima del salvataggio, aprire una maschera filtrata, creare file Excel, esportare PDF, importare CSV, eseguire query, scorrere record, aggiornare tabelle, creare funzioni personalizzate e integrare Access con componenti esterni supportati.
Non significa che ogni attività debba essere programmata. Le query e le macro restano strumenti fondamentali. Usa VBA quando aggiunge chiarezza, controllo o riutilizzo, non quando rende più complicata un’operazione già risolta bene dal Generatore di macro.
Aprire l’editor VBA
In Access puoi aprire l’editor dall’area Macro e codice oppure usare la scorciatoia appropriata nell’ambiente desktop. Selezionando un evento di una maschera e scegliendo [Procedura evento], Access crea anche il punto di ingresso corretto.
L’editor mostra il Project Explorer, i moduli, le proprietà e la finestra del codice. Se il Project Explorer non è visibile, puoi riattivarlo dal menu Visualizza.
Modulo standard e modulo di maschera
Un modulo standard contiene procedure e funzioni riutilizzabili dall’intera applicazione. Un modulo di maschera appartiene a quella maschera e contiene soprattutto eventi e logica collegata ai suoi controlli.
Metti la logica riutilizzabile in moduli standard. Se la funzione CalcolaSconto serve in cinque maschere, non copiarla cinque volte. Creala in un modulo come modVendite.
Sub e Function
Una Sub esegue azioni ma non restituisce direttamente un valore. Una Function restituisce un risultato. Per esempio:
Public Function TotaleRiga(ByVal Quantita As Double, ByVal Prezzo As Currency) As Currency: TotaleRiga = Quantita * Prezzo: End Function
Puoi richiamare una funzione pubblica da altri moduli e, in molti scenari, da espressioni Access. Usa tipi espliciti e non affidarti sempre a Variant.
Option Explicit
Inserisci Option Explicit all’inizio dei moduli. Obbliga a dichiarare le variabili e riduce errori causati da refusi. Se scrivi totlae invece di totale, il compilatore segnala il problema anziché creare implicitamente una nuova variabile.
È una delle abitudini più importanti per progetti Access professionali.
Dichiarare le variabili
Scegli il tipo più adatto: Long per molti identificatori interi, Currency per importi monetari, Date per date e orari, String per testo, Boolean per vero/falso. Evita di usare Double per denaro se non esiste una ragione precisa, perché Currency è progettato per calcoli monetari con una rappresentazione adeguata.
Scope delle variabili
Una variabile dichiarata dentro una procedura è locale. Una variabile Private a livello modulo è visibile nel modulo. Una Public in un modulo standard è globale. Limita lo scope al minimo necessario. Le variabili globali rendono più difficile capire chi modifica un valore.
Eventi delle maschere
VBA è molto usato negli eventi: Su clic, Prima di aggiornamento, Dopo aggiornamento, Su apertura, Su caricamento, Su corrente. Ogni evento ha un momento preciso nel ciclo di vita della maschera.
Per esempio, Before Update è adatto a validare il record prima del salvataggio. Puoi annullare l’operazione se manca un dato obbligatorio.
Validazione con Before Update
Supponiamo che DataFine non possa essere precedente a DataInizio. Nell’evento Before Update controlla entrambe e, se la condizione è errata, mostra un messaggio e imposta Cancel = True.
Metti comunque le regole fondamentali anche a livello tabella quando possibile. Una validazione soltanto nella maschera può essere aggirata da altre query o importazioni.
Evento Su clic di un pulsante
Il pulsante può avere [Procedura evento]. Access crea una Sub del tipo Private Sub cmdReport_Click(). Qui puoi verificare i dati e poi usare DoCmd.OpenReport.
Mantieni il codice del pulsante breve. Se deve svolgere un processo complesso, chiama una Sub pubblica o privata con un nome descrittivo.
L’oggetto DoCmd
DoCmd espone metodi che corrispondono a molte azioni Access: aprire maschere e report, eseguire comandi, trasferire fogli o testo e produrre output. Microsoft Learn documenta i metodi disponibili.
Un esempio concettuale è DoCmd.OpenForm per aprire una maschera. DoCmd.OpenReport apre un report. DoCmd.TransferSpreadsheet importa o esporta fogli.
Aprire una maschera filtrata
Puoi costruire una condizione Where e passarla a OpenForm. Per un ID numerico il criterio è semplice; per stringhe devi gestire gli apostrofi. Non concatenare valori utente senza pensare alla sintassi.
Quando possibile usa query parametrizzate o funzioni che costruiscono criteri in modo centralizzato.
Aprire un report
DoCmd.OpenReport può aprire in anteprima e applicare un filtro. Questo è utile per report per cliente o periodo. Dopo l’apertura puoi esportare il report in PDF con metodi appropriati.
TransferSpreadsheet
Microsoft documenta DoCmd.TransferSpreadsheet per importare o esportare dati tra Access e fogli di calcolo. Per esportare una query, crea prima una query salvata e passa il suo nome.
Per procedure professionali controlla il file, il percorso e l’esito. Evita percorsi hard-coded sparsi nel codice.
TransferText
Per CSV e file di testo puoi usare DoCmd.TransferText. Quando il tracciato è complesso, utilizza una specifica di importazione o esportazione salvata.
Documenta separatore, codifica, date e tipi. CSV non conserva tipi, quindi il sistema ricevente deve sapere come interpretare le colonne.
DAO in Access
DAO, Data Access Objects, è uno dei modelli principali per lavorare programmaticamente con il database Access. Puoi aprire un Database, creare Recordset ed eseguire query.
Una pratica comune è utilizzare CurrentDb per ottenere un riferimento al database corrente. Da lì puoi eseguire una query di azione con opzioni che generano un errore in caso di violazione, rendendo il processo più controllabile rispetto a comandi che sopprimono avvisi.
Eseguire query di azione con DAO
Per un aggiornamento puoi usare un oggetto Database e il metodo Execute con l’opzione appropriata come dbFailOnError. Questo consente di intercettare errori. Non usare DoCmd.SetWarnings False come metodo generico per nascondere tutto: rischi di lasciare gli avvisi disattivati dopo un errore.
Recordset
Un Recordset permette di scorrere record. È utile quando devi eseguire una logica per ogni riga che non è facilmente esprimibile in una query set-based. Tuttavia le query SQL sono spesso più veloci di un ciclo VBA per aggiornare migliaia di record.
Prima di scrivere un ciclo, chiediti se un UPDATE, INSERT SELECT o query aggregata può fare lo stesso lavoro.
Query parametrizzate
In DAO puoi utilizzare QueryDef con parametri. È più robusto che costruire SQL concatenando testo e valori. I parametri riducono problemi con delimitatori, date e stringhe.
Funzioni personalizzate
Una Function pubblica può essere richiamata da una query Access in molti scenari. È utile per logica non disponibile come espressione standard. Usa con cautela su dataset grandi: una funzione VBA chiamata una volta per ogni riga può rallentare molto.
Error handling
Un modello base usa On Error GoTo GestErrore. Nella sezione errore registra Err.Number ed Err.Description. Aggiungi una sezione di uscita che chiude recordset e ripristina lo stato dell’interfaccia.
Non usare On Error Resume Next su intere procedure senza controllare gli errori. È adatto soltanto a piccoli blocchi in cui un errore specifico è previsto e viene immediatamente valutato.
Logging degli errori
Crea una tabella tblErrorLog con data, procedura, numero, descrizione, utente e contesto. Una funzione centrale LogError evita di duplicare codice.
Nei client Runtime il log è fondamentale perché l’utente non ha accesso agli strumenti di debug.
Debug nell’editor VBA
Puoi impostare breakpoint, eseguire passo passo, usare la finestra Immediata e controllare valori. Il debug deve essere una parte normale dello sviluppo, non un’attività emergenziale.
Compila periodicamente il progetto dal menu Debug. Un riferimento mancante o una funzione non definita deve essere trovato prima della distribuzione.
Finestra Immediata
La finestra Immediata permette di stampare valori con Debug.Print e provare semplici espressioni. È molto utile per capire quale criterio SQL viene costruito o quale valore contiene un controllo.
Breakpoint e Watch
Imposta un breakpoint prima dell’istruzione sospetta e verifica le variabili. Per errori che dipendono da un valore specifico puoi usare condizioni e Watch.
Riferimenti VBA
Dal menu Strumenti > Riferimenti puoi vedere le librerie utilizzate. Se una libreria è marcata MISSING, il progetto può smettere di compilare e funzioni apparentemente non correlate possono fallire.
Riduci le dipendenze non necessarie. Per automazione Office puoi scegliere early binding con riferimento esplicito o late binding senza riferimento, valutando vantaggi e limiti.
Early binding e late binding
Early binding offre IntelliSense e controllo tipi durante lo sviluppo ma dipende dalla libreria di riferimento. Late binding usa CreateObject e costanti numeriche o definite manualmente, riducendo alcuni problemi di versione ma perdendo IntelliSense.
Per Outlook considera anche il cambiamento tecnologico: il nuovo Outlook per Windows non supporta il tradizionale modello COM/VBA come Outlook classico. Non progettare nuove automazioni dando per scontato quel modello.
32 bit e 64 bit
VBA puro tende a funzionare su entrambe le architetture, ma chiamate API Windows e alcuni controlli richiedono attenzione. In Office 64 bit le dichiarazioni API devono essere compatibili, spesso con PtrSafe e tipi LongPtr.
Non sostituire automaticamente tutti i Long con LongPtr. Solo valori che rappresentano puntatori o handle richiedono tipi adeguati. Consulta la documentazione Microsoft per ogni API.
Conditional compilation
Per supportare più versioni puoi usare direttive di compilazione condizionale come VBA7 e Win64 quando realmente necessario. Mantieni il codice semplice e documenta le varianti testate.
Access Runtime
Runtime esegue codice incluso, ma non offre il normale editor VBA all’utente. Per questo ogni errore deve essere gestito. Mostra messaggi comprensibili e registra il dettaglio tecnico.
Testa l’applicazione installando Runtime su una macchina di prova senza Access completo. È il modo migliore per scoprire dipendenze nascoste.
Sicurezza macro e VBA
Il codice può essere bloccato se il database non è attendibile. Distribuisci il front-end in una Trusted Location gestita oppure firma il progetto con un certificato appropriato. Non chiedere agli utenti di disabilitare le protezioni.
Firma digitale
Una firma consente di verificare l’origine e l’integrità del codice. Se modifichi il progetto dopo la firma, devi firmarlo di nuovo. Usa un certificato aziendale affidabile per distribuzioni organizzate.
ACCDE
Creare ACCDE compila il progetto e impedisce varie modifiche a moduli e oggetti. È utile per distribuire un’applicazione. Conserva sempre il file ACCDB sorgente in un repository sicuro perché non puoi usare ACCDE come sostituto completo del sorgente.
Controllo versione
VBA nei file Access non si integra naturalmente con Git come file di testo. Puoi esportare moduli in file .bas e .cls per versionarli, oppure usare strumenti di sviluppo dedicati. Per progetti importanti conserva versioni numerate e note di rilascio.
Separare configurazione e codice
Percorsi, server e parametri devono stare in una tabella Configurazione. Il codice legge i valori. Questo evita modifiche al VBA quando cambia una cartella.
Non memorizzare password
Una password in un modulo è recuperabile. Usa autenticazione integrata o sistemi sicuri. Nascondere il modulo o creare ACCDE non rende una credenziale in chiaro realmente protetta.
VBA in multiutente
Ogni utente esegue il codice nel proprio front-end locale. Se la procedura modifica dati condivisi, considera concorrenza e blocchi. Una routine che calcola e aggiorna lo stesso record da due client può generare conflitti.
Per operazioni critiche usa transazioni, controlli di versione del record o sposta la logica sul server.
Prestazioni
Evita di aprire recordset completi se basta una query aggregata. Limita i campi, usa indici e query parametrizzate. Per tabelle SQL Server cerca di evitare elaborazioni riga per riga sul client.
Transazioni DAO
Per gruppi di modifiche puoi usare transazioni del Workspace quando il contesto e le tabelle le supportano. Avvia, esegui, commit se tutto riesce e rollback in caso di errore. Documenta attentamente il confine della transazione.
Automatizzare Excel
Access può creare un oggetto Excel tramite automazione COM nelle versioni desktop tradizionali. È utile quando TransferSpreadsheet non basta e devi formattare celle o creare grafici. Tuttavia è più fragile e dipende dalla presenza di Excel.
Per semplice trasferimento dati preferisci TransferSpreadsheet o Power Query. Usa automazione Excel soltanto quando serve davvero manipolare l’applicazione.
Automatizzare Word
VBA può controllare Word per documenti complessi, ma la stampa unione spesso risolve il problema con meno codice. Scegli l’approccio più semplice e supportabile.
Inviare email
Le automazioni storiche con Outlook dipendono da Outlook classico. Il nuovo Outlook per Windows non espone il vecchio modello COM/VBA. Per nuovi progetti valuta servizi moderni e API quando appropriato.
Chiamare servizi Web
VBA può effettuare richieste HTTP tramite componenti Windows in scenari appropriati, ma Access non è un server web. Se devi integrare API, gestisci autenticazione, timeout, JSON, errori e protezione dei segreti. Per flussi enterprise può essere preferibile un middleware.
Scrivere codice leggibile
Usa nomi come CalcolaTotaleOrdine, non Proc1. Mantieni procedure piccole, commenta le decisioni e non le istruzioni ovvie. Riduci variabili globali. Crea funzioni di utilità soltanto quando vengono realmente riutilizzate.
Problemi comuni
Errore di compilazione
Compila il progetto, controlla sintassi e riferimenti mancanti.
Funzione non definita
Verifica nome, scope e modulo. Un riferimento mancante può causare sintomi inattesi.
Il codice non parte
Controlla proprietà evento e sicurezza del database.
Errore solo su Office 64 bit
Verifica API, ActiveX, provider e librerie.
Runtime chiude la procedura
Gestisci gli errori e non dipendere da interfaccia di sviluppo.
Query VBA lenta
Sostituisci cicli con query set-based, aggiungi indici e riduci i record.
Outlook non viene creato
Verifica se il PC usa nuovo Outlook; il modello COM tradizionale non è supportato allo stesso modo.
Checklist
- Option Explicit.
- Variabili tipizzate.
- Procedure piccole.
- Gestione errori.
- Log.
- Progetto compilato.
- Riferimenti controllati.
- 32/64 bit testati.
- Runtime testato.
- Credenziali non hard-coded.
- Backup.
- Versione documentata.
FAQ
Serve VBA per usare Access?
No. Molte soluzioni funzionano con tabelle, query, maschere e macro. VBA serve quando la logica richiede più controllo.
VBA funziona in Access Runtime?
Il codice incluso può essere eseguito, ma l’utente non dispone dell’editor completo. Devi gestire gli errori.
VBA funziona su 64 bit?
Sì, ma API e componenti esterni devono essere compatibili e le dichiarazioni devono essere corrette.
Meglio DoCmd o DAO?
DoCmd è comodo per azioni Access; DAO è spesso migliore per dati, query e recordset controllati. Possono convivere.
Posso esportare Excel?
Sì, con TransferSpreadsheet o automazione Excel quando serve formattazione avanzata.
Posso usare VBA con il nuovo Outlook?
Il nuovo Outlook non supporta il tradizionale modello VBA/COM come Outlook classico, quindi le automazioni legacy devono essere rivalutate.
Fonti Microsoft
Per i metodi disponibili consulta Microsoft Learn sulla raccolta di azioni macro e metodi DoCmd e sulla documentazione VBA di Access. Per Excel consulta la pagina Microsoft relativa a DoCmd.TransferSpreadsheet.
Conclusione
Usare VBA in Microsoft Access consente di costruire applicazioni molto più flessibili, ma la qualità dipende dal metodo: Option Explicit, procedure piccole, error handling, query efficienti, sicurezza e test su 32/64 bit e Runtime.
Inizia con automazioni semplici e sposta nel codice soltanto ciò che ne beneficia. Per confrontare macro e codice consulta a cosa servono le macro in Access. Tutte le guide sono disponibili nella categoria Guide Access.