Uno dei problemi che mi sono ritrovato più spesso ad affrontare, con Microsoft Access, è la duplicazione del codice. Intesa non solo come duplicazione di codice VBS, ma anche di query, macro, procedure, ecc. In questo articolo vedremo come collegare maschere tra database di Microsoft Access, in modo da usare la stessa maschera tra più database.
Il procedimento, dopo averlo compreso, è abbastanza semplice e intuitivo. Prevede questi passaggi:
- Creare un database di riferimento, che conterrà le maschere da utilizzare
- Creare gli altri database
- Collegare i database al database di riferimento
- Richiamare le maschere quando servono
Creare un database di riferimento
In questo post non voglio complicare troppo le cose, quindi creo un database semplice (lo chiamo notes
). Contiene una sola tabella, tbNotes
con 2 campi: ID
e Note
. Inoltre, contiene due maschere. La prima, frmNotes
, che permette di inserire le varie note e di eliminarle.
La seconda maschera serve per visualizzare la posizione del database aperto, e quella della maschera collegata.
Per semplicità creo due funzioni:
Public Function getNameCurrentDB()
Dim db As DAO.Database
Set db = CurrentDb()
Dim name As String
name = db.name
Set db = Nothing
getNameCurrentDB = name
End Function
Public Function getNameFormDB()
Dim db As DAO.Database
Set db = CodeDb()
Dim name As String
name = db.name
Set db = Nothing
getNameFormDB = name
End Function
In modo da ottenere qualcosa di simile a questo:

Mi servono anche due funzioni per aprire le due maschere:
Public Sub openFormNotes()
DoCmd.OpenForm "frmNotes"
End Sub
Public Sub openFormInfo()
DoCmd.OpenForm "frmInfo"
End Sub
Creare gli altri database
Ora che ho il database con le maschere di riferimento posso creare altri database. Creo il database otherNotes
. Per il momento creo una maschera con due pulsati, ma senza implementare il codice:

Per poter effettivamente collegare le maschere devo aggiungere un riferimento al progetto. Vado sull’editor di Visual Basic for Applications (VBA) e clicco su Tools
> References
. Da qui posso selezionare il database di riferimento, notes.mdb
.
Questa è la soluzione più semplice ma preferisco implementare una funzione generale da richiamare all’occorrenza.
Public Function AddReference(referenceToImport As String, nameDatabase As String)
Dim reference As reference
For Each reference In Access.References
Dim nameReference As String
nameReference = reference.Name
If nameReference = referenceToImport Then
Access.References.Remove reference
End If
Next reference
Set reference = References.AddFromFile(nameDatabase)
End Function
Per prima cosa mi assicuro che non esista già lo stesso riferimento. Se c’è lo rimuovo. Poi aggiungo nuovamente il riferimento al database con cui voglio collegarmi.
In questo modo posso collegarmi a più database, senza dover aggiungere manualmente i riferimenti.
Creo alcuni controlli e aggiungo un pulsante

Implemento quindi una funzione del genere:
Private Sub linkForms_Click()
On Error GoTo Err_linkForms_Click
Dim nameReference As String
nameReference = Forms![Menu]!NameReference.Value
Dim nameDatabase As String
nameDatabase = Forms![Menu]!NameDatabase.Value
AddReference nameReference, nameDatabase
Exit_linkForms_Click:
Exit Sub
Err_linkForms_Click:
Resume Exit_linkForms_Click
End Sub
Dopo aver collegato i due database posso richiamare le funzioni per aprire le maschere.
Public Function openNotes()
Notes.openFormNotes
End Function
Public Function openInfo()
Notes.openFormInfo
End Function
Il risultato finale è questo:
Bene, con questo è tutto. Ho creato un repository con il codice dell’esempio. Lo trovate qui: el3um4s/how-to-link-forms-in-access