Faccio un esempio di come passare il riferimento ad un Oggetto Complesso, senza dover dichairare Variabili o Oggetti Public, invece di usare una Stringa Concatenata.
Codice nella Maschera Principale chiamata [fOpenArgSendObject].
In questa Maschera dichiaro una Collection ed associo Proprietà(usate come KEY) e relativo Valore.
Ricavo il Pointer in memoria della collection e lo passo come Args.
Option Compare Database
Option Explicit
Private Sub OpenReceiverForm_Click()
Dim mC As New Collection
mC.Add Date, "DataIniziale"
mC.Add "126", "IdPK"
mC.Add "Paolo Rossi", "Cliente"
mC.Add "Via Mazzini 3, 37100 Verona", "Indirizzo"
DoCmd.OpenForm "fOpenArgsReceiveObject", , , , , , GetPointerToObject(mC)
End Sub
Questa è la Form secondaria o ricevente [fOpenArgsReceiveObject], recupero la proprietà OpenArgs e sapendo che è un Pointer in memoria recupero l'oggetto ad esso associato.
Option Compare Database
Option Explicit
Private Sub Form_Load()
Dim mC As Collection
Set mC = GetObjectFromPointer(Me.OpenArgs)
Debug.Print mC.Item("DataIniziale")
Debug.Print mC.Item("IdPK")
Debug.Print mC.Item("Cliente")
Debug.Print mC.Item("Indirizzo")
' --------------------------------------------------------------------------
' Aprire la Finestra Immediata CTRL+G dal VBEditor...
' --------------------------------------------------------------------------
End Sub
Mi pare semplice intuire che sia possibile passare qualsiasi Oggetto, Maschere, Controlli, e Classi strutturate.
Ora le poche righe di codice da inserire in un MOdulo Standard per lo scambio del Pointer/Object:
Option Explicit
Option Compare Text
' API and constants from http://allapi.mentalis.org/apilist/apilist.php
Private Const POINTERSIZE As Long = 4
Private Const ZEROPOINTER As Long = 0
#If VBA7 Then
Private Declare PtrSafe Sub RtlMoveMemory Lib "kernel32" (Destination As Any, Source As Any, ByVal length As LongPtr)
#Else
Private Declare Sub RtlMoveMemory Lib "kernel32" (ByRef Destination As Any, ByRef Source As Any, ByVal length As Long)
#End If
Public Function GetPointerToObject(ByRef objThisObject As Object) As Long
' Purpose : Return the value of a pointer.
' Argument : A pointer to an Object.
' Author : ChrisO.
' Updated : 2012-04-18
Dim lngThisPointer As Long
RtlMoveMemory lngThisPointer, objThisObject, POINTERSIZE
GetPointerToObject = lngThisPointer
End Function
Public Function GetObjectFromPointer(ByVal lngThisPointer As Long) As Object
' Purpose : Return a pointer to an Object.
' Argument : The value of a Pointer.
' Author : ChrisO.
' Updated : 2012-04-18
Dim objThisObject As Object
RtlMoveMemory objThisObject, lngThisPointer, POINTERSIZE
Set GetObjectFromPointer = objThisObject
RtlMoveMemory objThisObject, ZEROPOINTER, POINTERSIZE
End Function