Come usare VBA in Microsoft Access: tutorial pratico

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.

Lascia un commento