AccessVBA/ADO
ADOオブジェクト †
データベースを操作する為に、9つのオブジェクトが用意されています。
- ADOオブジェクト
- ADOオブジェクトを利用する。
- オブジェクトへの参照を割り当てる
- データベースに接続する方法
- カレントデータベースに接続する。
- 他のAccessデータベースに接続する。
- いろいろなデータベースに接続する。
- ODBCデータソース(Excelファイルに接続)
- レコードセットを取得する
- テーブルからデータを取得する
- レコードセットの機能を調べる
- カレントコードを移動する方法
- 選択クエリを使ってレコードセットを取得する
- レコードセットのブックマーク
- レコードセット内のレコード数を調べる
- カレントレコードを編集する
- フィールドを1つだけ更新する
- 複数のフィールドを更新する。
- 編集作業を取り消す(Yes/No処理)
- レコードを追加する方法
- レコードを削除する方法
- レコードを検索する方法
- レコードを抽出する方法
- レコードを並び替える方法
オブジェクト | 内容 |
Connection | データベースの接続情報 |
Command | SQLステートメント |
Parameter | クエリのパラメータ |
Recordset | レコードセット |
Field | レコードセットに含まれるフィールド |
Error | 接続で発生したエラー |
Property | ADOオブジェクトのプロパティ |
Record | ディレクトリまたはファイル |
Stream | ファイルの内容 |
ADOオブジェクトを利用する。 †
- オブジェクト変数の宣言
Visual Basicの他の変数と同じように、Dim・Static・Private・Publicステートメントを使って宣言します。
書式
Dim オブジェクト変数名 As クラス
例
Dim cn As ADODB.Connection
オブジェクトへの参照を割り当てる †
書式
Set オブジェクト変数名 = [New] クラス
- 新規Connectionオブジェクトへの参照を代入
Dim cn As ADODB.Connection Set cn = New ADODB.Connection
- 新規オブジェクトへの参照を代入する場合は、オブジェクト変数の宣言にまとめる事ができる。
Dim cn As New ADODB.Connection
データベースに接続する方法 †
プログラムでデータベースを操作するには、最初に操作の対象となるデータベースに接続しなければなりません。
ことときにConnectionオブジェクトを利用します。
- ConnectionオブジェクトのConnectionStringプロパティを設定する。
- ConnectionオブジェクトのOpenメソッドを実行する。
- ConnectionStringプロパティ
データベースへの接続情報を管理するプロパティです。
カレントデータベース以外に接続する場合は、自分で接続情報を作成する必要があります。
- 書式
connection.ConnectionString = "keyword1=value; keyword2=value2; ・・・" connection :開いているConnectionオブジェクト keyword :接続に使うキーワード value :キーワードに設定する値
- Openメソッド
ConnectionStringプロパティに設定された接続情報を使って、データベースに接続する処理を行います。
- 書式
connection.Open
- Closeメソッド
Opneメソッドを使ってデータベースに接続した後は、Closeメソッドを使ってオブジェクトを閉じてください。
- 書式
オブジェクト変数名.Close
例
connection.Close
しかし、これだけではオブジェクト参照に使った領域がメモリ上に残ったままになります。
たくさんのADOオブジェクトを利用するときは、処理速度が遅くなるので注意しましょう。
メモリから完全にこの領域を削除するには †
- 書式
Set オブジェクト変数名 = Nothing
カレントデータベースに接続する。 †
CurrentProjectオブジェクトはAccessで定義されているオブジェクトで、現在使用中のデータベースを表します。
- 書式
Set connection = CurrentProject.Connection
- 例
カレントデータベースに接続して、接続情報イミディエイトウィンドウに出力します。
Public Sub adoCurrentDB() Dim cn As New ADODB.Connection Set cn = CurrentProject.Connection Debug.Print cn.ConnectionString cn.Close: Set cn = Nothing End Sub
他のAccessデータベースに接続する。 †
Accessデータベースに接続するとき、ConnectionStringプロパティに設定しなければならないキーワードは
「Provider」と「Data Source」です。
- Providerキーワード
データベースに使うOLE DBプロバイダ名を設定してください。
Access2000の場合は
Microsoft.Jet.OLEDB.4.0
- Data Sourceキーワード
接続するデータベースのパスとファイル名を指定してください。
- 例
Public Sub adoAccess() Dim cn As New ADODB.Connection cn.ConnectionString = "provider=Microsoft.Jet.OLEDB.4.0; Data Source=D:\db1.mdb" cn.Open MsgBox "接続成功!" cn.Close: Set cn = Nothing End Sub
いろいろなデータベースに接続する。 †
接続するデータベースの種類によって、接続情報文字列に設定するキーワードは異なります。
- ODBCデータソース
Providerキーワード :OLEDBプロバイダ名(MSDASQLを設定) DSNキーワード :データソース名 UIDキーワード :ユーザ名 PWDキーワード :パスワード
- Oracleデータベース
Providerキーワード :OLEDBプロバイダ名(MSDAORAを設定) Data Sourceキーワード :サーバ名 User IDキーワード :ユーザ名 Passwordキーワード :パスワード
- SQL Server
Providerキーワード :OLEDBプロバイダ名(SQLOLEDBを設定) Data Sourceキーワード :サーバ名 Initial Catalog :サーバ上のデータベース名 User IDキーワード :ユーザ名 Passwordキーワード :パスワード
ODBCデータソース(Excelファイルに接続) †
- DSNの作成
- [コントロールパネル] - [管理ツール] - [データ ソース (ODBC)]
- [追加]ボタンをクリック
- [データソースの新規作成]ダイアログ - [Driver do Microsoft Excel]を選択
- データソース名を「testExcel」 - ブックの選択で接続するExcelファイルを選択
- プログラムの作成
Public Sub adoExcel() Dim cn As New ADODB.Connection cn.ConnectionString = "Provider=MSDASQL; DSN=testExcel" cn.Open MsgBox "接続成功!" cn.Close: Set cn = Nothing End Sub
レコードセットを取得する †
テーブルに登録されているレコードや、クエリを実行して取得したレコードの集まりを管理するのは、Recordsetオブジェクトです。
- 書式
recordset.Open source, activeconnection, cursortype, Locktype, option recordset :Recordsetオブジェクト型のオブジェクト変数 source :テーブル名, クエリ名, SQLステートメント activeconnection :接続中のデータベースを表すConnectionオブジェクト、または接続情報文字列 cursortype :(省略可能)カーソルタイプ adOpenForwardOnly :前方専用カーソル(既定値) adOpenKeyset :キーセットカーソル adOpenDynamic :動的カーソル adOpenStatic :静的カーソル locktype :(省略可能)ロックタイプ adLockReadOnly :読み取り専用(規定値) adLockPessimistic :レコード単位の排他的ロック adLockOptimistic :レコード単位の共有的ロック adLockBatchOptimistic :共有的バッチ更新 option :(省略可)オプション
- 例
[T_顧客]テーブルを参照するDim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Set cn = CurrentProject.Connection rs.Open "T_顧客",cn
カーソルタイプとは †
他のユーザからの参照範囲を制御する機能をカーソルと呼びます
- 前方専用カーソル
レコードセットの先頭から最終方向に向かって、カレントコードを移動します。
その逆の移動はできません。このタイプのレコードセットでは、他のユーザが行った編集(レコードの追加、編集、削除)の結果は表示されません。
- キーセットカーソル
レコードセット内のすべての方向にカレントレコードを移動することができます。
このタイプのレコードセットでは、たのユーザが追加したレコードや削除したレコードにはアクセスできません。
他のユーザが編集したレコードは表示されます。
- 動的カーソル
レコードセット内のすべての方向に、カレントレコードを移動する事ができます。
このタイプのレコードセットでは、他のユーザが行った編集結果が表示されます。
- 静的カーソル
レコードセット内のすべての方向にカレントコードを移動する事ができます。
このタイプのレコードセットでは、他のユーザが行った編集結果は表示されません。
テーブルからデータを取得する †
- 書式
recordset!氏名
- 例
[T_顧客]テーブルからレコードを取得し、[顧客ID][氏名]フィールドをイミディエイトウィンドウに表示Public Sub adotable() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Set cn = CurrentProject.Connection rs.Open "T_顧客", cn, adOpenKeyset, adLockOptimistic Debug.Print rs!顧客ID, rs!氏名 rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub
レコードセットの機能を調べる †
RecordsetオブジェクトのSupportsメソッドを利用すると、取得したレコードセットがサポートしている機能を調べる事ができます。
- 書式
retvalue = recordset.Supports(cursoroption) retvalue :戻り値(Boolean型).機能をサポートしているときはTrue recordset :開いているRecordsetオブジェクト cousoroptions :機能 adAddNew :新規レコードの追加(AddNewメソッド) adBookmark :特定のレコードへのアクセス(Bookmarkプロパティ) adDelete :レコードの削除(Deleteメソッド) adFind :レコードの検索(Findメソッド) adIndex :インデックス(Indexメソッド) adMovePrevious :後方へのカレントコードの移動(MoveFirstメソッド、MovePreviousメソッド) adSeek :レコードの検索(Seekメソッド) adUpdate :レコードの変更(Updateメソッド)
- 例
Public Sub adSupports() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Set cn = CurrentProject.Connection rs.Open "社員追加", cn, adOpenKeyset, adLockOptimistic Debug.Print rs.Supports(adDelete) rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub
カレントコードを移動する方法 †
レコード内でカレントコードを移動することが出来ます。
- 書式
recordset.MoveFirst 先頭レコードに移動 recordset.MovePrevious 1つ前のレコードに移動 recordset.MoveNext 次のレコードに移動 recordset.MoveLast 最終レコードに移動
全てのレコードにアクセスする †
- 例1
先頭のレコードから順にEOFがTrueになるまで実行する。Do Until recordset.EOF Debug.Print rs!社員ID, rs!指名 recordset.MoveNext Loop
- 例2
最終レコードから先頭レコードまで順に移動していくrecordset.Movelast Do Until recordset.BOF Debug.Print rs!社員ID, rs!指名 recordset.MovePrevioust Loop
選択クエリを使ってレコードセットを取得する †
RecordsetオブジェクトのOpenメソッドを実行するとき、source引数に既存のクエリを指定すると、そのクエリの実行結果を取得する事ができます。
- 例
Public Sub adoQuery() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Set cn = CurrentProject.Connection rs.Open "Q_東京都", cn, adOpenKeyset, adLockOptimistic Do Until rs.EOF Debug.Print rs!顧客ID, rs!氏名, rs!都道府県 rs.MoveNext Loop rs.Clone: Set rs = Nothing cn.Close: Set cn = Nothing End Sub
レコードセットのブックマーク †
取得したレコードが空でなければ、必ずカレントコードが存在します。
カレントコードの位置を管理しているのが、RecordsetオブジェクトのBookmarkプロパティです。
- 例
book変数にBookmarkプロパティの値を保存しておいて、MoveNextした後に
Bookmarkプロパティにbook変数の値を代入すると、カレントレコードが移動できる。Debug.Print rs!顧客ID, rs!氏名, rs!都道府県, rs!住所, rs.Bookmark book = rs.Bookmark rs.MoveNext Debug.Print rs!顧客ID, rs!氏名, rs!都道府県, rs!住所, rs.Bookmark rs.Bookmark = book Debug.Print rs!顧客ID, rs!氏名, rs!都道府県, rs!住所, rs.Bookmark
「ブックマークをサポートしていない」というエラーが発生 †
RecordオブジェクトのOpenメソッドでcursortype引数を省略すると、CursorTypeプロパティの値がadForwardOnlyのレコードセットになります。
このタイプのレコードセットは、ブックマークをサポートしていません。
レコードセット内のレコード数を調べる †
recordset.RecordCount
- レコードセットのカーソルタイプによっては、レコード数を取得できません。
「adOpenForwardOnly」ではRecordCountプロパティはつねに「-1」になります。
「adOpenDynamic」もレコードソースによっては「-1」になります。
カレントレコードを編集する †
RecordオブジェクトのUpdateメソッドを利用すると、カレントコードの内容を編集する事ができます。
Updateメソッドを実行した後も、カレントコードの位置は変わりません。
- 書式
recordset.Update fiels, value recordset :開いているRecordsetオブジェクト fields :(省略可)編集するフィールド名 values :(省略可)フィールドに代入する値
- 例1 [氏名]フィールドに「山田 太郎」を代入する
recordset.Update "氏名", "山田太郎"
- 例2 [性別]フィールドに「2」を代入する
recordset.Update "性別", 2
- 例3 [生年月日]フィールドに「1970/12/10」を代入する
recordset.Update "生年月日", #12/10/1970#
- Updateメソッドは、編集可能なレコードセットでしか実行できません。
更新機能をサポートしているかどうかはSupportsメソッドを使って確認する。retvalue = recordset.Supports(adUpdate)
フィールドを1つだけ更新する †
- 例1 [氏名]フィールドに「 様」を追加します。
Public Sub adoUpdate() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset '接続 Set cn = CurrentProject.Connection '[T_顧客]テーブルを参照 rs.Open "T_顧客", cn, adOpenKeyset, adLockOptimistic Debug.Print rs.RecordCount '編集前の値を確認 For i = 1 To rs.RecordCount Debug.Print rs!氏名 rs.MoveNext Next i '編集 rs.MoveFirst For i = 1 To rs.RecordCount rs.Update "氏名", rs!氏名 & "様" rs.MoveNext Next i rs.MoveFirst For i = 1 To rs.RecordCount Debug.Print rs!氏名 rs.MoveNext Next i rs.Clone: Set rs = Nothing: cn.Close: Set cn = Nothing End Sub
複数のフィールドを更新する。 †
Public Sub adoUpdate() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset '接続 Set cn = CurrentProject.Connection '[T_顧客]テーブルを参照 rs.Open "T_顧客", cn, adOpenKeyset, adLockOptimistic Debug.Print rs!氏名, rs!性別, rs!生年月日 rs!氏名 = "山田 太郎" rs!性別 = 1 rs!生年月日 = #12/10/1970# rs.Update Debug.Print rs!氏名, rs!性別, rs!生年月日 rs.Clone: Set rs = Nothing: cn.Close: Set cn = Nothing End Sub
編集作業を取り消す(Yes/No処理) †
フィールドに値を代入してからUpdateメソッドを実行するまで、そのレコードに行った編集作業は保留状態になっています。
この状態でRecordsetオブジェクトのCancelUpdateメソッドを実行すると、フィールドの値を元に戻す事ができます。
- 例1
Public Sub adoUpdate() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset '接続 Set cn = CurrentProject.Connection '[T_顧客]テーブルを参照 rs.Open "T_顧客", cn, adOpenKeyset, adLockOptimistic Debug.Print rs!氏名, rs!性別, rs!生年月日 rs!氏名 = "山田 太郎" rs!性別 = 1 rs!生年月日 = #12/10/1950# '更新確認 Beep ret = MsgBox("更新しますか?", vbQuestion + vbYesNo, "更新") Select Case ret Case vbYes rs.Update Case vbNo rs.CancelUpdate End Select Debug.Print rs!氏名, rs!性別, rs!生年月日 rs.Clone: Set rs = Nothing: cn.Close: Set cn = Nothing End Sub
レコードを追加する方法 †
RecordオブジェクトのAddNewメソッドを利用すると、レコードセットに新規レコードを追加する事ができます。
- 書式
recordset.AddNew fields, values recordset :開いているRecordsオブジェクト fields :(省略可能)編集するフィールド名 values :(省略可能)フィールドに代入する値
追加したレコードに値を代入する †
AddNewメソッドを実行すると、追加したレコードがカレントコードになります。
その後、Updateメソッドを利用して、追加したレコードをレコードセットに保存します。
- 例1
Public Sub adoAddNew() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Set cn = CurrentProject.Connection rs.Open "T_顧客", cn, adOpenKeyset, adLockOptimistic rs.AddNew rs!フリガナ = "ヤマタ タロウ" rs!氏名 = "山田 太郎" rs!生年月日 = #12/10/1970# rs!性別 = 2 rs!郵便番号 = "5410053" rs!都道府県 = "大阪府" rs!住所 = "大阪市中央区本町" rs!電話番号 = "066-123-5678" rs.Update MsgBox "処理終了" rs.Clone: Set rs = Nothing: cn.Close: Set cn = Nothing End Sub
レコードを削除する方法 †
RecordsetオブジェクトのDeleteメソッドを利用すると、カレントレコードを削除する事ができます。
- 書式
recordset.delete recordset :開いているRecordsetオブジェクト
- 例1
Public Sub adoDelete() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Set cn = CurrentProject.Connection rs.Open "T_顧客", cn, adOpenKeyset, adLockOptimistic rs.MoveLast Beep ret = MsgBox(rs!顧客ID & "" & rs!氏名 & vbCrLf & "削除しますか?", _ vbYesNo + vbQuestion, "削除") Select Case ret Case vbYes rs.Delete MsgBox "削除しました" Case vbNo End Select rs.Clone: Set rs = Nothing: cn.Close: Set cn = Nothing End Sub
レコードを削除するタイミング †
RecordsetオブジェクトのLockTypeプロパティの値がadLockOptimisticの場合は、Deleteメソッドを実行した時にレコードが削除されます。レコードを戻すことはできません。
LockTypeプロパティの値がadLockBatchOptimisticの場合は、UpdateBatchメソッドを実行したときに初めて削除されます。
また、Deleteメソッドを実行した後でも、CancelBatchメソッドを実行すると削除したレコードを戻す事ができます。
- 書式
recordset.UpdateBatch recordset.CancelBatch
レコードを検索する方法 †
RecordsetオブジェクトのFindメソッドを利用すると、指定した条件を満たすレコードを検索する事ができます。
レコードが見つかったときは、そのレコードがカレントコードになります。
- 書式
recordset.Find criteria, skiprows, searchdirection, start recordset :開いているRecordsetオブジェクト criteria :レコードを検索する条件 skiprows :(省略可)読み飛ばすレコード数 searchdirection :(省略可)検索方向 adSearchBackward :先頭レコードに向かって検索 adSearchForward :最終レコードに向かって検索(既定値) start :(省略可)検索開始位置
- 例
recordset.Find "都道府県 = '大阪府'"
検索条件の書き方 †
演算子 | 意味 | 例 | 例の意味 |
= | 等しい | "都道府県 = '東京都'" | [都道府県]フィールドが[東京都] |
<> | 等しくない | "都道府県 <> '東京都'" | [都道府県]フィールドが[東京都]以外 |
< | より小さい | "生年月日 < #01/01/1960#" | [生年月日]フィールドが[1960/01/01]よりも前 |
より大きい | "生年月日 > #01/01/1960#" | [生年月日]フィールドが[1960/01/01]よりも後 | |
<= | 以下 | "単価 <= 10000" | [単価]フィールドが10000以下 |
>= | 以上 | "単価 >= 10000" | [単価]フィールドが10000以上 |
Like | 文字パターン | "フリガナ Like 'ア*'" | [フリガナ]フィールドが[ア]で始まる |
- 例1
[都道府県]フィールドが変数varの値と等しいレコードrecordset.Find "都道府県 = '" & var & "'"
[性別]フィールドの値が変数varと等しいレコードrecordset.Find "説別 = " & var
- 例2
Public Sub adoFindFirst() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Set cn = CurrentProject.Connection rs.Open "T_顧客", cn, adOpenKeyset, adLockOptimistic rs.Find "都道府県 = '大阪府'" If rs.EOF Then Beep MsgBox "見つかりませんでした。" Else Debug.Print rs!顧客ID, rs!氏名, rs!都道府県 End If End Sub
カレントレコード以降を検索する †
Findメソッドはカレントコードから検索を開始して、最初に見つけたコードをカレントコードにします。
続けて次のレコードを検索するには、skiprows引数を1にしてください。
- 例1
Public Sub adoFindNext() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim criteria As String Set cn = CurrentProject.Connection rs.Open "T_顧客", cn, adOpenKeyset, adLockOptimistic criteria = "都道府県 = '大阪府'" rs.Find criteria, 0 Do Until rs.EOF If rs.EOF Then Else Debug.Print rs!顧客ID, rs!氏名, rs!都道府県 rs.Find criteria, 1 End If Loop rs.Clone: Set rs = Nothing: cn.Close: Set cn = Nothing End Sub
レコードを抽出する方法 †
RecordsetオブジェクトのFilterプロパティに抽出条件を設定すると、その条件を満たすレコードだけを抽出する事ができます。
- 書式
recordset.Filter = criteria recordset :開いているRecordsetオブジェクト criteria :レコードを検索する条件
抽出条件の書き方 †
演算子 | 意味 | 例 | 例の意味 |
= | 等しい | "都道府県 = '東京都'" | [都道府県]フィールドが[東京都] |
<> | 等しくない | "都道府県 <> '東京都'" | [都道府県]フィールドが[東京都]以外 |
< | より小さい | "生年月日 < #01/01/1960#" | [生年月日]フィールドが[1960/01/01]よりも前 |
より大きい | "生年月日 > #01/01/1960#" | [生年月日]フィールドが[1960/01/01]よりも後 | |
<= | 以下 | "単価 <= 10000" | [単価]フィールドが10000以下 |
>= | 以上 | "単価 >= 10000" | [単価]フィールドが10000以上 |
Like | 文字パターン | "フリガナ Like 'ア*'" | [フリガナ]フィールドが[ア]で始まる |
Between・・・And | 範囲 | "生年月日 Between #01/01/1960# And #12/31/1960# | [生年月日]フィールドが1960年1月1日〜1960年12月31日 |
- 例1
Public Sub adoFilter() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Set cn = CurrentProject.Connection rs.Open "T_顧客", cn, adOpenKeyset, adLockOptimistic rs.Filter = "都道府県 ='大阪府'" Do Until rs.EOF Debug.Print rs!顧客ID, rs!氏名, rs!都道府県 rs.MoveNext Loop rs.Clone: Set rs = Nothing: cn.Close: Set cn = Nothing End Sub
日付/時刻フィールドを使って抽出 †
日本とアメリカでは、日付の書式が異なります。
01/02/03 日本:2001年2月3日 01/02/03 アメリカ:2003年1月2日
このような不具合を解決するために、Format関数を使います。
- 書式
retvalue = Format(expression, format) retvalue :戻り値 expression :書式を変換する日付 format :表示書式指定文字 yy :西暦下2けた yyyy :西暦4けた g :年号の頭文字 gg :年号の先頭1文字 ggg :年号 ee :年号に基づく和暦の年(1桁の場合は先頭に0が付く) mm :月(1桁の場合は先頭に0が付く) dd :日(1桁の場合は先頭に0が付く) / :日付の区切り記号
フィルタを解除する †
RecodsetオブジェクトのFilterプロパティにadFilterNoneを代入すると、フィルタを解除して、もとのレコードセットを取得する事ができます。
- 書式
recordset.Filter = adFilterNone
複数の条件でレコードを抽出する †
「AかつB」「AまたはB」という条件でレコードを抽出するには、And演算子またはOr演算子を使って条件を作成します。
- 例1
[生年月日]フィールドが「1970年1月1日以降」で[性別]フィールドが「1」のレコードを抽出する。recordset.Filter = "(生年月日 >= #01/01/1970) Adn (性別 = 1)"
- 例2
[都道府県]フィールドが「東京都」または「大阪府」のレコードを抽出する。
recordset.Filter = "(都道府県 = '東京都') Or (都道府県 = '大阪府')"
レコードを並び替える方法 †
RecordsetオブジェクトのSortプロパティを設定すると、指定したフィールドの値を使って、レコードセット内のレコードを並べ替える事ができます。
- 書式
recordset.Sort = sortorder recordset :開いているRecordsetオブジェクト sortorder :並べ替え順序 ASC 昇順で並べ替え DESC 降順で並べ替え
- 例1
[生年月日]フィールドを使って昇順で並べ替えるrecordset.Sort = "生年月日 ASC" recordset.Sort = "生年月日"
並べ替えを指定できるレコードセット †
RecordsetオブジェクトのSortプロパティは、CursorLocationプロパティの値がadUseClientのレコードセットだけで設定可能です。
このプロパティがadUseServerの場合、レコードを並べ替えることはできません。
Accessデータベースに接続して取得したレコードセットは、CursorLocationプロパティがadUseServerになります。
レコードを並べ替えるには、RecordsetオブジェクトのCursorLocationプロパティをadUseClientに設定してから、Openメソッドを実行してレコードを取得する必要があります。
- 例1
並べ替え可能なレコードセットを取得する。recordset.CursorLocation = adUseClient recordset.Open "T_顧客", connection, adOpenKeyset, adLockOptimistic
Public Sub adoSort() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Set cn = CurrentProject.Connection rs.CursorLocation = adUseClient rs.Open "T_顧客", cn, adOpenKeyset, adLockOptimistic rs.Filter = "都道府県 ='大阪府'" rs.Sort = "生年月日" Do Until rs.EOF Debug.Print rs!顧客ID, rs!氏名, rs!都道府県, Format(rs!生年月日, "GGgyy年mm月dd日") rs.MoveNext Loop rs.Clone: Set rs = Nothing: cn.Close: Set cn = Nothing End Sub
並べ替えを解除する †
Sortプロパティの長さ0の文字列を指定すると、並べ替えを解除して、元のレコードセットに戻すことができます。
- 例1
recordset.Sort = ""
複数のフィールドに並べ替えを設定する †
複数のフィールドを使って並べ替える場合は、並べ替え順序をカンマ(,)で区切って指定してください。
この場合は、先に指定した並べ替え順序が優先されます。
- 例1
[性別]フィールドで昇順に並べ替えた後、[生年月日]フィールドで降順に並べ替える
recordset.Sort = "性別 ASC, 生年月日 DESC"