サブフォーム内の新しいレコードの作成と移動に(テーブルをソースとして)関数DoCmd.GoToRecord , , acNewRec
を正常に使用しています。ただし、親フォームから同じことをしようとすると、これは機能しません。以下を含むさまざまなアプローチを試しました。
Me.sbfrm_subform.Controls("ctrName").SetFocus
DoCmd.GoToRecord , , acNewRec
コントロール(ctrName)にフォーカスを設定するだけで、新しいレコードへの追加と移動に失敗する、または
DoCmd.GoToRecord acDataForm, Me.sbfrm_subform.Form.Name, acLast
実行時エラー2489、「オブジェクト 'sbfrm_subformが開いていません」を返します。
コードをサブフォームに配置してから、親から呼び出してみてください。
サブフォームコード:
Sub GoToNewRecord()
DoCmd.GoToRecord , , acNewRec
End Sub
親フォームコード:
Me.sbfrm_subform.GoToNewRecord
操作を分割してみてください:
Me.[sbfrm_subform].SetFocus
DoCmd.GoToRecord, , acNewRec
または、サブフォームでパブリックSubを作成してみてください。これはフォームのメソッドになるため、それを使用できます。
これを最近のバージョンのAccessで使用すると、Me.Recordset.Movenext
のように、フォームのレコードセットで直接再生することもできます。
IDevlopが指摘したように、サブフォームのRecordsetオブジェクトを使用して、新しいレコードに移動できます。ただし、サブフォームにパブリックサブを作成する必要はありません。すべてをメインフォームから行います。
Me.[subform control name].SetFocus
Form_[subform form name].Recordset.AddNew
Form_ [フォーム名]構文を使用するには、フォームにVBAコードモジュールが必要です。フォームにフォームがなく、何らかの理由で空のフォームを作成することに反対する場合は、代わりにForms!MyForm.SubformControl.Form構文を使用できます。しかし、Form_ [Form Name]はより単純です。
メインフォーム「On Current」で次のイベントプロシージャを実行しました。
Private Sub Form_Current()
Me.SubformName.SetFocus
Me.SubformName.Requery
RunCommand acCmdRecordsGoToLast
DoCmd.GoToRecord , , acNewRec
Scan.SetFocus
End Sub
DoCmdは、メインフォームが新しいレコードを開始するためのものです。それより前のすべては、サブフォームを最後のレコードに設定し、データが最新になるように再クエリすることです。
私にとってうまくいったのは、レコードを表示するフォームで、希望するフィールドにフォーカスを設定し、レコードセットを設定することです。レコードセットを設定した後、レコードセットのAddNew関数を使用します。
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
これは私が私の問題を解決した方法です...
メインフォーム名はFRM_Trader_WorkSheetです
サブフォーム名はFrm_Trader_Worksheet_Subです
メインフォームのオープンイベントでは、次のようにコーディングしました。
Private Sub Form_Open(Cancel As Integer)
Me.Frm_Trader_Worksheet_Sub.SetFocus
DoCmd.GoToRecord , , acLast
DoCmd.GoToRecord , , acNext
End Sub
メインフォームでデータ入力を行っていないため、メインフォームが開き、サブフォームの新しいレコードにフォーカスが移動します。必要に応じて前のレコードに戻ることができますが、メインフォームが読み込まれたときに新しいデータを入力する準備ができています。
そうは言っても、[データ]タブの下のサブフォームのプロパティを設定するだけで同じ結果を得ることができます。[データ入力= YES。唯一の違いは、以前のレコードにアクセスできなくなることです...
答えは、次のいずれかの行を使用することです。
DoCmd.RunCommand acRecordsGotoNew
DoCmd.RunCommand acRecordsGotoNext
DoCmd.RunCommand acRecordsGotoPrevious
DoCmd.RunCommand acRecordsGotoFirst
DoCmd.RunCommand acRecordsGotoLast
何をしたいかによって異なります。機能的には、ナビゲーションボタンが表示されたままになっている場合、いずれかのボタンをクリックするのと同じです。
これらのいずれかを親フォームから呼び出す場合、最初に次の行を使用してサブフォームにフォーカスを設定する必要があります
Me.subform_name.SetFocus
残念ながら、レコードセット内の絶対位置にナビゲートするコマンドはないようです。これにより、一連の可能性が完成します。