こんにちは。ひらのです。
Excel VBA で一時DB⇔ADOを使用する方法の最終回です。
最後はDB(ADO)に登録したデータの削除についてご紹介します。
■前提知識
- 簡単なExcel VBAコードを読めること
■お題(要件)
- 任意のフォーマットの文字列を解釈したい(SELECT, INSERT)
- 特定のデータを更新したい(UPDATE)
- 特定のデータを削除したい(DELETE) ★この記事ではコレを紹介します
■特定のデータを削除したい(DELETE)
Excel VBA で一時DBを使用する ― INSERTとSELECT では、
下記データをADOに登録しました。
[2014/10/01 7:40:58.112] RCV command=ACK ID=110405 messageId=001 data=
[2014/10/01 7:40:58.303] SND command=ACK ID=110405 messageId=002 data=
[2014/10/01 7:40:58.579] RCV command=DATA ID=110405 messageId=501 data=14B4 88B7 D54B A0D2 9A6A 3935
:
[2014/10/01 7:40:58.303] SND command=ACK ID=110405 messageId=002 data=
[2014/10/01 7:40:58.579] RCV command=DATA ID=110405 messageId=501 data=14B4 88B7 D54B A0D2 9A6A 3935
この記事ではADOに登録した内容にて、
特定のIDを持つレコードを削除したいと思います。
前々回作成した標準モジュールMyDBに、下記関数を追加します。
Public Sub DeleteWithSelectedId(ByVal id As Long) If 0 = adoRecordset.RecordCount Then Exit Sub End If Dim criteria As String criteria = "id = '" & id & "'" adoRecordset.MoveFirst Do While True Call adoRecordset.Find(criteria, 0, adSearchForward) If adoRecordset.EOF Then Exit Do End If adoRecordset.Delete adoRecordset.MoveNext LoopEnd Sub
特定のレコードを検索する方法は Excel VBA で一時DBを使用する ― UPDATE と同じです。
今回は検索したレコードを15行目で削除しています。
ポイントは、DELETE() の前後の処理です。
まずは12行目の分岐からご説明します。
Find() して、最後のレコードまで検索済み ⇔ EOF が TRUE の状態で DELETE() を実行すると、
下記のエラーが発生します。
実行時エラー '3021':
BOF と EOF のいずれかが True になっているか、または現在のレコードが削除されています。
要求された操作には、現在のレコードが必要です。
BOF と EOF のいずれかが True になっているか、または現在のレコードが削除されています。
要求された操作には、現在のレコードが必要です。
なので、Find() で検索したら Delete() 前にEOFかどうかを確認します。
続いて16行目。
Delete() を実行すると、カレントレコードが設定されていない状態になってしまいます。
この状態で Find() すると、下記のエラーが発生します。
実行時エラー '-2147217885(80040e23)':
行ハンドルは削除された行、または削除対象としてマークされている行を参照しました。
行ハンドルは削除された行、または削除対象としてマークされている行を参照しました。
なので、カレントレコードを一度前後に変更してから次の操作を行ってください。
今回は次のレコードから検索を続行したいので、MoveNext() を使用しました。
Excel VBAで一時DB(ADO)を利用する方法は以上です。
ADOではソートなどもできるらしいので、後は検索してみてください(^^)/~