Je tente de synchroniser dans un formulaire deux sous formulaires renvoyant
les enregistrements d'une même table dont l'un en liste "mode tabulaire" et
l'autre détaillé en "Mode Colonne".
J'ai tenté sans succès dans l'évènement "Current" l'expression suivante:
Nous célébrons chez nous demain le "1er Mai - Fête des travailleurs" Bonne fête à tous.
Actuellement j'ai toujours mon formulaire qui fonctionne dans un sens : Le changement d'enregistrement dans sous form F1 (Formulaires continus - tableau) induit celui de sous form F2 (Formulaire unique). Mais pas dans l'autre. En fait le challenge est que cela soit réciproque.
Dans sous form F2, en écrivant : Private Sub Form_Current() On Error GoTo Err_Current Dim Ctrl As Control
Set Ctrl = Me.Parent!F1 With Me.Parent!F1.Form.RecordsetClone .FindFirst "[Réf]= " & Me.Réf Ctrl.Form.Bookmark = .Bookmark End With
Exit_Current: Set Ctrl = Nothing Exit Sub
Err_Current: Select Case Err.Number Case 2465, 2455, 91 Debug.Print Err.Number & " " & Err.Description Resume Next
Case Else Debug.Print Err.Number & " " & Err.Description MsgBox Err.Number & vbCr & Err.Description Resume Exit_Current End Select
End Sub
nous avons l'erreur : "2465 Impossible de trouver le champ 'SousFormF1' auquel il est fait référence dans votre expression."
Dans F1, malgré ces erreurs, nous avons bel et bien le changement d'enregistrement dans F2. Dans l'autre, le selecteur s'obstine à ne pas se déplacer.
Merci encore. Et puis c'est pas trop tard. Je prend mon temps car cela fais plus d'un bon bout de temps que je sèche sur cette expression.
Salut,
| "William Kameron" || Dans un contrôle Onglet je suis parvenu à un résultat apréciable. || En programmant l'évenement "OnChange" de l'onglet je peux raffraîchir la || page juste avant qu'elle ne s'affiche et retrouver mon enregistrment que j'ai || quitté de l'autre côté. || C'est déjà pas mal. C'est embêtant. Je voulais les deux en vis-à-vis. comme || un "SCROLL" | [...] | | Je dois m'absenter... ce sera pour tantôt...
Le "tantôt" s'est éternisé, désolé...
Bon, pour tes deux sous-formulaire, tu peux mettre dans l'événement "Sur activation" (form_current) ceci :
'---- sous-form Classes_f2
Dim Ctrl As Control Set Ctrl = Me.Parent!Ctrl_Classes_F2
With Me.Parent!Ctrl_Classes_F2.Form.RecordsetClone .FindFirst "NomPK=" & NomPK Ctrl.Form.Bookmark = .Bookmark End With
Set Ctrl = Nothing
'---- sous-form Classes_f1
Dim Ctrl As Control Set Ctrl = Me.Parent!Ctrl_Classes_F1
With Ctrl.Form.RecordsetClone .FindFirst "NomPK=" & NomPK Ctrl.Form.Bookmark = .Bookmark End With
Set Ctrl = Nothing
---------------------------------------
NomPK : représente le nom de la clé primaire, identique pour les 2 sous-form
Ctrl_Classes_F1 : représente le control sous-formulaire qui contient le formulaire Classes_F1 (qui n'a pas *forcément* le même nom que le form qu'il contient)
idem pour Ctrl_Classes_F2
A l'ouverture du formulaire "principal", tu risque d'obtenir une errreur (dû à l'ouverture séquencielle des 2 sous-form ;-( ) tu cliqueras sur ok et cela fonctionnera tout de même... si tel est bien le cas chez toi - dis le pour adaption
et encore désolé pour le retard et... je repart aussitôt :-(
Nous célébrons chez nous demain le "1er Mai - Fête des travailleurs"
Bonne fête à tous.
Actuellement j'ai toujours mon formulaire qui fonctionne dans un sens : Le
changement d'enregistrement dans sous form F1 (Formulaires continus -
tableau) induit celui de sous form F2 (Formulaire unique). Mais pas dans
l'autre. En fait le challenge est que cela soit réciproque.
Dans sous form F2, en écrivant :
Private Sub Form_Current()
On Error GoTo Err_Current
Dim Ctrl As Control
Set Ctrl = Me.Parent!F1
With Me.Parent!F1.Form.RecordsetClone
.FindFirst "[Réf]= " & Me.Réf
Ctrl.Form.Bookmark = .Bookmark
End With
Exit_Current:
Set Ctrl = Nothing
Exit Sub
Err_Current:
Select Case Err.Number
Case 2465, 2455, 91
Debug.Print Err.Number & " " & Err.Description
Resume Next
Case Else
Debug.Print Err.Number & " " & Err.Description
MsgBox Err.Number & vbCr & Err.Description
Resume Exit_Current
End Select
End Sub
nous avons l'erreur :
"2465 Impossible de trouver le champ 'SousFormF1' auquel il est fait
référence dans votre expression."
Dans F1, malgré ces erreurs, nous avons bel et bien le changement
d'enregistrement dans F2. Dans l'autre, le selecteur s'obstine à ne pas se
déplacer.
Merci encore. Et puis c'est pas trop tard. Je prend mon temps car cela fais
plus d'un bon bout de temps que je sèche sur cette expression.
Salut,
| "William Kameron"
|| Dans un contrôle Onglet je suis parvenu à un résultat apréciable.
|| En programmant l'évenement "OnChange" de l'onglet je peux raffraîchir la
|| page juste avant qu'elle ne s'affiche et retrouver mon enregistrment que j'ai
|| quitté de l'autre côté.
|| C'est déjà pas mal. C'est embêtant. Je voulais les deux en vis-à-vis. comme
|| un "SCROLL"
| [...]
|
| Je dois m'absenter... ce sera pour tantôt...
Le "tantôt" s'est éternisé, désolé...
Bon, pour tes deux sous-formulaire, tu peux mettre dans l'événement
"Sur activation" (form_current) ceci :
'---- sous-form Classes_f2
Dim Ctrl As Control
Set Ctrl = Me.Parent!Ctrl_Classes_F2
With Me.Parent!Ctrl_Classes_F2.Form.RecordsetClone
.FindFirst "NomPK=" & NomPK
Ctrl.Form.Bookmark = .Bookmark
End With
Set Ctrl = Nothing
'---- sous-form Classes_f1
Dim Ctrl As Control
Set Ctrl = Me.Parent!Ctrl_Classes_F1
With Ctrl.Form.RecordsetClone
.FindFirst "NomPK=" & NomPK
Ctrl.Form.Bookmark = .Bookmark
End With
Set Ctrl = Nothing
---------------------------------------
NomPK :
représente le nom de la clé primaire, identique pour les 2 sous-form
Ctrl_Classes_F1 :
représente le control sous-formulaire qui contient le formulaire Classes_F1
(qui n'a pas *forcément* le même nom que le form qu'il contient)
idem pour Ctrl_Classes_F2
A l'ouverture du formulaire "principal", tu risque d'obtenir une errreur
(dû à l'ouverture séquencielle des 2 sous-form ;-( )
tu cliqueras sur ok et cela fonctionnera tout de même...
si tel est bien le cas chez toi - dis le pour adaption
et encore désolé pour le retard et... je repart aussitôt :-(
Nous célébrons chez nous demain le "1er Mai - Fête des travailleurs" Bonne fête à tous.
Actuellement j'ai toujours mon formulaire qui fonctionne dans un sens : Le changement d'enregistrement dans sous form F1 (Formulaires continus - tableau) induit celui de sous form F2 (Formulaire unique). Mais pas dans l'autre. En fait le challenge est que cela soit réciproque.
Dans sous form F2, en écrivant : Private Sub Form_Current() On Error GoTo Err_Current Dim Ctrl As Control
Set Ctrl = Me.Parent!F1 With Me.Parent!F1.Form.RecordsetClone .FindFirst "[Réf]= " & Me.Réf Ctrl.Form.Bookmark = .Bookmark End With
Exit_Current: Set Ctrl = Nothing Exit Sub
Err_Current: Select Case Err.Number Case 2465, 2455, 91 Debug.Print Err.Number & " " & Err.Description Resume Next
Case Else Debug.Print Err.Number & " " & Err.Description MsgBox Err.Number & vbCr & Err.Description Resume Exit_Current End Select
End Sub
nous avons l'erreur : "2465 Impossible de trouver le champ 'SousFormF1' auquel il est fait référence dans votre expression."
Dans F1, malgré ces erreurs, nous avons bel et bien le changement d'enregistrement dans F2. Dans l'autre, le selecteur s'obstine à ne pas se déplacer.
Merci encore. Et puis c'est pas trop tard. Je prend mon temps car cela fais plus d'un bon bout de temps que je sèche sur cette expression.
Salut,
| "William Kameron" || Dans un contrôle Onglet je suis parvenu à un résultat apréciable. || En programmant l'évenement "OnChange" de l'onglet je peux raffraîchir la || page juste avant qu'elle ne s'affiche et retrouver mon enregistrment que j'ai || quitté de l'autre côté. || C'est déjà pas mal. C'est embêtant. Je voulais les deux en vis-à-vis. comme || un "SCROLL" | [...] | | Je dois m'absenter... ce sera pour tantôt...
Le "tantôt" s'est éternisé, désolé...
Bon, pour tes deux sous-formulaire, tu peux mettre dans l'événement "Sur activation" (form_current) ceci :
'---- sous-form Classes_f2
Dim Ctrl As Control Set Ctrl = Me.Parent!Ctrl_Classes_F2
With Me.Parent!Ctrl_Classes_F2.Form.RecordsetClone .FindFirst "NomPK=" & NomPK Ctrl.Form.Bookmark = .Bookmark End With
Set Ctrl = Nothing
'---- sous-form Classes_f1
Dim Ctrl As Control Set Ctrl = Me.Parent!Ctrl_Classes_F1
With Ctrl.Form.RecordsetClone .FindFirst "NomPK=" & NomPK Ctrl.Form.Bookmark = .Bookmark End With
Set Ctrl = Nothing
---------------------------------------
NomPK : représente le nom de la clé primaire, identique pour les 2 sous-form
Ctrl_Classes_F1 : représente le control sous-formulaire qui contient le formulaire Classes_F1 (qui n'a pas *forcément* le même nom que le form qu'il contient)
idem pour Ctrl_Classes_F2
A l'ouverture du formulaire "principal", tu risque d'obtenir une errreur (dû à l'ouverture séquencielle des 2 sous-form ;-( ) tu cliqueras sur ok et cela fonctionnera tout de même... si tel est bien le cas chez toi - dis le pour adaption
et encore désolé pour le retard et... je repart aussitôt :-(
"William Kameron" | Actuellement j'ai toujours mon formulaire qui fonctionne dans un sens : Le | changement d'enregistrement dans sous form F1 (Formulaires continus - | tableau) induit celui de sous form F2 (Formulaire unique). Mais pas dans | l'autre. En fait le challenge est que cela soit réciproque. [...]
Dans le Form_Current du sous-form2 tu mets :
sFrm_Loaded = True ' (expliqué plus loin...) Dim Ctrl As Control Set Ctrl = Me.Parent!CtrlF1 With Me.Parent!CtrlF1.Form.RecordsetClone .FindFirst "[Réf]= " & Me.Réf Ctrl.Form.Bookmark = .Bookmark End With
Dans le Form_Open du sous-form2 tu mets :
sFrm_Loaded = false
Dans le Form_Current du sous-form1 tu mets :
Dim Ctrl As Control if sFrm_Loaded then ' teste en fait l'autre sous-form Set Ctrl = Me.Parent!CtrlF2 With Me.Parent!CtrlF2.Form.RecordsetClone .FindFirst "[Réf]= " & Me.Réf Ctrl.Form.Bookmark = .Bookmark End With end if
Dans un module général, tu déclare la variable :
Public sFrm_Loaded as Boolean
L'explication : Les sous-formulaires se charge les uns après les autres. Lorsque le premier sous-form est chargé, il produit également ses événements (via lesquels on exécute les procédures...) Or, lorsque le premier sous-form exécure son "OnCurrent", l'autre sous-form n'est pas encore chargé et possède encore moins un "recordset" (et à foriori un recordsetclone). C'est de la que vient l'erreur 2455 :-(( Il faut donc s'arranger pour que le premier sous-formulaire chargé n'exécute le code sur son "OnCurrent" qu'à partir du moment que l'autre est "pret" C'est ce qu'on obtient en positionnant la variable sfm_loaded sur Vrai dans l'autre sous-formulaire.
Note 1 L'ordre de chargement des sous-formulaires dépend de leur ordre de création. Il se peut donc parfaitement que tu dois déplacer le test sur la variable sfrm_loaded dans l'autre sous-form... Si à l'ouverture du formulaire tu obtiens l'erreur 2455, tu sais que tu dois déplacer le test dans l'autre sous-form.
Note 2 Tu écrit F1 et F2 pour les sous-formulaires... Il faut t'assurer que tu t'adresse bien au control qui *contient* le sous formulaire. Les assistants utilise malheureusement les mêmes noms pour les deux - le conteneur et le contenu... C'est pourquoi je préfixe par "Ctrl" et l'on distingue le CtrlF1 qui est le conteneur de F1 qui est le contenu...
Evites aussi les accentués dans les noms d'objets ;-)
"William Kameron"
| Actuellement j'ai toujours mon formulaire qui fonctionne dans un sens : Le
| changement d'enregistrement dans sous form F1 (Formulaires continus -
| tableau) induit celui de sous form F2 (Formulaire unique). Mais pas dans
| l'autre. En fait le challenge est que cela soit réciproque.
[...]
Dans le Form_Current du sous-form2 tu mets :
sFrm_Loaded = True ' (expliqué plus loin...)
Dim Ctrl As Control
Set Ctrl = Me.Parent!CtrlF1
With Me.Parent!CtrlF1.Form.RecordsetClone
.FindFirst "[Réf]= " & Me.Réf
Ctrl.Form.Bookmark = .Bookmark
End With
Dans le Form_Open du sous-form2 tu mets :
sFrm_Loaded = false
Dans le Form_Current du sous-form1 tu mets :
Dim Ctrl As Control
if sFrm_Loaded then ' teste en fait l'autre sous-form
Set Ctrl = Me.Parent!CtrlF2
With Me.Parent!CtrlF2.Form.RecordsetClone
.FindFirst "[Réf]= " & Me.Réf
Ctrl.Form.Bookmark = .Bookmark
End With
end if
Dans un module général, tu déclare la variable :
Public sFrm_Loaded as Boolean
L'explication :
Les sous-formulaires se charge les uns après les autres.
Lorsque le premier sous-form est chargé, il produit également
ses événements (via lesquels on exécute les procédures...)
Or, lorsque le premier sous-form exécure son "OnCurrent", l'autre
sous-form n'est pas encore chargé et possède encore moins
un "recordset" (et à foriori un recordsetclone).
C'est de la que vient l'erreur 2455 :-((
Il faut donc s'arranger pour que le premier sous-formulaire chargé
n'exécute le code sur son "OnCurrent" qu'à partir du moment que
l'autre est "pret"
C'est ce qu'on obtient en positionnant la variable sfm_loaded
sur Vrai dans l'autre sous-formulaire.
Note 1
L'ordre de chargement des sous-formulaires dépend de leur ordre
de création. Il se peut donc parfaitement que tu dois déplacer le test
sur la variable sfrm_loaded dans l'autre sous-form...
Si à l'ouverture du formulaire tu obtiens l'erreur 2455, tu sais que
tu dois déplacer le test dans l'autre sous-form.
Note 2
Tu écrit F1 et F2 pour les sous-formulaires...
Il faut t'assurer que tu t'adresse bien au control qui *contient* le sous
formulaire. Les assistants utilise malheureusement les mêmes noms
pour les deux - le conteneur et le contenu...
C'est pourquoi je préfixe par "Ctrl" et l'on distingue le CtrlF1 qui est
le conteneur de F1 qui est le contenu...
Evites aussi les accentués dans les noms d'objets ;-)
"William Kameron" | Actuellement j'ai toujours mon formulaire qui fonctionne dans un sens : Le | changement d'enregistrement dans sous form F1 (Formulaires continus - | tableau) induit celui de sous form F2 (Formulaire unique). Mais pas dans | l'autre. En fait le challenge est que cela soit réciproque. [...]
Dans le Form_Current du sous-form2 tu mets :
sFrm_Loaded = True ' (expliqué plus loin...) Dim Ctrl As Control Set Ctrl = Me.Parent!CtrlF1 With Me.Parent!CtrlF1.Form.RecordsetClone .FindFirst "[Réf]= " & Me.Réf Ctrl.Form.Bookmark = .Bookmark End With
Dans le Form_Open du sous-form2 tu mets :
sFrm_Loaded = false
Dans le Form_Current du sous-form1 tu mets :
Dim Ctrl As Control if sFrm_Loaded then ' teste en fait l'autre sous-form Set Ctrl = Me.Parent!CtrlF2 With Me.Parent!CtrlF2.Form.RecordsetClone .FindFirst "[Réf]= " & Me.Réf Ctrl.Form.Bookmark = .Bookmark End With end if
Dans un module général, tu déclare la variable :
Public sFrm_Loaded as Boolean
L'explication : Les sous-formulaires se charge les uns après les autres. Lorsque le premier sous-form est chargé, il produit également ses événements (via lesquels on exécute les procédures...) Or, lorsque le premier sous-form exécure son "OnCurrent", l'autre sous-form n'est pas encore chargé et possède encore moins un "recordset" (et à foriori un recordsetclone). C'est de la que vient l'erreur 2455 :-(( Il faut donc s'arranger pour que le premier sous-formulaire chargé n'exécute le code sur son "OnCurrent" qu'à partir du moment que l'autre est "pret" C'est ce qu'on obtient en positionnant la variable sfm_loaded sur Vrai dans l'autre sous-formulaire.
Note 1 L'ordre de chargement des sous-formulaires dépend de leur ordre de création. Il se peut donc parfaitement que tu dois déplacer le test sur la variable sfrm_loaded dans l'autre sous-form... Si à l'ouverture du formulaire tu obtiens l'erreur 2455, tu sais que tu dois déplacer le test dans l'autre sous-form.
Note 2 Tu écrit F1 et F2 pour les sous-formulaires... Il faut t'assurer que tu t'adresse bien au control qui *contient* le sous formulaire. Les assistants utilise malheureusement les mêmes noms pour les deux - le conteneur et le contenu... C'est pourquoi je préfixe par "Ctrl" et l'on distingue le CtrlF1 qui est le conteneur de F1 qui est le contenu...
Evites aussi les accentués dans les noms d'objets ;-)
Merci "3Stone" Je vais généraliser la pratique de cet outil dans le traitement des tables de paramétrage de mes applications.
Cet outil me permet de naviguer concomitament dans une formulaire de type "Liste" et dans un formulaire de type détails dans lequel j'affiche tout le contenu de la table.
Mille merci.
Salut,
"William Kameron" | Actuellement j'ai toujours mon formulaire qui fonctionne dans un sens : Le | changement d'enregistrement dans sous form F1 (Formulaires continus - | tableau) induit celui de sous form F2 (Formulaire unique). Mais pas dans | l'autre. En fait le challenge est que cela soit réciproque. [...]
Dans le Form_Current du sous-form2 tu mets :
sFrm_Loaded = True ' (expliqué plus loin...) Dim Ctrl As Control Set Ctrl = Me.Parent!CtrlF1 With Me.Parent!CtrlF1.Form.RecordsetClone .FindFirst "[Réf]= " & Me.Réf Ctrl.Form.Bookmark = .Bookmark End With
Dans le Form_Open du sous-form2 tu mets :
sFrm_Loaded = false
Dans le Form_Current du sous-form1 tu mets :
Dim Ctrl As Control if sFrm_Loaded then ' teste en fait l'autre sous-form Set Ctrl = Me.Parent!CtrlF2 With Me.Parent!CtrlF2.Form.RecordsetClone .FindFirst "[Réf]= " & Me.Réf Ctrl.Form.Bookmark = .Bookmark End With end if
Dans un module général, tu déclare la variable :
Public sFrm_Loaded as Boolean
L'explication : Les sous-formulaires se charge les uns après les autres. Lorsque le premier sous-form est chargé, il produit également ses événements (via lesquels on exécute les procédures...) Or, lorsque le premier sous-form exécure son "OnCurrent", l'autre sous-form n'est pas encore chargé et possède encore moins un "recordset" (et à foriori un recordsetclone). C'est de la que vient l'erreur 2455 :-(( Il faut donc s'arranger pour que le premier sous-formulaire chargé n'exécute le code sur son "OnCurrent" qu'à partir du moment que l'autre est "pret" C'est ce qu'on obtient en positionnant la variable sfm_loaded sur Vrai dans l'autre sous-formulaire.
Note 1 L'ordre de chargement des sous-formulaires dépend de leur ordre de création. Il se peut donc parfaitement que tu dois déplacer le test sur la variable sfrm_loaded dans l'autre sous-form... Si à l'ouverture du formulaire tu obtiens l'erreur 2455, tu sais que tu dois déplacer le test dans l'autre sous-form.
Note 2 Tu écrit F1 et F2 pour les sous-formulaires... Il faut t'assurer que tu t'adresse bien au control qui *contient* le sous formulaire. Les assistants utilise malheureusement les mêmes noms pour les deux - le conteneur et le contenu... C'est pourquoi je préfixe par "Ctrl" et l'on distingue le CtrlF1 qui est le conteneur de F1 qui est le contenu...
Evites aussi les accentués dans les noms d'objets ;-)
Merci "3Stone"
Je vais généraliser la pratique de cet outil dans le traitement des tables
de paramétrage de mes applications.
Cet outil me permet de naviguer concomitament dans une formulaire de type
"Liste"
et dans un formulaire de type détails dans lequel j'affiche tout le contenu
de la table.
Mille merci.
Salut,
"William Kameron"
| Actuellement j'ai toujours mon formulaire qui fonctionne dans un sens : Le
| changement d'enregistrement dans sous form F1 (Formulaires continus -
| tableau) induit celui de sous form F2 (Formulaire unique). Mais pas dans
| l'autre. En fait le challenge est que cela soit réciproque.
[...]
Dans le Form_Current du sous-form2 tu mets :
sFrm_Loaded = True ' (expliqué plus loin...)
Dim Ctrl As Control
Set Ctrl = Me.Parent!CtrlF1
With Me.Parent!CtrlF1.Form.RecordsetClone
.FindFirst "[Réf]= " & Me.Réf
Ctrl.Form.Bookmark = .Bookmark
End With
Dans le Form_Open du sous-form2 tu mets :
sFrm_Loaded = false
Dans le Form_Current du sous-form1 tu mets :
Dim Ctrl As Control
if sFrm_Loaded then ' teste en fait l'autre sous-form
Set Ctrl = Me.Parent!CtrlF2
With Me.Parent!CtrlF2.Form.RecordsetClone
.FindFirst "[Réf]= " & Me.Réf
Ctrl.Form.Bookmark = .Bookmark
End With
end if
Dans un module général, tu déclare la variable :
Public sFrm_Loaded as Boolean
L'explication :
Les sous-formulaires se charge les uns après les autres.
Lorsque le premier sous-form est chargé, il produit également
ses événements (via lesquels on exécute les procédures...)
Or, lorsque le premier sous-form exécure son "OnCurrent", l'autre
sous-form n'est pas encore chargé et possède encore moins
un "recordset" (et à foriori un recordsetclone).
C'est de la que vient l'erreur 2455 :-((
Il faut donc s'arranger pour que le premier sous-formulaire chargé
n'exécute le code sur son "OnCurrent" qu'à partir du moment que
l'autre est "pret"
C'est ce qu'on obtient en positionnant la variable sfm_loaded
sur Vrai dans l'autre sous-formulaire.
Note 1
L'ordre de chargement des sous-formulaires dépend de leur ordre
de création. Il se peut donc parfaitement que tu dois déplacer le test
sur la variable sfrm_loaded dans l'autre sous-form...
Si à l'ouverture du formulaire tu obtiens l'erreur 2455, tu sais que
tu dois déplacer le test dans l'autre sous-form.
Note 2
Tu écrit F1 et F2 pour les sous-formulaires...
Il faut t'assurer que tu t'adresse bien au control qui *contient* le sous
formulaire. Les assistants utilise malheureusement les mêmes noms
pour les deux - le conteneur et le contenu...
C'est pourquoi je préfixe par "Ctrl" et l'on distingue le CtrlF1 qui est
le conteneur de F1 qui est le contenu...
Evites aussi les accentués dans les noms d'objets ;-)
Merci "3Stone" Je vais généraliser la pratique de cet outil dans le traitement des tables de paramétrage de mes applications.
Cet outil me permet de naviguer concomitament dans une formulaire de type "Liste" et dans un formulaire de type détails dans lequel j'affiche tout le contenu de la table.
Mille merci.
Salut,
"William Kameron" | Actuellement j'ai toujours mon formulaire qui fonctionne dans un sens : Le | changement d'enregistrement dans sous form F1 (Formulaires continus - | tableau) induit celui de sous form F2 (Formulaire unique). Mais pas dans | l'autre. En fait le challenge est que cela soit réciproque. [...]
Dans le Form_Current du sous-form2 tu mets :
sFrm_Loaded = True ' (expliqué plus loin...) Dim Ctrl As Control Set Ctrl = Me.Parent!CtrlF1 With Me.Parent!CtrlF1.Form.RecordsetClone .FindFirst "[Réf]= " & Me.Réf Ctrl.Form.Bookmark = .Bookmark End With
Dans le Form_Open du sous-form2 tu mets :
sFrm_Loaded = false
Dans le Form_Current du sous-form1 tu mets :
Dim Ctrl As Control if sFrm_Loaded then ' teste en fait l'autre sous-form Set Ctrl = Me.Parent!CtrlF2 With Me.Parent!CtrlF2.Form.RecordsetClone .FindFirst "[Réf]= " & Me.Réf Ctrl.Form.Bookmark = .Bookmark End With end if
Dans un module général, tu déclare la variable :
Public sFrm_Loaded as Boolean
L'explication : Les sous-formulaires se charge les uns après les autres. Lorsque le premier sous-form est chargé, il produit également ses événements (via lesquels on exécute les procédures...) Or, lorsque le premier sous-form exécure son "OnCurrent", l'autre sous-form n'est pas encore chargé et possède encore moins un "recordset" (et à foriori un recordsetclone). C'est de la que vient l'erreur 2455 :-(( Il faut donc s'arranger pour que le premier sous-formulaire chargé n'exécute le code sur son "OnCurrent" qu'à partir du moment que l'autre est "pret" C'est ce qu'on obtient en positionnant la variable sfm_loaded sur Vrai dans l'autre sous-formulaire.
Note 1 L'ordre de chargement des sous-formulaires dépend de leur ordre de création. Il se peut donc parfaitement que tu dois déplacer le test sur la variable sfrm_loaded dans l'autre sous-form... Si à l'ouverture du formulaire tu obtiens l'erreur 2455, tu sais que tu dois déplacer le test dans l'autre sous-form.
Note 2 Tu écrit F1 et F2 pour les sous-formulaires... Il faut t'assurer que tu t'adresse bien au control qui *contient* le sous formulaire. Les assistants utilise malheureusement les mêmes noms pour les deux - le conteneur et le contenu... C'est pourquoi je préfixe par "Ctrl" et l'on distingue le CtrlF1 qui est le conteneur de F1 qui est le contenu...
Evites aussi les accentués dans les noms d'objets ;-)