Maschera Access: per aprire una maschera filtrata in Access puoi usare l’azione ApriMaschera oppure VBA con DoCmd.OpenForm, passando un criterio nell’argomento WhereCondition. È il metodo più diretto quando vuoi mostrare solo il cliente, l’ordine, la pratica o il gruppo di record selezionato dall’utente.
Perché aprire una maschera già filtrata
Aprire una maschera già filtrata rende l’interfaccia più chiara e spesso più veloce. Invece di aprire una maschera con migliaia di record e chiedere all’utente di cercare quello corretto, puoi partire dal contesto in cui si trova. Se l’utente fa clic su un ordine nell’elenco ordini, il pulsante Dettagli può aprire frmOrdini direttamente sul record con quell’ID.
Il filtro non modifica i dati e non crea una copia della tabella. Limita semplicemente l’insieme di record mostrati dalla maschera. Questo è diverso da impostare la proprietà DataEntry su Sì, che serve a mostrare solo il record nuovo, ed è diverso anche da cambiare l’Origine record. Un filtro può essere applicato o rimosso mantenendo la stessa struttura della maschera.
Metodo consigliato: WhereCondition di OpenForm
Microsoft documenta l’argomento WhereCondition del metodo DoCmd.OpenForm come una stringa che rappresenta una clausola SQL WHERE senza la parola WHERE. Se vuoi aprire frmClienti sull’ID cliente corrente, puoi usare DoCmd.OpenForm "frmClienti", WhereCondition:="[IDCliente]=" & Me.IDCliente.
Questa tecnica è leggibile perché il criterio è vicino all’azione che apre la maschera. Non devi salvare un filtro globale e non devi modificare la query di origine. È particolarmente adatta a pulsanti Dettaglio, Modifica, Apri ordine, Visualizza pratica e simili.
Procedura passo passo con un ID numerico
Supponiamo di avere frmElencoClienti e frmDettaglioCliente. Nella maschera elenco inserisci un pulsante comando. Nell’evento Su clic scegli Procedura evento e apri l’editor VBA. Prima controlla che il campo chiave non sia Null; poi richiama OpenForm.
Una versione semplice è If IsNull(Me.IDCliente) Then Exit Sub seguita da DoCmd.OpenForm "frmDettaglioCliente", acNormal, , "[IDCliente]=" & CLng(Me.IDCliente). L’uso di CLng rende esplicito che il valore previsto è numerico. Se la maschera di destinazione è basata su una query che contiene IDCliente, Access mostrerà il record corrispondente.
Filtrare usando un campo di testo
I criteri testuali richiedono delimitatori. Se vuoi aprire una maschera filtrata sul codice cliente, una costruzione tipica è "[CodiceCliente]='" & Replace(Me.CodiceCliente, "'", "''") & "'". La funzione Replace raddoppia eventuali apostrofi contenuti nel testo e impedisce che la stringa SQL si interrompa.
Quando è disponibile una chiave numerica univoca, preferiscila al nome o alla descrizione. Filtrare su RagioneSociale può restituire più record se due clienti hanno lo stesso nome e rende il codice sensibile a caratteri speciali. Un ID numerico stabile è più robusto per aprire una scheda di dettaglio.
Filtrare per data
Le date richiedono attenzione alla sintassi e alle impostazioni locali. Se il criterio è semplice e proviene da un controllo data, è spesso più sicuro usare una query parametrica oppure costruire il criterio in modo esplicito. Per esempio puoi applicare un intervallo di date alla maschera invece di concatenare una data visualizzata nel formato locale.
Un approccio robusto consiste nel passare valori a una query parametrica oppure nel costruire criteri con funzioni come DateSerial quando la logica è nota. Se devi filtrare gli ordini del giorno corrente puoi usare un criterio che confronta la parte data del campo con Date(), facendo attenzione ai campi che contengono anche l’ora.
Filtrare per più condizioni
WhereCondition può contenere più criteri collegati con AND o OR. Per esempio, per aprire solo gli ordini del cliente corrente non annullati puoi usare un criterio equivalente a [IDCliente]=123 AND [Annullato]=False. Costruisci la stringa in passaggi leggibili quando i criteri diventano complessi.
Evita una lunga concatenazione in una sola riga. Puoi usare una variabile strWhere, inizializzarla con il primo criterio e aggiungere le condizioni successive soltanto quando i controlli contengono valori. Questo rende molto più semplice gestire filtri facoltativi e diagnosticare errori.
Esempio con criteri facoltativi
Immagina una maschera frmRicerca con cboCliente, cboStato e txtAnno. Se Cliente è compilato, aggiungi il criterio sull’ID; se Stato è compilato, aggiungi il criterio testuale; se Anno contiene un valore, aggiungi un intervallo basato su DateSerial. Alla fine apri frmOrdini con la stringa composta.
La regola importante è non aggiungere AND all’inizio o alla fine della stringa. Una tecnica comune consiste nel creare ogni frammento e usare una funzione di supporto oppure verificare se strWhere è vuota prima di aggiungere AND . Per filtri complessi e riutilizzati in più punti, può essere migliore una query parametrica salvata.
Macro ApriMaschera senza VBA
Non è obbligatorio usare VBA. In una macro incorporata puoi scegliere l’azione ApriMaschera e impostare la Condizione WHERE. È utile per interfacce semplici e rende visibili i parametri direttamente nel Generatore di macro. La logica resta la stessa: la condizione limita i record della maschera aperta.
VBA offre più controllo quando devi concatenare criteri, gestire Null, usare Replace per stringhe, registrare errori o condividere funzioni tra più pulsanti. Se l’azione è lineare, una macro è perfettamente valida. L’importante è evitare doppie logiche sparse tra macro e VBA che fanno la stessa cosa in modi diversi.
Filter e FilterOn: alternativa quando la maschera è già aperta
Se la maschera di destinazione è già aperta, puoi impostare la proprietà Filter e poi FilterOn=True. Questa tecnica è utile quando vuoi cambiare dinamicamente il sottoinsieme visualizzato senza chiudere e riaprire l’oggetto. Microsoft Support documenta anche i filtri comuni, Filtro per selezione, Filtro per maschera e filtri avanzati.
Non confondere il filtro applicato a una maschera già aperta con WhereCondition di OpenForm. Entrambi possono produrre lo stesso risultato visivo, ma il momento e il flusso sono diversi. WhereCondition è ideale all’apertura; Filter/FilterOn è utile quando l’utente è già dentro la maschera.
ApplyFilter nelle macro
L’azione macro ApplyFilter può applicare un filtro, una query o criteri a una maschera, report o tabella nei contesti supportati. È utile se vuoi centralizzare la logica in una macro. Per un pulsante che apre una maschera su un record specifico, però, ApriMaschera con Condizione WHERE tende a essere più immediata.
Se usi ApplyFilter, documenta quando il filtro viene applicato e quando viene rimosso. Gli utenti possono confondersi se una maschera sembra “mancare” record perché un filtro precedente è ancora attivo. Mostra chiaramente lo stato del filtro oppure azzeralo nell’evento appropriato quando il flusso richiede sempre una vista completa.
Aprire la maschera in sola lettura o in inserimento
OpenForm permette anche di specificare la modalità dati. Puoi aprire una maschera per modifica, sola lettura o aggiunta a seconda del contesto. Non usare la sola lettura come sostituto di una vera politica di sicurezza, ma è molto utile per distinguere una schermata “Visualizza” da una schermata “Modifica”.
Se vuoi inserire un nuovo record, il filtro non è lo strumento principale: usa la modalità aggiunta oppure DataEntry=Sì con AllowAdditions=Sì. Se vuoi visualizzare un record esistente, usa WhereCondition. Tenere separati questi due scenari rende il comportamento prevedibile.
Origine record e aggiornabilità
La maschera filtrata può essere modificabile solo se la sua origine dati lo consente. Microsoft spiega che alcune query non sono aggiornabili, per esempio query a campi incrociati, SQL specifiche, query con GROUP BY e altre situazioni in cui Access non può identificare in modo univoco il record da aggiornare.
Se la maschera si apre correttamente ma i controlli sono bloccati, non dare subito la colpa al filtro. Controlla Origine record, RecordsetType, AllowEdits, AllowAdditions e la struttura della query. Un filtro valido può convivere con una query non aggiornabile.
Filtri e prestazioni
Applicare un criterio selettivo può ridurre il lavoro dell’utente e, con origini dati remote, può contribuire a evitare il recupero di dati inutili. Tuttavia la prestazione dipende dalla query sottostante, dagli indici e dal modo in cui Access invia le richieste al back-end. Non considerare WhereCondition una soluzione automatica a ogni lentezza.
Indicizza i campi usati frequentemente nei criteri, soprattutto chiavi e colonne di ricerca. Con SQL Server o Azure SQL, verifica che la query possa essere eseguita in modo efficiente lato server. Una maschera con sottomaschere e combo può generare ulteriori query anche se il record principale è filtrato.
Gestire i Null
Prima di costruire un criterio da un controllo, verifica se il valore è Null. Concatenare Null può produrre una stringa vuota o un criterio incompleto. Se il parametro è obbligatorio, mostra un messaggio e interrompi l’apertura. Se è facoltativo, ometti semplicemente quella condizione.
Per campi nei dati che possono essere Null, usa operatori corretti come Is Null o Is Not Null invece di confrontare con una stringa vuota. Null rappresenta assenza di valore e non è uguale a zero né a stringa vuota.
Problemi comuni: la maschera non mostra alcun record
Controlla prima il criterio. Copia il valore che stai usando e verifica se esiste nella tabella o nella query di origine. Poi controlla il tipo dati: un numero racchiuso tra apici può non essere interpretato come previsto, così come un testo senza delimitatori. Verifica infine che il nome del campo nel criterio sia presente nell’Origine record.
Se usi una data, controlla la presenza dell’ora. Un campo Data/Ora con valore 31/08/2026 14:30 non è uguale a Date() se il confronto include anche la componente temporale. Usa un intervallo dal giorno corrente al giorno successivo quando vuoi includere tutte le ore della giornata.
Problemi comuni: viene chiesto un parametro
Il messaggio Immettere un valore di parametro spesso indica che Access non riconosce un nome usato nel criterio. Può essere un refuso nel campo, un controllo rinominato o un riferimento a una maschera non aperta. Controlla esattamente Nome del controllo e Nome del campo nel Foglio proprietà.
Non usare la didascalia visibile come se fosse il Nome tecnico. Un’etichetta può mostrare Cliente mentre il controllo si chiama cboCliente. Le espressioni devono usare il nome tecnico corretto.
Problemi comuni: il filtro resta attivo
Se la maschera viene riutilizzata in più contesti, può essere necessario rimuovere filtri precedenti o aprirla in un modo coerente. Prima di aggiungere codice per cancellare sempre Filter, verifica il flusso reale: in alcuni casi vuoi conservare l’ultimo filtro, in altri vuoi sempre partire dal criterio passato.
Documenta il comportamento e mostra all’utente se la vista è filtrata. Access visualizza indicatori di filtro e permette di attivare/disattivare filtri; un’interfaccia personalizzata può anche avere un pulsante Mostra tutti.
Compatibilità: Microsoft 365, Access 2024, Runtime e Windows
DoCmd.OpenForm, WhereCondition, Filter, FilterOn e le azioni macro correlate sono funzioni di Access desktop per Windows e si applicano alle versioni correnti, comprese Access per Microsoft 365 e Access 2024. Access Runtime può eseguire le maschere e il codice già progettati.
La procedura non è una funzione Web e non esiste una versione nativa di Access desktop per macOS equivalente alla versione Windows. Se il front-end deve funzionare nel browser, occorre una tecnologia diversa anche quando i dati risiedono in SQL Server o Azure SQL.
La differenza 32/64 bit non cambia la sintassi di OpenForm o dei filtri. Diventa importante solo se il progetto usa API, ActiveX o librerie esterne incompatibili con una delle architetture.
Sicurezza e manutenzione
Se usi VBA, esegui il database in un contesto attendibile secondo le policy di Office. Non abilitare macro indiscriminatamente in file provenienti da fonti sconosciute. In azienda distribuisci il front-end in una posizione attendibile e conserva una copia sorgente ACCDB.
Assegna nomi chiari a maschere, controlli e campi. Una routine come ApriOrdine diventa semplice da leggere se usa frmOrdini, IDOrdine e cmdApri. Evita nomi generici come Campo1 o Pulsante17, perché rendono difficile diagnosticare criteri errati.
Collaudo pratico
Prova almeno questi casi: chiave valida, chiave inesistente, chiave Null, filtro testuale con apostrofo, filtro con più condizioni e ritorno alla maschera chiamante. Se la maschera è modificabile, cambia un valore e verifica direttamente nella tabella che il record aggiornato sia quello corretto.
Prova anche l’apertura da Access Runtime se l’applicazione verrà distribuita in quel modo. Gli utenti Runtime hanno meno strumenti di progettazione e quindi un errore di filtro deve essere gestito con messaggi chiari, non lasciato a un prompt tecnico.
Esempio completo di flusso Cliente-Ordini
In frmClienti hai una sottomaschera con gli ordini. Il pulsante Dettagli ordine usa IDOrdine della riga corrente e apre frmOrdineDettaglio con WhereCondition sul solo ID. frmOrdineDettaglio ha AllowEdits=Sì se l’utente ha il ruolo previsto oppure No se deve soltanto consultare. Alla chiusura, la maschera principale può eseguire Requery sulla sottomaschera per mostrare eventuali modifiche.
Questo modello è più robusto di aprire sempre frmOrdini senza filtro e cercare il record con GoToRecord dopo l’apertura. Il record corretto viene selezionato direttamente nel comando di apertura e il codice rimane vicino all’azione dell’utente.
Quando usare una query parametrica invece del filtro
Se lo stesso insieme di criteri viene usato da più maschere, report ed esportazioni, una query parametrica può centralizzare la logica. Per esempio una query qryOrdiniPeriodo può ricevere DataDa e DataA e diventare l’origine dati di più oggetti. In questo caso la maschera filtrata può essere basata sulla query e i parametri possono provenire da controlli.
WhereCondition è eccellente per criteri contestuali semplici. Una query parametrica è spesso migliore quando la logica è complessa, riutilizzata o deve essere testata indipendentemente. Non esiste un solo metodo giusto: scegli quello che riduce duplicazione e ambiguità.
Link interni utili
Approfondisci con come creare una maschera per ricerca record, come creare una maschera popup e come ordinare e filtrare dati in Access. Consulta inoltre la categoria Guide Access.
Fonti Microsoft
Per la sintassi corrente consulta Microsoft Learn: DoCmd.OpenForm. Per il comportamento dei filtri consulta Microsoft Support: applicare un filtro e Microsoft Support: azione ApplyFilter. Per l’aggiornabilità delle maschere basate su query è utile la guida Microsoft sull’uso di una query come origine record.
FAQ
Posso aprire una maschera su un solo record? Sì, usa WhereCondition con la chiave univoca del record.
Serve una query nuova? Non necessariamente. Per un filtro semplice puoi mantenere la stessa Origine record e passare il criterio a OpenForm.
Posso filtrare per più campi? Sì, combina condizioni con AND o OR e gestisci correttamente tipi dati e Null.
Posso farlo senza VBA? Sì, usa l’azione macro ApriMaschera e la Condizione WHERE.
Funziona in Runtime? Sì, se maschera, macro e codice sono già predisposti.
Conclusione
Aprire una maschera filtrata in Access è una tecnica fondamentale per costruire interfacce efficienti. Usa WhereCondition quando il criterio è noto al momento dell’apertura, Filter/FilterOn se devi cambiare la vista di una maschera già aperta e una query parametrica quando la logica deve essere riutilizzata o diventa complessa.
Controlla sempre tipo dati, Null, aggiornabilità dell’Origine record e stato dei filtri. Con nomi chiari, criteri semplici e test su casi reali, la maschera Access mostra subito ciò che serve all’utente e riduce errori di navigazione e modifica.