Als ik denk dat ik weet waarvoor je dit nodig hebt, dan ben je op de juiste weg bezig
Zelf doe ik dit soort zaken tegenwoordig met de OpenArgs functie van een formulier.
Hierbij geef je het formulier dat je opent een (aantal) variabele(n) mee, die je op het doelformulier weer terugzet naar een (tekstveld. Dat gaat als volgt:
Op het eerste formulier zet je de variabelen in een string, met een zelf bepaald scheidingsteken. Dit is alleen nodig als je meerdere variabelen wilt overhalen; jammer genoeg kun je maar één variabele meegeven aan een formulier, dus bij meerdere gegevens zul je de waarden eerst moeten combineren, en op het doelformulier weer splitsen. Bij één variabele is de procedure dus een stuk simpeler.
In het voorbeeld zet ik een aantal gegevens in een aantal variabelen, waar ik dan een variabele mee vul. Als scheidingsteken gebruik ik hier de Pipe (
|). Het voorbeeld zet ook nog een SQL string in een variabele, maar dat is puur om te laten zien dat dat kan, hoef je uiteraard niet te doen.... In mijn geval doe ik dat, omdat ik één formulier gebruik om een datumselectie te maken, waarna met een druk op de knop een volgend formulier wordt geopend. Omdat ik verschillende formulieren wil kunnen openen vanuit het datumformulier, geef ik alle elementen mee die in het derde formulier worden gebruikt. Zodoende spaar ik een hoop formulieren uit.
Het eerste deel van de code maakt dus de variabelen aan.
Code:
'-----------------------------------------------------------------------------------------------
sFormBron = Me.Form.Name
sFormDoel = "frmVervolgFormulier"
sKnop = "cmdKnop"
strSQL = "SELECT Weeknum([Datum]) AS weekNummer " & vbCrLf
strSQL = strSQL & "FROM tShift " & vbCrLf
strSQL = strSQL & "WHERE ([tShift].[Datum] > Date()-7) " & vbCrLf
strSQL = strSQL & "GROUP BY Weeknum([Datum]) " & vbCrLf
strSQL = strSQL & "ORDER BY Weeknum([Datum]);"
sArgs = sFormBron & "|" & sFormDoel & "|" & sKnop & "|" & strSQL
'-----------------------------------------------------------------------------------------------
'Selectieformulier openen
'-----------------------------------------------------------------------------------------------
Me.Visible = False
'Open het selectieformulier met de parameters:
DoCmd.OpenForm sFormDoel, , , , , acDialog, sArgs
'-----------------------------------------------------------------------------------------------
In het tweede deel wordt het formulier geopend als een modaal formulier (optie acDialog), zodat je pas verder kunt als alles daarop is ingevuld. Het laatste deel, sArgs, bevat de OpenArgs elementen die op het geopende formulier worden ingelezen. Als je de acDialog weglaat, werkt het dus ook nog steeds.
Het volgende deel van de code staat op het formulier dat je opent. De code moet worden ingevoerd bij het Bij Laden event, want je wilt de gegevens bij openen gelijk inlezen.
Om fouten af te vangen, voer ik de procedure alleen uit als de variabele OpenArgs niet leeg is.
Code:
If Not IsNull(Me.OpenArgs) Private Sub Form_Load()
'------------------------------------------------------------------------------------------------
'Inlezen van de variabelen
'------------------------------------------------------------------------------------------------
If Not IsNull(Me.OpenArgs) Then
Dim strLijst() As String
On Error Resume Next
strLijst = Split(Me.OpenArgs, "|", -1)
Me.txtFormulierDoel = strLijst(0) ' Variabele sFormBron
Me.txtFormulierBron = strLijst(1) ' Variabele sFormDoel
Me.txtKnop = strLijst(2) ' Variabele sKnop
Me.txtSQL = strLijst(3) ' Variabele strSQL
End If
'------------------------------------------------------------------------------------------------
De volgende stap is het splitsen van de variabelen. Ik heb in de eerste fase alle variabelen in één string gezet, met een (
|) als scheidingsteken. M.b.v. de functie SPLIT trek ik alles weer uit elkaar, en zet ik alle gegevens in een matrixvariabele strLijst. Een matrix die je met Split aanmaakt, begint altijd bij 0 te tellen, dus de eerste variabele heet in het voorbeeld strlijst(0). Die wordt vervolgens op een tekstvak op het formulier geplakt; dit doe je dan ook voor de overige variabelen.
En dat is eigenlijk alles! Het lijkt ingewikkelder dan het is, maar je kunt het toch het beste eerst uitproberen met één variabele, dan hoef je de Split functie niet te gebruiken.
Je krijgt dan bijvoorbeeld:
Code:
DoCmd.OpenForm sFormDoel, , , , , , me.IDNummer
waarmee je het formulier opent met een OpenArgs variabele.
Op het tweede formulier krijg je dan:
Code:
If Not IsNull(Me.OpenArgs) Then
me.txtIDNummer=Me.OpenArgs
End If
Succes ermee!
Michel