ADOでSQLでレコードセット作って一行ずつ処理する方法

MSACCESS_eyecatch
SBMJOB

Access VBAでテーブルを操作・参照するときはADO接続でSQL発行した方がロジックがわかりやすいと思われます。あと外部のサーバに接続して開発する場合もADOの方がすんなり理解しやすいのでADOおすすめします。さてタイトルの件ですが以下のサンプルコードで発行したSQLの内容でレコードセットを取得しそのレコードセットを一行ずつ処理するという内容になっています。

目次

スポンサーリンク

コード

Private Function sample()
 Dim myCn     As ADODB.Connection    'ADOコネクションオブジェクト
 Dim myRs     As ADODB.Recordset     'ADOレコードセットオブジェクト
 Dim strSQL   As String              'SQL文用文字列

  'エラートラップ
 On Error GoTo Err_Exit

 '関数の戻り値初期化
 ADO接続 = False
  '現在のデータベースへ接続
 Set myCn = CurrentProject.Connection
  'ADOレコードセットのインスタンス作成
 Set myRs = New ADODB.Recordset
  'SQL文作成
 strSQL = "SELECT * FROM 売上テーブル"
  'レコードセット取得
 myRs.CursorLocation = adUseClient
 myRs.Open strSQL, myCn, , adOpenDynamic
 With myRs
  '対象データがなければ終了
   If .EOF Or .BOF Then
    MsgBox "該当データがありません。処理を終了します。", vbOKOnly + vbInformation
    GoTo End_Proc
   Else
   '一度レコード数を表示する
    If .RecordCount <> 0 Then
     MsgBox (.RecordCount & "件のレコードがセットされています")
    End If
   '先頭レコードに移動
   .MoveFirst
   While Not .EOF
    'MsgBox (.Fields("商品名"))
    If .Fields("商品名") = "うどん" Then
     MsgBox ("きたぁー!ずるずる")
    End If
    If .Fields("商品名") = "うどん" Then
     .Fields("商品名") = "稲庭うどん"
    End If
   .MoveNext
   Wend
  End If
 End With
 MsgBox "処理を終了しました。", vbOKOnly + vbInformation
 End_Proc:
  'オブジェクトの開放
 Set myRs = Nothing: Close
 Set myCn = Nothing: Close
  '正常終了
 ADO接続 = True
 Exit Function
 Err_Exit:
  'エラーNOとエラーの詳細を表示
 MsgBox Err.Number & ":" & Err.Description, vbOKOnly + vbCritical, "ADO接続()"
  'オブジェクトの開放
 Set myRs = Nothing: Close
 Set myCn = Nothing: Close
End Function

解説とポイント

myRsというレコードセットにSQLでレコードをテーブルから持ってきています。そしてそのmyRsを一行ずつ中身を見ていき商品名が「うどん」だったらメッセージを表示しています。この部分が一行ずつ処理している箇所となります。メッセージ表示ではなく他の計算処理や出力処理なのどに置き換えるとよいと思っています。

なお、このレコードセットなんですがロックタイプがadLockReadOnly以外の場合はレコードセットをUpdateしてやればテーブルを更新することが可能です。さらにレコードセットのフィールドを違う値で置き換えて次のレコードに移動したりといわゆるカーソルを移動させるとUpdateが自動でかかりテーブルが更新されます。

レコードセット宣言時のロックタイプデフォルト値はadLockReadOnlyなので上記のサンプルコードはレコードセットの中身は書き換える事ができますが(このレコードセットをソースとする帳票フォームの表示は変更することができます)、テーブル自体は更新することはできません。

比較

上記記事との違いはSelect文で該当のレコードをレコードセットとして取得しそれぞれのレコードに対して処理をかけていくのでより細かな処理を記述することができるのが利点です。一方上記の処理はSQL文のみで処理が完結する場合の記事となりとても完結にコーディングができています。

SQLを駆使すればどんな処理でも複雑な文にはなりますが記述できますが、Access VBAでは複雑になりがちな部分をVBAで補いSQL分を簡素化することもこの記事のように可能となっています。開発するうえでは面白いポイントですね。

参考サイト

↑カーソルタイプやロックレベルの解説がわかりやすくておすすめのサイトです。

スポンサーリンク

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

システム開発SE・アプリ開発・デバッガー等々なんでもやる猫の下僕です。現在は凶暴猫にカタカタ動く手を狙われながらキーボードを打っています。かなりゆるい性格なのでコメントやメッセージお気軽に〜お仕事のご依頼もお気軽にぃ〜

スポンサーリンク

コメント

コメントする

CAPTCHA


目次