AccessVBA/ADO の変更点
*ADOオブジェクト [#d5321057]
データベースを操作する為に、9つのオブジェクトが用意されています。
#contents
|オブジェクト|内容|h
|Connection|データベースの接続情報|
|Command|SQLステートメント|
|Parameter|クエリのパラメータ|
|Recordset|レコードセット|
|Field|レコードセットに含まれるフィールド|
|Error|接続で発生したエラー|
|Property|ADOオブジェクトのプロパティ|
|Record|ディレクトリまたはファイル|
|Stream|ファイルの内容|
**ADOオブジェクトを利用する。 [#ia7db5b5]
-オブジェクト変数の宣言
Visual Basicの他の変数と同じように、Dim・Static・Private・Publicステートメントを使って宣言します。
書式
Dim オブジェクト変数名 As クラス
例
Dim cn As ADODB.Connection
**オブジェクトへの参照を割り当てる [#jc53c7d6]
書式
Set オブジェクト変数名 = [New] クラス
-新規Connectionオブジェクトへの参照を代入
Dim cn As ADODB.Connection
Set cn = New ADODB.Connection
-新規オブジェクトへの参照を代入する場合は、オブジェクト変数の宣言にまとめる事ができる。
Dim cn As New ADODB.Connection
**データベースに接続する方法 [#zb4a62f9]
プログラムでデータベースを操作するには、最初に操作の対象となるデータベースに接続しなければなりません。~
ことときに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オブジェクトを利用するときは、処理速度が遅くなるので注意しましょう。~
***メモリから完全にこの領域を削除するには [#m64941ef]
-書式
Set オブジェクト変数名 = Nothing
**カレントデータベースに接続する。 [#a3baa6a4]
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データベースに接続する。 [#ke85dc03]
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
**いろいろなデータベースに接続する。 [#n75ef7b0]
接続するデータベースの種類によって、接続情報文字列に設定するキーワードは異なります。
-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ファイルに接続) [#l27fdf92]
-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
**レコードセットを取得する [#z7bf1ccf]
テーブルに登録されているレコードや、クエリを実行して取得したレコードの集まりを管理するのは、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
***カーソルタイプとは [#z7e223e4]
他のユーザからの参照範囲を制御する機能をカーソルと呼びます
-前方専用カーソル~
レコードセットの先頭から最終方向に向かって、カレントコードを移動します。~
その逆の移動はできません。このタイプのレコードセットでは、他のユーザが行った編集(レコードの追加、編集、削除)の結果は表示されません。
-キーセットカーソル~
レコードセット内のすべての方向にカレントレコードを移動することができます。~
このタイプのレコードセットでは、たのユーザが追加したレコードや削除したレコードにはアクセスできません。~
他のユーザが編集したレコードは表示されます。
-動的カーソル~
レコードセット内のすべての方向に、カレントレコードを移動する事ができます。~
このタイプのレコードセットでは、他のユーザが行った編集結果が表示されます。
-静的カーソル~
レコードセット内のすべての方向にカレントコードを移動する事ができます。~
このタイプのレコードセットでは、他のユーザが行った編集結果は表示されません。
**テーブルからデータを取得する [#b1e17dc8]
-書式
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
**レコードセットの機能を調べる [#tb595a7c]
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
**カレントコードを移動する方法 [#p669703f]
レコード内でカレントコードを移動することが出来ます。
-書式
recordset.MoveFirst 先頭レコードに移動
recordset.MovePrevious 1つ前のレコードに移動
recordset.MoveNext 次のレコードに移動
recordset.MoveLast 最終レコードに移動
***全てのレコードにアクセスする [#k348f6a5]
-例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
**選択クエリを使ってレコードセットを取得する [#fa2e26bc]
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
**レコードセットのブックマーク [#o9bda646]
取得したレコードが空でなければ、必ずカレントコードが存在します。~
カレントコードの位置を管理しているのが、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
***「ブックマークをサポートしていない」というエラーが発生 [#ae468532]
RecordオブジェクトのOpenメソッドでcursortype引数を省略すると、CursorTypeプロパティの値がadForwardOnlyのレコードセットになります。~
このタイプのレコードセットは、ブックマークをサポートしていません。
**レコードセット内のレコード数を調べる [#l4d42fd5]
recordset.RecordCount
-レコードセットのカーソルタイプによっては、レコード数を取得できません。~
「adOpenForwardOnly」ではRecordCountプロパティはつねに「-1」になります。~
「adOpenDynamic」もレコードソースによっては「-1」になります。
**カレントレコードを編集する [#a0d0f8aa]
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メソッド>#tb595a7c]]を使って確認する。
retvalue = recordset.Supports(adUpdate)
**フィールドを1つだけ更新する [#x825b3fd]
-例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
**複数のフィールドを更新する。 [#id46fa99]
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処理) [#hf225314]
フィールドに値を代入してから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
**レコードを追加する方法 [#y6da8cd3]
RecordオブジェクトのAddNewメソッドを利用すると、レコードセットに新規レコードを追加する事ができます。
-書式
recordset.AddNew fields, values
recordset :開いているRecordsオブジェクト
fields :(省略可能)編集するフィールド名
values :(省略可能)フィールドに代入する値
***追加したレコードに値を代入する [#qf5d9ba1]
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
**レコードを削除する方法 [#qc869168]
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
***レコードを削除するタイミング [#x7a6424a]
RecordsetオブジェクトのLockTypeプロパティの値がadLockOptimisticの場合は、Deleteメソッドを実行した時にレコードが削除されます。レコードを戻すことはできません。~
LockTypeプロパティの値がadLockBatchOptimisticの場合は、UpdateBatchメソッドを実行したときに初めて削除されます。~
また、Deleteメソッドを実行した後でも、CancelBatchメソッドを実行すると削除したレコードを戻す事ができます。
-書式
recordset.UpdateBatch
recordset.CancelBatch
**レコードを検索する方法 [#c3517e62]
RecordsetオブジェクトのFindメソッドを利用すると、指定した条件を満たすレコードを検索する事ができます。~
レコードが見つかったときは、そのレコードがカレントコードになります。
-書式
recordset.Find criteria, skiprows, searchdirection, start
recordset :開いているRecordsetオブジェクト
criteria :レコードを検索する条件
skiprows :(省略可)読み飛ばすレコード数
searchdirection :(省略可)検索方向
adSearchBackward :先頭レコードに向かって検索
adSearchForward :最終レコードに向かって検索(既定値)
start :(省略可)検索開始位置
-例
recordset.Find "都道府県 = '大阪府'"
***検索条件の書き方 [#ha89d6ba]
|演算子|意味|例|例の意味|h
|=|等しい|"都道府県 = '東京都'"|[都道府県]フィールドが[東京都]|
|<>|等しくない|"都道府県 <> '東京都'"|[都道府県]フィールドが[東京都]以外|
|<|より小さい|"生年月日 < #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
***カレントレコード以降を検索する [#wdd99f52]
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
**レコードを抽出する方法 [#b689500d]
RecordsetオブジェクトのFilterプロパティに抽出条件を設定すると、その条件を満たすレコードだけを抽出する事ができます。
-書式
recordset.Filter = criteria
recordset :開いているRecordsetオブジェクト
criteria :レコードを検索する条件
***抽出条件の書き方 [#a0818a4d]
|演算子|意味|例|例の意味|h
|=|等しい|"都道府県 = '東京都'"|[都道府県]フィールドが[東京都]|
|<>|等しくない|"都道府県 <> '東京都'"|[都道府県]フィールドが[東京都]以外|
|<|より小さい|"生年月日 < #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
***日付/時刻フィールドを使って抽出 [#v36e63f2]
日本とアメリカでは、日付の書式が異なります。~
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が付く)
/ :日付の区切り記号
***フィルタを解除する [#i2298984]
RecodsetオブジェクトのFilterプロパティにadFilterNoneを代入すると、フィルタを解除して、もとのレコードセットを取得する事ができます。
-書式
recordset.Filter = adFilterNone
***複数の条件でレコードを抽出する [#gfa10695]
「AかつB」「AまたはB」という条件でレコードを抽出するには、And演算子またはOr演算子を使って条件を作成します。
-例1~
[生年月日]フィールドが「1970年1月1日以降」で[性別]フィールドが「1」のレコードを抽出する。
recordset.Filter = "(生年月日 >= #01/01/1970) Adn (性別 = 1)"
-例2
[都道府県]フィールドが「東京都」または「大阪府」のレコードを抽出する。
recordset.Filter = "(都道府県 = '東京都') Or (都道府県 = '大阪府')"
**レコードを並び替える方法 [#kc92c26e]
**レコードを並び替える方法 [#w20566bb]
RecordsetオブジェクトのSortプロパティを設定すると、指定したフィールドの値を使って、レコードセット内のレコードを並べ替える事ができます。
-書式
recordset.Sort = sortorder
recordset :開いているRecordsetオブジェクト
sortorder :並べ替え順序
ASC 昇順で並べ替え
DESC 降順で並べ替え
-例1~
[生年月日]フィールドを使って昇順で並べ替える
recordset.Sort = "生年月日 ASC"
recordset.Sort = "生年月日"
***並べ替えを指定できるレコードセット [#h09b5ea5]
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
***並べ替えを解除する [#w151cbbc]
Sortプロパティの長さ0の文字列を指定すると、並べ替えを解除して、元のレコードセットに戻すことができます。
-例1
recordset.Sort = ""
***複数のフィールドに並べ替えを設定する [#pf9ea224]
複数のフィールドを使って並べ替える場合は、並べ替え順序をカンマ(,)で区切って指定してください。~
この場合は、先に指定した並べ替え順序が優先されます。
-例1
[性別]フィールドで昇順に並べ替えた後、[生年月日]フィールドで降順に並べ替える
recordset.Sort = "性別 ASC, 生年月日 DESC"