Microsoft Access è un potente strumento per la gestione di database, che offre ampie possibilità di personalizzazione e automazione attraverso l'interfaccia utente e il codice VBA. La capacità di manipolare testi, formattare controlli e gestire dinamicamente i dati è fondamentale per creare applicazioni robuste ed efficienti. Questa guida esplora in profondità diverse tecniche e soluzioni per affrontare scenari comuni e complessi nella progettazione di maschere e report.
Formattazione Condizionale e Colori nei Controlli
Una delle esigenze più comuni nella progettazione di maschere continue è la capacità di formattare record o campi in modo particolare, in base a determinate condizioni. Nelle versioni di Access uguali o successive ad A00, la "Formattazione Condizionale" è lo strumento ideale per questo scopo. Per applicarla, è necessario aprire la maschera in visualizzazione struttura, selezionare un controllo e, dal menu Formato, scegliere la voce "Formattazione condizionale".

Per quanto riguarda il colore del testo, è possibile utilizzare la proprietà Formato per distinguere tra un massimo di quattro condizioni differenti, assegnando colori diversi a ciascuna. Per i colori di sfondo, invece, esistono diversi trucchi, come l'utilizzo di controlli in secondo piano, caratteri giganti o immagini BMP, per ottenere l'effetto desiderato.
Gestione dei Controlli Sottomaschera
Le sottomaschere sono elementi cruciali per visualizzare dati correlati. Il nome del controllo che contiene la sottomaschera, definito dalla proprietà "Nome" del controllo, è fondamentale per interagire con essa. È importante notare che questo nome non deve necessariamente essere identico al nome della maschera utilizzata come sottomaschera, cioè la proprietà Oggetto Origine.
Per spostare il fuoco su un controllo all'interno di una sottomaschera, o per i report, la sintassi è la medesima. Supponiamo che in entrambe le maschere, sia quella principale che la sottomaschera, il campo univoco e comparabile sia chiamato "Id". In un evento appropriato, ad esempio all'apertura della maschera, è possibile programmare il movimento del fuoco.
Imparare Access - Tutorial 8 - Le sottomaschere
L'uso del Recordset della maschera è disponibile a partire da Access 2000. Nelle versioni più datate, come Access 97, si può ricorrere al RecordsetClone per ottenere funzionalità simili.
Ricerca Dinamica e Aggiornamento dei Dati
La capacità di eseguire ricerche dinamiche e di aggiornare i dati in modo efficiente è un pilastro di qualsiasi applicazione database. Se si dispone di una casella di testo o una casella combinata non associate, ad esempio chiamata "txtRicerca", è possibile utilizzarle per filtrare i dati visualizzati. Dopo aver inserito o selezionato un valore, ad esempio un "Id", la maschera può essere aggiornata per mostrare solo i record corrispondenti.
Quando si utilizza Requery per aggiornare i dati in una maschera, un effetto collaterale comune è il ritorno del fuoco al primo record. Per ovviare a questo problema, è buona pratica salvare l'Id (un campo univoco) del record corrente prima di eseguire il Requery e ripristinare il fuoco sul record desiderato dopo l'aggiornamento.
Apertura Multipla di Maschere
Esistono scenari in cui è utile aprire una maschera più di una volta, mostrando diverse istanze della stessa maschera contemporaneamente sullo schermo. Questo può essere utile per confrontare dati o per lavorare su record diversi in finestre separate. Le tecniche per realizzare ciò possono variare, ma spesso coinvolgono l'uso del codice VBA per aprire nuove istanze della maschera.
Ordinamento dei Record
Modificare il tipo di ordinamento in una maschera senza ricorrere ai pulsanti "Ordinamento crescente/decrescente" nella barra dei comandi è spesso preferibile per un approccio più professionale e controllato. Generalmente, il modo migliore per ordinare i record è quello di cambiare direttamente l'origine dati della maschera. Questo non solo garantisce un comportamento più prevedibile, ma evita anche che Access salvi l'ultimo criterio di ordinamento nella proprietà OrderBy della maschera, che può portare a comportamenti inaspettati se non gestita correttamente.

Compatibilità e Aggiornamenti del Codice
Le differenze di comportamento tra le diverse versioni di Access richiedono attenzione, soprattutto quando si utilizzano maschere popup e codice generato dall'autocomposizione. In Access 97, i comandi DoMenuItem non operano correttamente in una maschera popup; anche con VBA, le voci di menu non sono raggiungibili in questo contesto. La soluzione raccomandata è sostituire i DoMenuItem con RunCommand. È sempre consigliabile sostituire il "datato" DoMenuItem, che esiste solo per ragioni di compatibilità e non è stato aggiornato da Microsoft per lungo tempo.
Gestione degli Input dell'Utente e Validazione
Impedire all'utente di inserire in un campo un valore già presente nella tabella sottostante è un requisito comune per mantenere l'integrità dei dati. Il controllo di questa condizione non dovrebbe avvenire solo al salvataggio del record, ma preferibilmente prima, per fornire un feedback immediato all'utente. Un approccio prevede la verifica del valore inserito rispetto ai dati esistenti prima che il record venga effettivamente salvato. La gestione del tipo di dato (ad esempio, testo) è cruciale in questo contesto.
Proprietò KeyPreview
Impostare la proprietà KeyPreview (Anteprima tasti) della maschera a "Sì" consente alla maschera di ricevere gli eventi della tastiera prima che vengano passati al controllo attivo. Questa funzionalità è utile per implementare scorciatoie da tastiera personalizzate o per intercettare e gestire input specifici a livello di maschera.
Valori Calcolati: Salvare o Ricalcolare?
Generalmente, non è una buona abitudine salvare i valori calcolati direttamente nelle tabelle. Prima di procedere con il salvataggio, è opportuno valutare attentamente se sia veramente necessario, dato che solitamente un valore può essere ricalcolato in qualsiasi momento. Salvare valori calcolati può portare a ridondanze e incoerenze nei dati, a meno che non ci siano specifiche esigenze di performance o di snapshot storico che lo giustifichino.
Gestione delle Caselle Combinate e di Riepilogo
Le caselle combinate e le caselle di riepilogo sono controlli versatili per la selezione di valori.
Aggiunta Automatica di Nuovi Elementi
Se un utente digita un valore in una casella combinata che non è presente nell'elenco, è possibile aggiungerlo automaticamente all'origine dati senza richiedere ulteriori conferme. Ad esempio, se si ha una maschera "frmFattura" con una combo "cboRicercaClienti" (la cui colonna associata è "IdCliente"), e l'utente digita un nuovo valore, è possibile aprire una maschera di inserimento dati ("frmNuovoCliente"), acquisire il nome del nuovo cliente e permettere all'utente di aggiungere ulteriori dettagli. Dopo la chiusura della maschera di inserimento, la combo "cboRicercaClienti" mostrerà il nuovo valore. Una finestra di messaggio può essere utilizzata per chiedere conferma all'utente prima di aggiungere un nuovo cliente.

Formattazione delle Colonne
Le colonne delle caselle di riepilogo sono sempre considerate come testo e giustificate a sinistra, il che può rendere difficile l'allineamento di valori numerici o date. Per ottenere una formattazione desiderata, come l'allineamento a destra, si possono utilizzare diverse tecniche:
- Scegliere un font non proporzionale per la casella di riepilogo (ad esempio, Courier New).
- Nella query sottostante, utilizzare espressioni SQL per riempire le stringhe con spazi all'inizio, garantendo un allineamento visivo. Ad esempio,
Format([CampoNumerico],"@@@@@@@@@@@@")oRight(" " & [CampoNumerico],12)per una stringa di 12 caratteri. - In alternativa, è possibile utilizzare le API di Windows per un controllo più granulare sulla visualizzazione.
Caselle Combinate Dipendenti
Quando si hanno caselle combinate dipendenti, ad esempio una "cboCategorie" e una "cboProdotti" nella maschera "frm_Prodotti", la selezione in una combo influenza gli elementi disponibili nell'altra. Se l'origine riga della casella combinata dipendente non è impostata dinamicamente tramite codice (come mostrato in alcuni esempi), ma si basa su una query salvata, è necessario aggiornare la visualizzazione della combo dipendente dopo la selezione nella prima. Questo si fa tipicamente con un Requery sulla casella combinata dipendente.
Intercettazione di Eventi e Tasti Speciali
Eventi delle Schede
Quando si cambia pagina facendo click su una scheda di un controllo "Struttura a Schede", viene lanciato l'evento Su modifica del controllo. In questo evento, è possibile leggere la proprietà PageIndex del controllo, che è equivalente alla proprietà Value standard, per determinare quale pagina è stata selezionata.
Disattivazione Tasti Speciali
Per disattivare i tasti speciali di Access (
- Tramite l'interfaccia utente: Andare su Strumenti/Avvio/Avanzate e deselezionare l'opzione "Usa tasti speciali Access".
- Utilizzare una macro denominata
Autokeysper ridefinire o disabilitare specifici tasti. - Programmare i singoli controlli: Nelle istruzioni VBA negli eventi
Su InviooSu clickdel controllo, o posizionando il cursore all'interno del controllo, è possibile intercettare e gestire gli eventi della tastiera.
Verifica dell'Apertura di una Maschera
Per sapere se una determinata maschera è attualmente aperta, ad esempio per evitare di aprirla più volte inutilmente, si possono usare funzioni o cicli che controllano la collezione Forms. Alternativamente, in Access 95 e 97, era possibile utilizzare la funzione SysCmd.
Dimensionamento e Posizionamento Dinamico
Il desiderio di adattare le dimensioni delle maschere, la posizione e la grandezza dei controlli in base a diverse condizioni o risoluzioni dello schermo è una caratteristica avanzata. Questo può essere realizzato tramite codice VBA che calcola le nuove dimensioni e posizioni basandosi su parametri specifici, spesso in risposta a eventi come il ridimensionamento della maschera.
Il Problema del Rettangolo Trasparente
Se un controllo sembra non funzionare correttamente, ad esempio un pulsante che non risponde al click, la causa potrebbe essere la presenza di un rettangolo trasparente o un altro oggetto simile attorno o sopra il controllo, che impedisce al controllo di essere in primo piano e di ricevere gli eventi del mouse. È necessario verificare la gerarchia degli oggetti e assicurarsi che il controllo desiderato sia visibile e accessibile.
Scorri con la Rotellina del Mouse
L'utente può spostarsi da un record all'altro utilizzando la rotellina del mouse. Se questo comportamento non è desiderato, può essere intercettato e disabilitato attraverso il codice VBA nell'evento Su Scorrimento Rotellina della maschera.
Intestazioni di Colonna in Visualizzazione Foglio Dati
Quando una maschera viene visualizzata in visualizzazione Foglio Dati, le intestazioni delle colonne vengono determinate come segue:
- Se il controllo non ha un'etichetta associata, la proprietà
Nome elementodel controllo viene utilizzata come intestazione della colonna. - Se è presente un'etichetta associata, la sua proprietà
Etichettaviene usata come intestazione della colonna. Il controllo etichetta stesso non viene mai mostrato in visualizzazione foglio dati. Pertanto, è possibile adattare questa proprietà in visualizzazione struttura o con VBA per modificare l'intestazione della colonna.
Maschere Vuote
Una maschera che è aperta in visualizzazione Maschera ma appare completamente vuota (non mostra alcun controllo) è un problema comune. La ragione più frequente è che la tabella sottostante o, più spesso, la query (definita nella proprietà Origine record) non restituisce alcun record. Inoltre, la possibilità di creare nuovi record potrebbe essere disabilitata nella query o nella maschera. Per risolvere, è necessario assicurarsi che l'origine dati restituisca i record o che permetta l'aggiunta di nuovi record. Se invece si desidera che almeno un pulsante sia visibile (ad esempio, un pulsante "Nuovo Record"), è necessario progettarlo appositamente.
Disabilitazione del Pulsante di Chiusura
Se non si desidera che il pulsante di chiusura (la 'X' nella barra del titolo) compaia in una maschera di Access, è possibile impostare la proprietà Pulsante di Chiusura della maschera a "No". Se si vuole semplicemente impedire la chiusura della maschera, si può intercettare l'evento Su scaricamento della maschera (vedi FAQ 1.12). Tuttavia, in Access 97, il malfunzionamento del pulsante di chiusura può essere evitato solo attraverso l'uso di funzioni API.
Funzione Eval e Separatori Decimali
La funzione Eval è estremamente utile per valutare espressioni stringa come se fossero codice. Ad esempio, se si hanno caselle di testo chiamate "txtFormula" e "txtRisultato", è possibile utilizzare Eval per calcolare il risultato della formula inserita dall'utente. Spesso, però, Eval utilizza il punto come separatore decimale, il che può essere un problema se l'utente è abituato a usare la virgola. Per ovviare a ciò, nelle versioni di Access uguali o successive ad A00, è molto più semplice utilizzare la funzione Replace per sostituire la virgola con il punto nella stringa della formula prima di passarla a Eval. In questo modo, il risultato viene mostrato correttamente nel controllo.
Selezione Multipla di Record Non Consecutivi
Il selettore record in Access permette solo di selezionare record consecutivi. Il tasto <Ctrl> non ha la funzione convenzionale di Windows per una selezione discontinua. Se si hanno selezionato più record con il selettore record, è possibile utilizzare le proprietà SelTop e SelHeight della maschera per determinare i record selezionati. Se invece si desidera selezionare record non consecutivi, la soluzione più comune è utilizzare una casella di controllo associata che deve essere impostata per ciascun record desiderato e poi eventualmente resettata, ad esempio, con una query di aggiornamento.
Campi Password e Controllo Ortografia
Un'importante considerazione di sicurezza per i campi password: se con il cursore nella casella di password viene attivato il controllo ortografia con <F7> o tramite menu/ribbon, il testo della password si renderà visibile in chiaro nella finestra di dialogo del controllo ortografia. Questo rappresenta una potenziale falla di sicurezza e deve essere gestito, ad esempio, disabilitando il controllo ortografia per i campi password.
Caselle Combinate Multilinea nelle Proprietà
Alcune caselle combinate all'interno della finestra di dialogo "Proprietà" di Access accettano la digitazione su più righe. Questa caratteristica si applica ai campi per le istruzioni SQL e alle proprietà delle caselle di testo o dei campi per i nomi. È possibile aprire questi campi e inserire il testo desiderato nell'elenco. Similmente alle caselle di riepilogo o alle caselle combinate, è possibile aprire o chiudere l'elenco con un clic del mouse sulla freccia posta all'estremità destra del campo. In questo caso, i dati possono essere inseriti sia nell'elenco che nel primo campo di testo. Fanno eccezione le proprietà rappresentate in forma di elenco, come la proprietà "Voci dell'elenco", impostabili per i campi di controllo Casella di riepilogo e Casella combinata.
La scheda "Generale" delle proprietà di un campo di controllo del formulario permette di definire le proprietà generali. Le proprietà possono variare in base al tipo di campo di controllo.
Funzioni SQL e VBA Essenziali
Access offre una serie di funzioni intrinseche in SQL e VBA, utili per la manipolazione di stringhe, date e per i controlli di validazione.
Funzioni di Manipolazione Stringhe
Left(StringaDaCercare, N): Restituisce i primi N caratteri di una stringa.StringaDaCercareè l'argomento di tipo stringa, mentreNè un intero che indica il numero di caratteri da estrarre da sinistra.Right(StringaDaCercare, N): Restituisce gli ultimi N caratteri di una stringa. Similmente aLeft,StringaDaCercareè una stringa eNè un intero.Mid(StringaDoveCerco, PosizioneIniziale, [Lunghezza]): Estrae una sottostringa daStringaDoveCerco, partendo daPosizioneInizialeper una determinataLunghezza.InStr([PosizioneIniziale, ]StringaDoveCerco, StringaDaCercare[, Confronto]): Restituisce la posizione della prima occorrenza di una sottostringa all'interno di un'altra stringa.Trim(Argomento): Restituisce l'argomento (di tipo stringa) privo degli spazi iniziali e finali.LTrim(Argomento): Elimina dalla stringa passata come argomento gli spazi iniziali.RTrim(Argomento): Elimina dalla stringa passata come argomento gli spazi finali.UCase(Argomento): Converte l'argomento in caratteri maiuscoli.LCase(Argomento): Converte l'argomento in minuscolo.

Funzioni di Data e Ora
Date(): Restituisce la data corrente del sistema.Now(): Restituisce la data e l'ora correnti del sistema.Year(Data): Restituisce l'anno dalla data passata come argomento.Month(Data): Restituisce il mese (da 1 a 12) dalla data.Day(Data): Restituisce il giorno del mese dalla data.Weekday(Data[, PrimoGiornoDellaSettimana]): Restituisce il giorno della settimana (1 = domenica, 2 = lunedì, ecc.) dalla data.Format(Espressione, Formato): Formatta un'espressione (numerica, data, stringa) secondo un formato specificato. Esempi di formati data:ddper il giorno con lo 0 iniziale,mmper il mese con lo 0 iniziale.
Funzioni di Controllo Null
IsNull(Argomento): Restituisce Vero se l'argomento passato come parametro è Null.Nz(Argomento[, ValoreSeNull]): Restituisce un valore specificato (o zero/stringa vuota) se l'argomento è Null. In alcune espressioni dell'interfaccia di Access,IsNullpuò restituire 1 al posto diTruese l'argomento è nullo.
Operatori SQL Standard
Molte di queste funzioni sono compatibili con lo standard SQL ANSI, accettato dalla gran parte dei DB SERVER, rendendo il codice portabile.
Integrazione con Report: Testi Dinamici e Formattazione
La creazione di report dinamici, dove il testo cambia in base agli aggiornamenti dei dati, è un'esigenza comune. Supponiamo di avere un report che genera una lettera i cui contenuti variano in base ai cambiamenti delle quote da pagare nel tempo. I dati potrebbero riguardare aggiornamenti specifici che non si applicano a tutti gli utenti.
Per gestire questo, si possono utilizzare le istruzioni IIf all'interno di una query che alimenta il report. Ad esempio, il primo IIf potrebbe riportare la prima riga di testo, il secondo IIf la prima e la seconda, e così via, in base alle condizioni sui dati (Anno, Quota). Questo approccio permette di avere sezioni di testo condizionali.
Formattazione del Testo con chr(10)
Un problema comune quando si concatenano testi condizionali è che le frasi possono apparire una attaccata all'altra anziché una sotto l'altra. Questo accade perché i salti di riga non vengono automaticamente inseriti. Per inserire una nuova riga in Access, si deve utilizzare il carattere chr(10). Ad esempio, concatenando stringhe con & chr(10) & si garantisce che ogni frase appaia su una riga separata.
=IIf([Condizione1], "Prima riga di testo" & chr(10), "") & _ IIf([Condizione2], "Seconda riga di testo" & chr(10), "") & _ IIf([Condizione3], "Terza riga di testo", "")Questo approccio, seppur apparentemente banale, è fondamentale per la corretta formattazione del testo in report dinamici. La concatenazione delle espressioni IIf con chr(10) permette di creare blocchi di testo che si adattano alle condizioni specifiche dell'utente, garantendo una leggibilità ottimale del documento finale.
Imparare Access - Tutorial 8 - Le sottomaschere
In un contesto dove un report viene generato automaticamente per vari utenti, e alcuni non necessitano di certi blocchi di testo, l'uso combinato di IIf e chr(10) all'interno della query sottostante il report diventa una soluzione potente ed elegante. Si può scegliere l'utente da un menu a tendina e, cliccando su un pulsante "Genera report", produrre un report corrispondente alla situazione dei dati per quell'utente, con il testo correttamente formattato su più righe.
Altre Funzionalità Utili
API di Windows
È possibile richiamare le funzioni API di Windows direttamente da VBA per estendere le funzionalità di Access, ad esempio per un controllo più preciso sull'interfaccia utente o per interagire con il sistema operativo a un livello più basso. È importante considerare che l'uso delle API richiede una buona conoscenza di programmazione e delle chiamate di sistema, e può presentare problemi di compatibilità tra versioni a 32 e 64 bit di Office.
Maschera Formato
Le maschere sono controlli che permettono di guidare l'input dell'utente in un formato specifico (es. (000) 000-0000 per numeri di telefono).
#: Segnaposto di cifra. Visualizza una cifra o uno zero.&: Segnaposto di carattere. Visualizza un carattere o uno spazio. Se nella posizione specificata non vi è alcun carattere, in tale posizione verrà visualizzato uno spazio.>: Applica le maiuscole al testo successivo.<: Applica le minuscole al testo successivo.
L'uso di chr(10) per i salti di riga e le tecniche di formattazione condizionale e dinamica dei testi sono esempi chiari di come Access, attraverso un'attenta programmazione, possa essere trasformato in uno strumento flessibile e potente per la creazione di applicazioni gestionali su misura.