Come passare parametri tra maschere con VBA in Access: tutorial pratico

access vba: per passare parametri tra maschere in Microsoft Access puoi usare diverse tecniche. Le più importanti sono WhereCondition per aprire una maschera filtrata, OpenArgs per passare un valore all’apertura, riferimenti diretti tramite Forms!NomeMaschera!Controllo quando entrambe le maschere restano aperte e, in casi particolari, TempVars o oggetti dedicati per condividere stato tra più passaggi.

La scelta corretta dipende dal significato del parametro. Se vuoi mostrare un singolo cliente, usa un filtro. Se vuoi dire alla maschera «apriti in modalità revisione», OpenArgs è più adatto. Se devi leggere un valore dalla maschera chiamante ancora aperta, puoi usare Forms, ma devi gestire la dipendenza. Questa guida analizza ogni strategia per Access per Microsoft 365 e Access 2024, con esempi VBA e indicazioni per Runtime e multiutente.

Indice

  • WhereCondition
  • OpenArgs
  • Forms!Maschera!Controllo
  • TempVars
  • Più parametri
  • Tipi dati e Null
  • Maschere dialog
  • Restituire un valore
  • Multiutente e Runtime
  • Problemi comuni
  • FAQ

La prima domanda: parametro o filtro?

Molti problemi nascono perché si usa OpenArgs per passare un ID che in realtà dovrebbe filtrare la maschera. Se la destinazione deve aprirsi soltanto sul record 125, usa WhereCondition:

DoCmd.OpenForm "frmDettaglioCliente", acNormal, , "IDCliente=" & Me.IDCliente

Access applica la condizione alla sorgente e la maschera non deve caricare tutti i record per poi cercare quello giusto.

Usare WhereCondition con ID numerico

Prima verifica Null:

Private Sub cmdDettaglio_Click()
If IsNull(Me.IDCliente) Then
MsgBox "Seleziona un cliente.", vbExclamation
Exit Sub
End If
DoCmd.OpenForm "frmDettaglioCliente", , , "IDCliente=" & CLng(Me.IDCliente)
End Sub

La conversione CLng rende chiaro che il campo è numerico. Se la chiave è testo, devi usare apostrofi e raddoppiare quelli contenuti nel valore.

WhereCondition con testo

Esempio concettuale:

Dim codice As String
codice = Replace(Nz(Me.CodiceCliente, ""), "'", "''")
DoCmd.OpenForm "frmClienti", , , "CodiceCliente='" & codice & "'"

Non concatenare input complessi senza validazione. Per filtri articolati valuta una query parametrica.

OpenArgs: passare un valore semplice

Microsoft OpenForm espone l’argomento OpenArgs. Chiamata:

DoCmd.OpenForm "frmDettaglioCliente", , , , , , CStr(Me.IDCliente)

Nella maschera destinazione:

Private Sub Form_Load()
If Len(Nz(Me.OpenArgs, "")) > 0 Then
Me.txtIDRicevuto = CLng(Me.OpenArgs)
End If
End Sub

OpenArgs è Variant e spesso viene passato come stringa. Valida sempre prima della conversione.

Quando OpenArgs è la scelta migliore

Usalo per informazioni che cambiano il comportamento, non necessariamente i record: modalità «NUOVO», «REVISIONE», origine della chiamata, codice contesto, ID di una sessione temporanea. Una maschera può leggere OpenArgs durante Open o Load e configurarsi.

Passare più valori con OpenArgs

Puoi concatenare valori con un delimitatore, per esempio 125|REVISIONE, e poi usare Split. Questa soluzione va bene per pochi valori semplici. Se il testo può contenere il delimitatore o la struttura diventa complessa, è meglio usare una strategia più robusta.

Non costruire un mini-protocollo fragile con venti campi separati da pipe. In quel caso usa un ID di contesto che punta a una tabella temporanea o un oggetto dedicato.

Riferimento diretto a un controllo di un’altra maschera

Se entrambe sono aperte puoi leggere:

Forms!frmClienti!IDCliente

È semplice, ma crea una dipendenza forte: la maschera chiamata funziona soltanto se frmClienti è aperta e contiene quel controllo. Se prevedi di riusare la destinazione da più punti, OpenArgs o parametri espliciti sono più flessibili.

Verificare se una maschera è aperta

Puoi controllare CurrentProject.AllForms("frmClienti").IsLoaded prima di leggere Forms. Non usare la gestione errori come unico modo per scoprire che la maschera non esiste o non è aperta.

TempVars

TempVars permette di memorizzare valori temporanei accessibili da macro, query e VBA durante la sessione. Può essere utile per filtri globali o informazioni di sessione. Esempio:

TempVars!IDUtenteCorrente = 25

Rimuovi TempVars quando non servono e non usarle come archivio persistente. Possono essere perse al termine della sessione e non sono un sostituto di tabelle di configurazione.

Variabili globali: perché usarle con cautela

Una Public variable in un modulo standard sembra comoda, ma può perdere valore se il progetto VBA viene resettato. Inoltre nasconde le dipendenze: una maschera legge una variabile senza sapere chi l’ha impostata. Per parametri importanti preferisci passaggio esplicito.

Maschera dialog per selezionare un valore

Un pattern utile è aprire una maschera come dialog, consentire all’utente di scegliere un record, nasconderla e poi leggere il valore dal chiamante. Il codice chiamante resta sospeso finché la maschera dialog non viene chiusa o nascosta.

Devi definire bene il protocollo: la maschera di selezione imposta un controllo o una proprietà, poi si nasconde; il chiamante legge il valore e la chiude. Gestisci anche Annulla.

Restituire un valore al chiamante

Access non restituisce direttamente un valore da OpenForm. Puoi usare la tecnica dialog, TempVars, una proprietà pubblica di un class module o una tabella temporanea. Per un singolo valore la maschera dialog è spesso sufficiente.

Passare una modalità operativa

Esempio chiamante:

DoCmd.OpenForm "frmOrdine", , , "IDOrdine=" & Me.IDOrdine, , , "SOLA_LETTURA"

In Load:

If Nz(Me.OpenArgs, "") = "SOLA_LETTURA" Then
Me.AllowEdits = False
Me.AllowDeletions = False
End If

Questo separa filtro dati e modalità UI.

Passare date

Se OpenArgs deve contenere una data, evita stringhe ambigue. Passa un formato ISO o un numero seriale e valida con IsDate. Per filtrare per data, una query parametrica DateTime è più robusta.

Passare booleani

In OpenArgs puoi passare «1/0» o «TRUE/FALSE», ma documenta il formato. Se il parametro guida logica critica, considera una costante o Enum nel codice chiamante per evitare stringhe scritte in modo diverso.

Usare Enum per modalità

Nel VBA interno puoi definire un Enum con modalità dell’applicazione e convertirlo in stringa o numero quando lo passi. Questo migliora leggibilità e riduce errori.

OpenArgs e evento Open

Se il parametro è indispensabile, leggilo in Form_Open e annulla l’apertura quando manca. Open può essere cancellato. Se invece serve soltanto per inizializzare controlli, Load è più semplice.

Current e parametri

Non rileggere e reinterpretare OpenArgs a ogni Current se il valore non cambia. Salvalo in una variabile privata della maschera durante Load. Questo evita lavoro ripetuto.

Gestione errori

Controlla Null, tipi e stato delle maschere prima di accedere. Usa un handler per errori inattesi, non come sostituto della validazione. Se un ID ricevuto non esiste, mostra «Record non disponibile» invece di un errore DAO generico.

Multiutente

OpenArgs e variabili del front-end sono locali all’istanza Access dell’utente. TempVars sono anch’esse locali alla sessione, quindi non vengono condivise tra utenti. Le tabelle temporanee in un back-end condiviso invece sono globali: se le usi per passare contesto, devi includere un ID sessione o utente per evitare collisioni.

Meglio tenere tabelle temporanee nel front-end locale quando possibile.

Access Runtime

Tutte le tecniche native OpenForm/OpenArgs funzionano in Runtime. Il flusso deve essere raggiungibile da pulsanti e maschere, senza richiedere il riquadro di spostamento. Messaggi e gestione errori devono essere chiari.

32 e 64 bit

Il passaggio parametri tra maschere non cambia. Le differenze di bitness emergono solo se il codice chiamato usa API esterne.

Microsoft 365 e Access 2024

OpenForm e OpenArgs fanno parte del modello Access desktop documentato da Microsoft. Le tecniche restano valide nelle versioni moderne.

Problemi comuni

OpenArgs è Null

Controlla che sia stato passato nell’ultimo argomento di OpenForm e che la maschera non fosse già aperta da una chiamata precedente.

La maschera non filtra

OpenArgs non filtra automaticamente. Usa WhereCondition.

Forms! restituisce errore

La maschera sorgente non è aperta o il controllo ha un nome diverso.

Due utenti vedono parametri sbagliati

Probabilmente stai usando una tabella condivisa senza ID sessione. Usa stato locale o chiavi di sessione.

Il valore testo rompe il filtro

Gestisci apostrofi e preferisci parametri per criteri complessi.

Checklist

Per ogni valore chiediti: serve a filtrare o a cambiare comportamento? È un solo valore o una struttura? Deve sopravvivere alla chiusura? È locale all’utente? Può essere Null? Che tipo ha? Scegli la tecnica in base a queste risposte.

Testa chiamata con valore valido, Null, record inesistente, maschera già aperta e origine diversa. In Runtime verifica che il percorso di navigazione sia completo.

FAQ

Come apro una maschera su un ID?

Usa WhereCondition.

Come passo una modalità?

Usa OpenArgs.

Posso passare più valori?

Sì, ma per molti parametri usa una struttura più robusta di una semplice stringa delimitata.

Posso leggere un controllo di un’altra maschera?

Sì con Forms!, se la maschera è aperta.

TempVars è condiviso tra utenti?

No, appartiene alla sessione Access corrente.

Approfondimenti

Conclusione

Passare parametri tra maschere con VBA è semplice quando separi chiaramente filtro e contesto. Usa WhereCondition per limitare i record, OpenArgs per un valore di inizializzazione, Forms! soltanto quando accetti la dipendenza dalla maschera aperta e TempVars per stato temporaneo di sessione. Gestisci Null e tipi, evita globali fragili e considera multiutente e Runtime. Un passaggio esplicito dei parametri rende le maschere più riutilizzabili e il progetto molto più facile da mantenere.

Lascia un commento