トップ > スキル : アプリケーション > VBA for Access > 応用編(データベースオブジェクト DAOとADO)

VBA_Access

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