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

Excel VBA で一時DBを使用する ― DELETE

$
0
0

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

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    LoopEnd 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ではソートなどもできるらしいので、後は検索してみてください(^^)/~


Viewing all articles
Browse latest Browse all 138

Trending Articles