トップ > スキル : アプリケーション > VBA for Access > 応用編(データベースオブジェクト DAOとADO)

VBA_Access

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で作成することが賢い利用方法と言えます。