2016-08-23 11 views
4

私は、新規または既存の顧客に関する情報を更新するために、ユーザーにバインドフォームを使用しています。今は、私はVBAを使って新しいレコードを追加または保存する方法がわからないため、SubmitボタンでAdd New Recordマクロを使用しています。VBAを使用してMS Accessで新しいレコードを追加する方法?

VBAを使用して更新前イベントを追加して、フォームを終了する前に変更を保存することをユーザーに確認させました。何らかの理由でこれがレコードの追加ボタンを無効にしているため、ユーザーはフォームを終了するまで新しいレコードを追加できません。

VBAを使用して新しい顧客情報を正しいテーブルに追加するにはどうすればよいですか?代わりにマクロで行うべきことですか?

フォームのBeforeUpdateコード:

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 

録音ボタン追加:、VBAを使用してレコードを提出ボタンのOn Clickイベントを作成し、その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 
+0

私はかなり混乱しています。バインドされたフォームにレコードを追加するには、フォームの下部ペインにある新しいレコードのナビゲーションボタン(アスタリスク付きの右矢印)をクリックするだけです。また、BeforeUpdateルーチンは '.OldValue'プロパティを利用していますか?これは、コントロールを終了するとすぐに編集内容がテーブルに保存されるため、バインドされたフィールドをコミットしないことがわかっている唯一の方法です。したがって、 '.OldValue'を指定しないと、あなたのルーチンが遅すぎるので、おそらくフォーム上ではなく、各コントロールのBeforeUpdateイベントに追加する必要があります。明確化するために、送信ボタンとbeforeupdateイベントのコードを投稿してください。 – MoondogsMaDawg

+0

クイック返信をありがとう。私はモバイル上にいるので、私が使用しているコードを貼り付けました。レコードを追加しすぎているのか、更新の前に私に知らせてください。 FYIこれらのコードは各フォームの各レコードの追加ボタンに表示されます。エラープルーフィングまたは改善に関する推奨事項はすばらしいでしょう。もう一度ありがとう – New2This

答えて

3

をコマンド:

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 

このサブでは、ユーザーが入力した値を検証し、レコードを提出するかどうかを選択するすべてのコード。 VBAを使用してフォームを送信するコントロールがたくさんあるので、BeforeUpdateイベントは必要ありません。

また、このメソッドではバインドされたフォームを使用しないでください。私は反響が何であるか分からないが、私はそれを試していないだろう。アクセスは初心者には大変ですが、もっと複雑なことをしたいので、VBAを使う方が簡単です。

+0

これを共有していただきありがとうございます。あなたが私のコードを見たかどうかは分かりません。これはボタンでレコードを追加するより良い方法ですか? – New2This

+0

「良い方法」とはどういう意味ですか?結局のところ、このSubは実際にコードの1行だけです – Michael

+0

良い点。私の質問に答える時間をとってくれてありがとう。両方の方法が正しいテーブルに情報を追加するのに役立つように見えます。私は間違いなくあなたが上記で概説したものを使って試してみます。 – New2This

0

フォームを閉じる前にプロンプ​​トを作成するための更新イベントを作成するのは変です。おそらくあなたは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コードに含まれていることを確認する必要があります。もう一つは...あなたのSQLでは、テキストボックスのエントリからIDカラムに値を代入しようとしているようです。 IDが自動番号列の場合は、これを行わないでください。 ID列には通常自動的に番号が割り当てられるため、挿入値を指定する必要はありません(または指定する必要があります)。

+0

最初の 'Dim'ステートメントでは' sVIN、sMake、sModel、sColor'を 'Variant'と宣言していますが、' String'としたいと思うようです。定義する各変数の型を明示的に設定する必要があります。そうでなければ、Variantとして初期化されます。 ( 'Debug.Print typename(sVIN)'という行を一時的に追加することができます) – Inarion

+0

フィールドの値を読み取る前に 'Field.SetFocus'を実行するかどうかは機能的に違いがありますか?私はそのアプローチで少し混乱しています。それはあなたの答えに言及されていないいくつかの追加イベントトリガーを持っているのですか? – Inarion

関連する問題