Bonjour,
Cas 1:
Le code fonctionne quand le formulaire "SFsynthèse" est exploité isolément.
Cas 2:
Mais ça ne marche plus quand "SFsynthèse" est utilisé en tant que sous-formulaire.
Explication:
En effet, selon le cas, le mot clé Me ne retourne pas le même objet.
Dans le cas 1, Me retourne une référence au formulaire "SFsynthèse": tout va bien.
Dans le cas 2, Me retourne une référence au formulaire principal, hors celui-ci ne "connaît" pas idProcédure: l'erreur est "logique".
Solutions:
Tu peux modifier ta fonction pour qu'elle tienne compte du "contexte" dans lequel elle s'exécute et, si besoin, faire référence au sous-formulaire pour accéder à idProcédure.
Supposons que le contrôle qui contient le sous-formulaire s'appelle CtrlSForm, voici la syntaxe pour accéder à idProcédure:
Me.CtrlSForm.Form.idProcédure
En utilisant la gestion d'erreur, tu peux envisager de gérer les 2 cas:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| Public Function OuvrirFiche()
Dim idProc As Long
On Error Resume Next
' Tenter le cas 1
idProc = Me.idProcédure
' En cas d'échec, tenter le cas 2
If Err.Number <> 0 Then
Err.Clear
idProc = Me.CtrlSForm.Form.idProcédure
End If
' En cas d'échec, message d'erreur
If Err.Number <> 0 Then
Msgbox "Erreur !"
Else
DoCmd.OpenForm "Procédure_Fiche", , , "idProcédure=" & idProc, , acDialog
End If
End Function |
Une autre solution, plus élégante
, consiste à tout gérer directement dans le menu contextuel.
* avant de faire le ShowPopup, on renseigne la propriété Parameter de tous les contrôles de la barre (menu contextuel), en lui attribuant la valeur de idProcédure.
* lorsque la procédure OuvrirFiche (ou une autre) est exécutée, il est possible de récupérer la valeur de la propriété Parameter du contrôle (du menu contextuel) qui a été "actionné". Voici la syntaxe:
Application.CommandBars.ActionControl.Parameter
La procédure s'en trouve simplifiée et peut fonctionner quel que soit le niveau d'imbrication du formulaire (sous-sous-sous-...formulaire
)
1 2 3 4 5 6 7
| Public Function OuvrirFiche()
Dim idProc As Long
idProc = cLng( Application.CommandBars.ActionControl.Parameter)
DoCmd.OpenForm "Procédure_Fiche", , , "idProcédure=" & idProc, , acDialog
End Function |
Partager