トップ > スキル : アプリケーション > VBA for Access > 応用編(データベースオブジェクト DAOと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という名称が付いている商品名の件数とそれぞれのレコードが表示されることが確認できます。
