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

VBA_Access

ADO

レコードの削除

レコードを削除するには、Deleteメソッドを使用します。Deleteメソッドで削除できるのはカレントレコードのみなので、削除したいレコードに移動するためにMove系やFind系メソッドでカレントレコードに移動させます。レコードを削除する際には警告メッセージが表示されません。そして削除されてレコードは二度と復元できないことに注意しておきます。

カレントレコードの削除

ある特定のレコードを削除するには、そのレコードがカレントレコードの位置にあることが必要です。

《 記述例 》

開いた直後のカレントレコード(先頭レコード)を削除するには以下のように記述します。

	Sub レコードの削除()
		Dim cn As ADODB.Connection
		Dim rs As ADODB.Recordset
		Dim strData As String

		Set cn = CurrentProject.Connection
		Set rs = New ADODB.Recordset

		rs.Open "T_売上", cn, adOpenKeyset, adLockOptimistic
		strDATA = rs!売上日 & vbNewLine & rs!商品名 & "のレコードを削除します。"

		If MsgBox(strDATA, vbCritical + vbOKCancel) = vbOK Then
			rs.Delete
			MsgBox "削除しました。"
		Else
			MsgBox "削除を中止しました"
		End If

		rs.Close: Set rs = Nothing
		cn.Close: Set cn = Nothing
	End Sub
    

動作を確認すると、まず先頭レコードの売上日と商品名を表示し、それを削除する旨のメッセージが表示されます。もし、削除を取り消すなら[キャンセル]を押します。
削除するのであれば、[OK]ボタンを押します。

テーブルを確認すると先頭レコードに「#Deleted」と表示されています。テーブルをいったん閉じて、再度開くと先頭レコードがなくなっていることが確認できます。

※ 削除を実行した際に、テーブルを開いているとこのように削除されてレコードには「#Deleted」と表示されます。

全レコードの削除

テーブル内のレコードをすべて削除するには、Loop処理を用いてすべてのレコードを一旦カレントレコードに切り替えて削除します。
また、削除されたレコードは決して復元できないので、削除する前にユーザに明示的な確認を促すためにIf文を使って記述するようにしましょう。

《 記述例 》

テーブル「T_売上」のすべてのレコードを削除するには以下のような記述をします。また、メッセージに何件のレコードを削除するかも表示します。

	Sub レコードの全削除()
		Dim cn As ADODB.Connection
		Dim rs As ADODB.Recordset
		Dim strData As String

		Set cn = CurrentProject.Connection
		Set rs = New ADODB.Recordset

		rs.Open "T_売上", cn, adOpenKeyset, adLockOptimistic
		strDATA = rs.RecordCount & "件のすべてのレコードを削除します。"

		If MsgBox(strDATA, vbCritical + vbOKCancel) = vbOK Then
			Do Until rs.EOF
				rs.Delete
				rs.MoveNext
			Loop
			MsgBox "すべてのレコードを削除しました。"
		Else
			MsgBox "削除を中止しました"
		End If

		rs.Close: Set rs = Nothing
		cn.Close: Set cn = Nothing
	End Sub
    

動作を確認すると、まずレコードを削除する旨のメッセージが表示されます。中止するのであれば[キャンセル]ボタンを押します。削除するのであれば[OK]ボタンをクリックします。

削除されたメッセージが表示されます。

テーブル「T_売上」を開くとすべてのレコードが削除されていることが確認できます。

※ Openメソッドの記述で、「rs.Open "T_売上", cn, adOpenKeyset, adLockOptimistic」のLockType引数の値が「adLockReadOnly」と設定されている時は、削除されません。

レコードの更新(編集)

Updateメソッドは、開いたRecordsetオブジェクト内のカレントレコードの内容を編集して更新することができます。前回のレコードセットの作成の時にも紹介しました。

ここでは、Updateメソッドの引数を省略した記述を紹介します。基本形は次のようになります。

レコードセット変数!フィールド名 = 値
レコードセット変数.Update

まず、レコードセット変数のフィールドに値を代入して、それを更新させることで編集が完了します。また、Updateメソッドを利用する場合、Openメソッドの引数であるLockTypeは「adLockOptimistic」を指定して更新用としてレコードセットを作成しておく必要があります。

《 記述例 》

テーブル「名前テーブル」の名前が「森下かおり」さんの名前を「大森下かおり」に更新したい場合、以下のような記述をします。

	Sub レコードの更新()
		Dim cn As ADODB.Connection
		Dim rs As ADODB.Recordset
		Dim Na As String

		Set cn = CurrentProject.Connection
		Set rs = New ADODB.Recordset

		rs.Open "名前テーブル", cn, adOpenKeyset, adLockOptimistic
		rs.Find "名前 like '森下*'", 0, adSearchForward

		Do Until rs.EOF
			If rs!名前 Like "森下*" Then
				Na = Mid(rs!名前, 3)
				rs!名前 = "大森下" & Na
				rs.Update
			Else
				Exit Sub
			End If
		Loop

		rs.Close: Set rs = Nothing
		cn.Close: Set cn = Nothing
	End Sub
    

まず、「森下」という名前を探し出すためにあいまい検索を使用して、頭に「森下」という名前を探します。
次に、もし先頭文字が「森下」ならば森下の下の名前を一旦変数に格納します。なぜなら、あいまいで見つけているということは下の名前もわからないので、後からその名前を足して更新することになります。
「森下」という名前を「大森下」に書き換え、その後に3文字以降の文字を足して、更新を実行します。
動作を確認すると、名前の名字が変更されていることが確認できます。

レコードの抽出

ある条件を満たしているレコードを抽出するには、RecordsetオブジェクトのFilterプロパティを使用します。もし、Filterプロパティで設定した条件に該当するレコードがなかった場合は、RecordsetオブジェクトのRecordcountプロパティの値は「0」となります。
また、Filterプロパティを解除する時は、長さ0の文字列("")または、adFilterNone定数をFilterプロパティに代入します。

◆ Filterプロパティ

【書式】

Recordsetオブジェクト.Filter = 条件式

  • 条件式:抽出条件式を記述します。複数の条件を指定する時は、OR、AND演算子を使用します。また、Like演算子を使用してあいまいな条件も指定できます。

※ 抽出する値がテキスト型の場合は、そのテキスト文字列をシングルクォーテーションで囲む必要があります。

比較演算子を使った抽出

《 記述例 》

テーブル「T_売上」で金額が「10,000」以上のレコードを抽出するには次のような記述をします。

	Sub レコードの抽出()
		Dim cn As ADODB.Connection
		Dim rs As ADODB.Recordset
		Dim strData As String

		Set cn = CurrentProject.Connection
		Set rs = New ADODB.Recordset

		rs.Open "T_売上", cn, adOpenKeyset, adLockOptimistic
		rs.Filter = "金額 >=10000"

		If rs.RecordCount = 0 Then
			MsgBox "該当するレコードはありません!"
		Else
			Do Until rs.EOF
				strDATA = strDATA & rs!売上日 & ":" & rs!商品名
				strDATA = strDATA & ":" & rs!金額 & ":" & rs!区分 & vbNewLine
				rs.MoveNext
			Loop
		End If

		MsgBox "10,000以上の金額は" & rs.RecordCount & _
			"件で次のレコードである" & vbNewLine & strDATA

		rs.Close: Set rs = Nothing
		cn.Close: Set cn = Nothing
	End Sub
    

動作を確認すると、金額が10,000以上のレコードは3件あり、そのレコードが表示されていることが確認できます。

あいまいな抽出

《 記述例 》

商品名に「HDD」という名称がついている商品だけのレコードを抽出するには、次のように記述します。

	Sub あいまいな抽出()
		Dim cn As ADODB.Connection
		Dim rs As ADODB.Recordset
		Dim strData As String

		Set cn = CurrentProject.Connection
		Set rs = New ADODB.Recordset

		rs.Open "T_売上", cn, adOpenKeyset, adLockOptimistic
		rs.Filter = "商品名 LIKE '*HDD*'"

		If rs.RecordCount = 0 Then
			MsgBox "該当するレコードはありません!"
		Else
			Do Until rs.EOF
				strDATA = strDATA & rs!売上日 & ":" & rs!商品名
				strDATA = strDATA & ":" & rs!金額 & ":" & rs!区分 & vbNewLine
				rs.MoveNext
			Loop
		End If

		MsgBox "HDDという名称がついている商品は" & rs.RecordCount & _
			"件で次のレコードである" & vbNewLine & strDATA

		rs.Close: Set rs = Nothing
		cn.Close: Set cn = Nothing
	End Sub
    

動作を確認すると、HDDという名称が付いている商品名の件数とそれぞれのレコードが表示されることが確認できます。