Excel VBA で一時DBを使用する ― DELETE | パークのソフトウエア開発者ブログ|ICT技術(Java・Android・iPhone・C・Ruby)なら株式会社パークにお任せください

パークのソフトウエア開発者ブログ|ICT技術(Java・Android・iPhone・C・Ruby)なら株式会社パークにお任せください

開発の解決方法や新しい手法の情報を、パークのエンジニアが提供します。パークのエンジニアが必要な場合は、ぜひお気軽にお問い合わせ下さい。 株式会社パーク:http://www.pa-rk.co.jp/

こんにちは。ひらのです。

Excel VBA で一時DB⇔ADOを使用する方法の最終回です。
最後はDB(ADO)に登録したデータの削除についてご紹介します。

■前提知識

  • 簡単なExcel VBAコードを読めること

■お題(要件)

  1. 任意のフォーマットの文字列を解釈したい(SELECT, INSERT)
  2. 特定のデータを更新したい(UPDATE)
  3. 特定のデータを削除したい(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


この記事では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
    Loop
End Sub

特定のレコードを検索する方法は Excel VBA で一時DBを使用する ― UPDATE と同じです。
今回は検索したレコードを15行目で削除しています。

ポイントは、DELETE() の前後の処理です。

まずは12行目の分岐からご説明します。
Find() して、最後のレコードまで検索済み ⇔ EOF が TRUE の状態で DELETE() を実行すると、
下記のエラーが発生します。

実行時エラー '3021':
BOF と EOF のいずれかが True になっているか、または現在のレコードが削除されています。
要求された操作には、現在のレコードが必要です。

なので、Find() で検索したら Delete() 前にEOFかどうかを確認します。


続いて16行目。
Delete() を実行すると、カレントレコードが設定されていない状態になってしまいます。

この状態で Find() すると、下記のエラーが発生します。

実行時エラー '-2147217885(80040e23)':
行ハンドルは削除された行、または削除対象としてマークされている行を参照しました。

なので、カレントレコードを一度前後に変更してから次の操作を行ってください。
今回は次のレコードから検索を続行したいので、MoveNext() を使用しました。



Excel VBAで一時DB(ADO)を利用する方法は以上です。

ADOではソートなどもできるらしいので、後は検索してみてください(^^)/~