web-dev-qa-db-ja.com

VBAを使用してMS Accessに新しいレコードを追加する方法は?

ユーザーのバインドフォームを使用して、新規または既存の顧客に関する情報を更新しています。現在、[送信]ボタンで[新しいレコードの追加]マクロを使用しています(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
7
New2This

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を使用する方が簡単です。

7
Michael

フォームの更新前イベントを作成して、閉じる前にプロンプ​​トを作成するのは奇妙に思えます。おそらく、代わりに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列には自動的に番号が割り当てられるため、そのための挿入値を指定する必要はありません(または指定する必要はありません)。

0
technoman23

副次的な注意事項として、VBA機能を使用してレコードを追加すること(「レコードボタンの追加」コードのように)は、DoCmd.Run SQLの「INSERT INTO ...」を使用するよりも約400倍速く動作することに気付きました。 5列(ID + 4短い文字列)を持つテーブルの場合、140レコード/秒。

これは、データが手動で入力されるフォームに関しては実用的な意味を持ちませんが、フォームがより多くのレコードを生成している場合、これは多くの時間を節約します。

0
Krzychu C