みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
エクセルVBAでAccessデータベースを操作する方法についてシリーズでお伝えしています。
前回はコチラの記事です。
SQLのSELECT文で取得したデータの並び順について確認しつつ、並び替えをしながら取得するORDER BY句の使い方について解説をしました。
今回ですが、そのADODBレコードセット版ですね。
Accessデータベースのテーブルを指定してADODBレコードセットをオープンした場合の並び順について確認しつつ、Sortメソッドを使って並び替えをする方法についてお伝えします。
では、行ってみましょう。
お題のデータベース
毎度で恐縮ですが、今回使うのもこのデータベースです。
ファイル名は「test4.accdb」、テーブル名は「成績表」、フィールドの構成は
です。
ADODBレコードセットをシートに書き出す
ADODBレコードセットオブジェクトに取得をして、そこからエクセルのSheet4に書き出してIDの並び順を確認してみましょう。
プログラムはコチラです。
Sub fetchRecords_byADO()
Dim strFileName As String
strFileName = "test4.accdb"
Dim adoCn As Object 'ADOコネクションオブジェクト
Set adoCn = CreateObject("ADODB.Connection") 'ADOコネクションオブジェクトを作成
adoCn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.Path & "\" & strFileName & ";" 'Accessファイルに接続
Dim adoRs As Object 'ADOレコードセットオブジェクト
Set adoRs = CreateObject("ADODB.Recordset") 'ADOレコードセットオブジェクトを作成
With adoRs
.Open "成績表", adoCn 'レコードセットを開く
Worksheets("Sheet4").Range("A2").CopyFromRecordset adoRs
.Close 'レコードセットのクローズ
End With
adoCn.Close 'コネクションのクローズ
Set adoRs = Nothing 'オブジェクトの破棄
Set adoCn = Nothing 'オブジェクトの破棄
End Sub
14行目でテーブル「成績表」を指定してレコードセットを開きます。これでレコードセットの中に成績表がゴソっと入ったというイメージです。
15行目のCopyFromRecordsetメソッドで、それをそのままSheet4のA2セルを先頭として貼り付けます。
ADODBレコードセットの並び順
このプログラムで出力したデータの並び順を確認してみましょう。
Sheet4の出力はこのようになっています。
前回同様に、例えばセルF3に
として、それをF列のレコードの最後までコピーします。
また、F1セルに
として「NG」の数をカウントします。
結果はこちらです。
IDが連続していない箇所が5箇所ありました。…前回のSQLのSELECT文の場合と同じです。調べたところ、NGがついている行数も一緒でした。
ADODBレコードセットも、レコードの並び順に関しては特に法則性はないということになりますね。
Sortメソッドでレコードセットを並び替えする
ADODBレコードセットのレコードを並び替えをする際は、Sortメソッドを使います。
書き方は
です。対象とするフィールド名とASCまたはDESCを半角で記載し、まとめてダブルクォーテーションで囲みます。
昇順にしたい場合はASC、降順にしたいときはDESCですね。
複数のフィールドをキーに並び替えをしたい場合は
とカンマ区切りにします。先に書いた順に並び替えをしますので、フィールド1でソートをした後に、フィールド2でソートされます。
CursorLocationプロパティを変更する
なお、Sortメソッドですが、ADODBレコードセットをオープンする前にCursorLocationプロパティを「adUseClient」に変更する必要があります。(デフォルトでは「adUseServer」に指定されています。
Sortメソッドを使う際は、忘れずに設定をしておきましょう。
プログラムを実行する
以上を踏まえて、プログラムの13行目~17行目を以下のようにします。
With adoRs
.CursorLocation = adUseClient 'Sortをするための設定
.Open "成績表", adoCn 'レコードセットを開く
.Sort = "ID ASC"
Worksheets("Sheet4").Range("A2").CopyFromRecordset adoRs
.Close 'レコードセットのクローズ
End With
これで実行をしてみましょう。
無事にNGがなくなりました。
まとめ
ADODBレコードセットもその並び順に関しては法則はありません。またADODBレコードセットを並び替えをするSortメソッドの使い方についてお伝えしました。(CursorLocationプロパティも忘れずに。)
したがって、以下の記事のように、例えば大量のレコードの更新をFindメソッド、Updateメソッドで行いたい、かつ速度を犠牲にしないためにMoveFirstメソッドを使わない場合は、今回の方法と前回の方法を組み合わせることによって実現が可能です。
これで一件落着です。
次回はまた少し視点を変えて、SELECTの際に集計をしながら出力するGROUP BY句の使い方と集計関数についてお伝えします。
どうぞお楽しみに!
連載目次:エクセルVBAでエクセルからAccessデータベースを操作する
エクセルと相性の良いデータベースとして第一候補として挙がるAccess。エクセルをインターフェース、AccessをデータベースとしてエクセルVBAを使って連携する方法とその様々なテクニックについてお伝えしていきます。- なぜエクセルとAccessデータベースを連携するのが良いのか、またその際の注意点
- エクセルVBAでAccessデータベースと接続する最もシンプルなプログラム
- 【エクセルVBA&Access連携】SQL文でデータを抽出する最も簡単なプログラム
- 【エクセルVBAでAccess連携】SQLのSELECT,FROM,WHEREによる様々なデータ抽出方法
- 【エクセルVBAでAccess連携】SQLのJOINを使って複数のテーブルを組み合わせてデータを取り出す
- 【エクセルVBAでAccess連携】データベースのテーブルにレコードを追加するシンプルな方法
- エクセルVBAでAccessデータベースに複数のレコードを追加する方法とその実行速度について
- 【エクセルVBAでAccess連携】データベースに特定条件のデータが存在するかどうかを判定する
- エクセルVBAからAccessデータベースのレコードを呼び出して修正して上書き更新する方法
- エクセルVBAでAccessデータベースの複数のレコードをまとめて上書き更新する方法
- エクセルVBAでAccessデータベースの複数のレコードを上書き更新する場合の実行速度について
- エクセルVBAでAccessのデータをORDER BYで並び替えをして取り出す
- エクセルVBAでADODBレコードセットをSortメソッドで並び替えする方法
- エクセルVBAでAccessデータをグループで集計して抽出するGROUP BY句と集計関数の使い方
- エクセルVBAでAccessデータを集合関数による条件で抽出するHAVING句の使い方
- エクセルVBAでAccessデータベースからFormat関数によるSQL文で特定の日付で抽出
- エクセルVBAでのAccessデータベース操作にトランザクション処理を入れる