J'ai utilisé la fonction DoCmd.GoToRecord , , acNewRec
avec succès pour créer et déplacer un nouvel enregistrement dans un sous-formulaire (avec une table comme source). Cependant, lorsque j'essaie de faire la même chose à partir du formulaire parent, cela ne fonctionne pas. J'ai essayé différentes approches, notamment:
Me.sbfrm_subform.Controls("ctrName").SetFocus
DoCmd.GoToRecord , , acNewRec
qui met uniquement le focus sur le contrôle (ctrName), mais ne parvient pas à ajouter et aller à un nouvel enregistrement, ou
DoCmd.GoToRecord acDataForm, Me.sbfrm_subform.Form.Name, acLast
Ce qui renvoie l'erreur d'exécution 2489, "L'objet sbfrm_subform de l'objet n'est pas ouvert."
Essayez de placer le code dans le sous-formulaire, puis appelez-le depuis le parent:
Code de sous-formulaire:
Sub GoToNewRecord()
DoCmd.GoToRecord , , acNewRec
End Sub
Code de formulaire parent:
Me.sbfrm_subform.GoToNewRecord
Essayez de fractionner les opérations:
Me.[sbfrm_subform].SetFocus
DoCmd.GoToRecord, , acNewRec
Alternativement, vous pouvez essayer de créer un sous-public dans le sous-formulaire, et puisque cela devient une méthode du formulaire, vous pouvez l'utiliser.
En utilisant ceci sur les versions récentes d'Access, vous pouvez même essayer de jouer directement avec le jeu d'enregistrements du formulaire, comme Me.Recordset.Movenext
.
Comme l'a noté iDevlop, vous pouvez utiliser l'objet Recordset du sous-formulaire pour passer à un nouvel enregistrement. Cependant, vous n'avez pas besoin de créer un sous-public dans le sous-formulaire. Vous faites tout à partir du formulaire principal:
Me.[subform control name].SetFocus
Form_[subform form name].Recordset.AddNew
Pour utiliser la syntaxe Form_ [nom du formulaire], le formulaire doit comporter un module de code VBA. Si le formulaire n'en contient pas et que, pour une raison quelconque, vous êtes opposé à la création d'un formulaire vide, vous pouvez utiliser la syntaxe Forms! MyForm.SubformControl.Form. Mais Form_ [Nom du formulaire] est plus simple.
J'ai fait la procédure événementielle suivante sous la forme principale "On Current":
Private Sub Form_Current()
Me.SubformName.SetFocus
Me.SubformName.Requery
RunCommand acCmdRecordsGoToLast
DoCmd.GoToRecord , , acNewRec
Scan.SetFocus
End Sub
Le DoCmd est pour le formulaire principal pour commencer un nouvel enregistrement. Tout ce qui précède consiste à définir le sous-formulaire sur le dernier enregistrement ET à le régénérer pour que les données soient actualisées.
Ce qui a fonctionné pour moi est: Après avoir défini le jeu d’enregistrements, j’utilise la fonction AddNew du jeu d’enregistrements.
Public Sub GoToNewRecord()
Me.<myTextbox>.SetFocus
Dim rcClone as Recordset
Set rcClone = Me.Recordset
rcClone.AddNew
End Sub
Private Sub anycotrl()
Me.yoursubformname_subform.SetFocus
DoCmd.GoToControl ("[anycontrolyouneed]")
DoCmd.GoToRecord , , acLast
End Sub
Voici comment j'ai résolu mon problème ...
le nom du formulaire principal est FRM_Trader_WorkSheet
Le nom du sous-formulaire est Frm_Trader_Worksheet_Sub
Sur l'événement ouvert de mon formulaire principal, j'ai codé comme suit:
Private Sub Form_Open(Cancel As Integer)
Me.Frm_Trader_Worksheet_Sub.SetFocus
DoCmd.GoToRecord , , acLast
DoCmd.GoToRecord , , acNext
End Sub
Étant donné que je ne saisis aucune donnée dans mon formulaire principal, mon formulaire principal s'ouvre et met l'accent sur un nouvel enregistrement de mon sous-formulaire. Je peux maintenant revenir aux enregistrements précédents si nécessaire, mais je suis prêt à saisir de nouvelles données lorsque le formulaire principal est chargé.
Cela dit, vous pouvez obtenir les mêmes résultats en définissant simplement la propriété du sous-formulaire sous l'onglet Données "Saisie de données = OUI. La seule différence est que vous n'aurez plus accès aux enregistrements précédents ...
La réponse est d'utiliser l'une des lignes suivantes:
DoCmd.RunCommand acRecordsGotoNew
DoCmd.RunCommand acRecordsGotoNext
DoCmd.RunCommand acRecordsGotoPrevious
DoCmd.RunCommand acRecordsGotoFirst
DoCmd.RunCommand acRecordsGotoLast
En fonction de ce que vous voulez faire. Cela revient fonctionnellement à cliquer sur l’un des boutons de navigation s’ils sont laissés visibles.
Si vous appelez l'un de ceux-ci à partir du formulaire parent, vous devez d'abord définir le focus sur le sous-formulaire avec la ligne suivante.
Me.subform_name.SetFocus
Malheureusement, il ne semble pas exister de commande permettant d'accéder à une position absolue dans le jeu d'enregistrements, ce qui compléterait l'ensemble des possibilités.