トップ > スキル : アプリケーション > VBA for Access > 応用編(データベースオブジェクト DAOとADO)
新規レコードの追加
レコードセットを用いて、新しいレコードをテーブルに追加するには、RecordsetオブジェクトのAddNewメソッドを使用します。AddNewメソッドを実行した直後は、そのレコードがカレントレコードになります。また、Recordsetオブジェクトの引数であるLockTypeプロパティの値が「adLockReadOnly」である場合には新しいレコードは追加できません。
◆ AddNewメソッド
【書式】
Recordsetオブジェクト.AddNew フィールド名,値
- フィールド名:レコードを追加するフィールド名
- 値:代入する値
単一フィールドに値を追加
複数のフィールドを持っているテーブルでも、AddNewメソッドは1つのフィールドに1つの値のみしか追加できません。また、複数のフィールドで、Nullを許可しない設定(値要求が「はい」)では、エラーが発生するので、このエラーを回避するには、何かしらの値を代入するしか手段がありません。
サンプルの「T_売上」テーブルの[売上日]に「2010/2/12」の値を新しく追加します。

《 記述例 》
次のように記述します。
Sub レコード新規作成1() Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Dim bm As Variant Dim mySQL As String Dim strData As String Set cn = CurrentProject.Connection Set rs = New ADODB.Recordset rs.Open "T_売上", cn, adOpenKeyset, adLockOptimistic rs.AddNew "売上日", #2/12/2010# Do Until rs.EOF strData = strData & vbNewLine & rs!売上日 & ":" & _ rs!商品名 & ":\" & Format(rs!金額, "#,##0") & ":" & rs!区分 rs.MoveNext Loop MsgBox "追加レコード一覧" & vbNewLine & strData rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub
動作の結果は1フィールドの値の見追加され、その他のレコーダNull値が代入されます。

テーブルを開くと売上日フィールドのみ日付の新しいレコードが追加されています。

RecordsetオブジェクトのAddNewメソッドでは、追加できるフィールドは1つに限定されるので、AddNewメソッドで複数のフィールドの値を代入するには、Updateメソッドを組み合わせる必要があります。
複数フィールドに値を追加
新規レコードを作成し同時に複数のフィールドのレコードデータを追加するには、AddNewメソッドとUpdateメソッドを組合せます。
AddNewメソッドの構文は、Updateメソッドを共に利用する場合は、Recordsetオブジェクト.AddNewと記述し、引数は不要です。UpdateメソッドもAddNewメソッドと共有する場合は引数が不要です。
《 記述例 》
テーブル「T_売上」に売上日が「2010/2/12」、商品名が「シュレッタ」、金額は「9800」、そして区分は「その他」の値を追加するには次のように記述します。
Sub レコード新規作成2() Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Dim bm As Variant Dim mySQL As String Dim strData As String Set cn = CurrentProject.Connection Set rs = New ADODB.Recordset rs.Open "T_売上", cn, adOpenKeyset, adLockOptimistic rs.AddNew rs!売上日 = #2/12/2010# rs!商品名 = "シュレッタ" rs!金額 = Format(9800, "#,##0") rs.Update Do Until rs.EOF strData = strData & vbNewLine & rs!売上日 & ":" & _ rs!商品名 & ":\" & Format(rs!金額, "#,##0") & ":" & rs!区分 rs.MoveNext Loop MsgBox "追加レコード" & vbNewLine & strData rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub
動作を確認すると、追加するレコードの各フィールドの値が表示されます。

テーブルを開くと、末尾に新規レコードが追加されていることが確認できます。

複数のフィールドにデータが追加され、1件のレコードとして新規に格納されました。
メッセージボックスには、追加されたレコードのみが表示されましたが、この理由はAddNewメソッドを事項すると、新規レコードは一番最後となる末尾に追加されます。そして、この追加されたレコードがカレントレコードになり、このレコードの後ろには既存のレコードがないので、追加されてレコードのみだけが表示されたという訳になります。
Sub レコード新規作成2()
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim bm As Variant
Dim mySQL As String
Dim strData As String
Set cn = CurrentProject.Connection
Set rs = New ADODB.Recordset
rs.Open "T_売上", cn, adOpenKeyset, adLockOptimistic
rs.AddNew
rs!売上日 = #2/12/2010#
rs!商品名 = "シュレッタ"
rs!金額 = Format(9800, "#,##0")
rs!区分 = "その他"
rs.Update
rs.MoveFirst
Do Until rs.EOF
strData = strData & vbNewLine & rs!売上日 & ":" & _
rs!商品名 & ":\" & Format(rs!金額, "#,##0") & ":" & rs!区分
rs.MoveNext
Loop
MsgBox "追加レコード" & vbNewLine & strData
rs.Close: Set rs = Nothing
cn.Close: Set cn = Nothing
End Sub