ユーザーのバインドフォームを使用して、新規または既存の顧客に関する情報を更新しています。現在、[送信]ボタンで[新しいレコードの追加]マクロを使用しています(VBAを介して新しいレコードを追加または保存する方法がわからないため)。
更新前イベント(VBAを使用)を追加して、フォームを終了する前に変更を保存することをユーザーに確認させます。何らかの理由で、これはレコードの追加ボタンをオーバーライドし、ユーザーはフォームを終了するまで新しいレコードを追加できません。
VBAを使用して、新しい顧客情報を正しいテーブルに追加するにはどうすればよいですか?代わりにマクロを使用してこれを行う必要がありますか?
フォーム更新前コード:
Private Sub Form_BeforeUpdate(Cancel As Integer)
Dim strmsg As String
strmsg = "Data has been changed."
strmsg = strmsg & " Save this record?"
If MsgBox(strmsg, vbYesNo, "") = vbNo Then
DoCmd.RunCommand acCmdUndo
Else
End If
End Sub
レコード追加ボタン:
Private Sub btnAddRecord_Click()
Dim tblCustomers As DAO.Recordset
Set tblCustomers = CurrentDb.OpenRecordset("SELECT * FROM [tblCustomers]")
tblCustomers.AddNew
tblCustomers![Customer_ID] = Me.txtCustomerID.Value
tblCustomers![CustomerName] = Me.txtCustomerName.Value
tblCustomers![CustomerAddressLine1] = Me.txtCustomerAddressLine1.Value
tblCustomers![City] = Me.txtCity.Value
tblCustomers![Zip] = Me.txtZip.Value
tblCustomers.Update
tblCustomers.Close
Set tblCustomers = Nothing
DoCmd.Close
End Sub
VBAを使用してレコードを送信するには、On Click
イベントをボタンに対して実行し、その中でSub
で次のコマンドを実行します。
Private Sub submitButton_Click()
'All the code to validate user input. Prompt user to make sure they want to submit form, etc.
DoCmd.RunSQL "INSERT INTO tblCustomers (txtCustomerID.Value, txtCustomerName.Value, txtCustomerAddressLine1.Value, txtCity.Value, txtZip.Value)"
End Sub
このSubでは、ユーザーが入力した値を検証するすべてのコードを追加し、レコードを送信するかどうかを選択できます。 VBAを使用してフォームを送信するための多くの制御があるため、BeforeUpdate
イベントは必要ありません。
また、このメソッドでは連結フォームを使用しないでください。影響はわかりませんが、試してはいません。アクセスは開始するのに最適ですが、より複雑なことをしたい場合は、VBAを使用する方が簡単です。
フォームの更新前イベントを作成して、閉じる前にプロンプトを作成するのは奇妙に思えます。おそらく、代わりにon closeイベントを試してください。 vbaを使用してフォームから新しいレコードを追加する場合は、ステートメントを簡素化できます。 Access DB用に独自のフォームを設計するときに、同様の状況に遭遇しました。このコードはテスト済みで動作しています:
Dim sVIN, sMake, sModel, sColor, sType As String
Dim intYear As Integer
Me.txtVIN.SetFocus: sVIN = Me.txtVIN.Value
Me.txtMake.SetFocus: sMake = Me.txtMake.Value
Me.txtModel.SetFocus: sModel = Me.txtModel.Value
Me.txtColor.SetFocus: sColor = Me.txtColor.Value
Me.comboType.SetFocus: sType = Me.comboType.SelText
Me.txtVehicleYear.SetFocus: intYear = Me.txtVehicleYear.Value
DoCmd.RunSQL "INSERT INTO Vehicles (VIN, Make, Model, VehicleYear, Color, Type) VALUES ('" & sVIN & "', '" & sMake & "', '" & sModel & "', " & intYear & ", '" & sColor & "', '" & sType & "')"
プロジェクトで1つのDBのみを使用していて、起動時に接続している場合、次のような単純なDoCmd.RunSQLステートメントを実行できる場合があります。ここで構文を使用して、独自のプロジェクトに適合させることができます。私自身、W3学校から基本的な構文を取得しました。 SQLクエリの作成方法を学習するのに適したサイトです。また、検証テストはここに含まれていないことにも注意してください。フォーム検証ルールまたはvbaコードに含まれていることを確認する必要があります。もう1つ... SQLでは、テキストボックスエントリからID列に値を割り当てようとしているように見えます。 IDが自動番号列の場合、これを行わないでください。通常、ID列には自動的に番号が割り当てられるため、そのための挿入値を指定する必要はありません(または指定する必要はありません)。
副次的な注意事項として、VBA機能を使用してレコードを追加すること(「レコードボタンの追加」コードのように)は、DoCmd.Run SQLの「INSERT INTO ...」を使用するよりも約400倍速く動作することに気付きました。 5列(ID + 4短い文字列)を持つテーブルの場合、140レコード/秒。
これは、データが手動で入力されるフォームに関しては実用的な意味を持ちませんが、フォームがより多くのレコードを生成している場合、これは多くの時間を節約します。