トップ > スキル : アプリケーション > VBA for Access > 応用編(データベースオブジェクト DAOとADO)
レコードの並び替え
レコードセット内のレコードを昇順または、降順に並び替えるには、RecordsetオブジェクトのSortプロパティを使用します。但し、RecordsetオブジェクトのCursorLocationプロパティの値がadUseCientである時のみ、並べ替えができます。
通常、テーブルやクエリを用いたRecordsetオブジェクトはCursorLocationプロパティの値がadUseServerになっているので、レコードの並べ替えはできません。そこで、Openメソッドを用いてRecordsetオブジェクトを開く前にCursorLocationプロパティの値を設定する必要があります。
◆ Sortプロパティ
【書式】
Recordsetオブジェクト.Sort = "フィールド名 並び替えの指定"
- フィールド名:Recordsetオブジェクトに含まれるフィールドの名前
- 並び替えの指定:昇順はASCキーワード、降順はDESCキーワードを使用
並べ替えの基準を1つ指定
《 記述例 》
テーブル「T_売上」の金額を昇順で並べ替えるには次のように記述します。昇順の場合は、Sortプロパティの並べ替え定数は省略できます。
Sub 並べ替え1() Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Dim strData As String Set cn = CurrentProject.Connection Set rs = New ADODB.Recordset rs.CursorLocation = adUseClient rs.Open "T_売上", cn, adOpenKeyset, adLockOptimistic rs.Sort = "金額" Do Until rs.EOF strData = strData & vbNewLine & rs!商品名 & vbTab & ":\" strData = strData & Format(rs!金額, "#,##0") rs.MoveNext Loop MsgBox "金額で昇順に並べ替えた結果" & vbNewLine & strData rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub
動作を確認すると、上から金額の少ない方から並んで表示されます。

並べ替えの基準を複数指定
並べ替えは複数指定することができます。
《 記述例 》
テーブル「名前テーブル」の年齢を降順、血液型を昇順で並べ替えるには、以下のように記述します。
Sub 並べ替え2() Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Dim strData As String Set cn = CurrentProject.Connection Set rs = New ADODB.Recordset rs.CursorLocation = adUseClient rs.Open "名前テーブル", cn, adOpenKeyset, adLockOptimistic rs.Sort = "年齢 DESC,血液型 ASC" Do Until rs.EOF strData = strData & vbNewLine & rs!名前 & ":" strData = strData & rs!性別 & vbTab & rs!年齢 & vbTab & rs!血液型 rs.MoveNext Loop MsgBox "年齢は降順、血液型は昇順で並べ替え" & vbNewLine & strData rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub
動作を確認すると、年齢は降順にして、次に血液型を基準に昇順に並べ替えた結果を表示します。
※ 並べ替えが分かるように、年齢の同じ人がいるように年齢を変えています。

パラメータクエリを使う
ADOでパラメータクエリを実行するには、CreateParameterメソッドを使用します。パラメータクエリは、入力を促すダイアログボックスが表示させることになるので、InputBox関数で代用する必要があります。
◆ CreateParameterメソッド
【書式】
Set parameter = command.CreateParameter(Name,Type,Direction,Size,Value)
- Name:Parameterオブジェクト名を含む文字列型の値を指定
- Type:Parameterオブジェクトのデータ型を指定
- Direction:Parameterオブジェクトの種類を指定します。
- Size:パラメータ値の最大文字数またはバイト数で指定
- Value:Parameterオブジェクトの値を指定するバリアント型の値
Directionの定数
定数 | 値 | 説明 |
adParamInput | 1 | 既定値で、入力パラメータであることを表す |
adParamOutput | 2 | 出力パラメータであることを表す |
adParamInputOutput | 3 | 入出力パラメータであることを表す |
adParamReturnValue | 4 | パラメータが戻り値であることを表す |
adParamUnknown | 0 | パラメータの使用方法が不明であることを表す |
《 記述例 》
テーブル「名前テーブル」のレコードセットから性別と年齢の2つをユーザに入力させて、その2つの条件からレコードを抽出するには以下のように記述します。
Sub パラメータクエリ() Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Dim cmd As New ADODB.Command Dim param As ADODB.Parameter Dim mySQL As String Dim strData1 As String Dim strData2 As String Dim strBack As String Dim msgData As String strData1 = "性別を入力してください" strData2 = "年齢を入力してください" mySQL = "SELECT * FROM 名前テーブル WHERE 性別=" & strData1 & _ " AND 年齢=" & strData2 Set cn = CurrentProject.Connection Set cmd.ActiveConnection = cn With cmd .CommandText = mySQL .CommandType = adCmdText .Prepared = True End With Set param = New ADODB.Parameter Set param = cmd.CreateParameter("性別", adVarChar, adParamInput, 5) cmd.Parameters.Append param strBack = InputBox(Trim(strData1)) cmd.Parameters("性別") = strBack Set param = cmd.CreateParameter("年齢", adInteger, adParamInput, 2) cmd.Parameters.Append param strBack = InputBox(Trim(strData2)) cmd.Parameters("年齢") = strBack Set rs = New ADODB.Recordset Set rs = cmd.Execute If rs.RecordCount = 0 Then Exit Sub Do Until rs.EOF msgData = msgData & vbNewLine & rs!No & ":" & rs!名前 & ":" & rs!性別 msgData = msgData & ":" & rs!年齢 & ":" & rs!血液型 rs.MoveNext Loop If msgData = "" Then MsgBox "該当するレコードなし": Exit Sub MsgBox "レコードの抽出は" & vbNewLine & msgData Set cmd = Nothing rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub
動作を確認すると、まず性別を促す入力ダイアログボックスが表示されます。任意の性別を入力して[OK]ボタンをクリックします。

続いて、年齢を入力するダイアログボックスが表示されます。任意の年齢を入力して[OK]ボタンをクリックします。

該当するレコードが見つかるとメッセージボックスで表示されます。

もし、該当するレコードがなかった場合は該当するレコードがなかったというメッセージが表示されます。

まとめ
ADOは外部データベースとの接続を行い、さまざま処理を行うことができます。基本的な手順を覚えておくことで、だいたいの処理は記述することができます。DAOも、プログラムの基本の流れを覚えておけば、ローカルなデータベースを自由に扱うことができます。
実際にテーブルやクエリを視覚的に確認しながら、処理を行う方が理解はしやすいですが、VBAでしか実現できない場面で多用されています。やみくもに何でもVBAで作成するということはAccessの良さを知らないと言っても過言ではありません。まずは、AccessでできることはすべてAccessのオブジェクトを駆使して作成し、自動化や通常ではできない処理をVBAで作成することが賢い利用方法と言えます。