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

VBA_Access

DAO

レコードの抽出

レコード検索の際に使用するSeekメソッドとFind系メソッドは該当データの抽出は行いますが、新たにレコードセットを作成することはできません。
RecordsetオブジェクトのFilterプロパティを使用すると、データ抽出後のRecordsetオブジェクトを新たに作成することができます。よって、Seekメソッド、Find系メソッドは該当するレコードを1つだけしか抽出できませんが、Filterメソッドは複数のレコードを抽出することができます。
Filterプロパティがダイナセットタイプとスナップショットタイプのみの使用で、テーブルセットでは使用できません。

◆ Filterメソッド

【書式】 レコードセット変数.filter = 抽出条件

  • 抽出条件:比較演算子などを用いて、抽出したい条件を指定

完全一致検索

一字一句、その名称が合致したレコードだけを抽出します。

以下のような「名前テーブル」を作成しておきます。このレコードセットの中から[性別]が「男」であるレコードのみを抽出して新たなレコードセットを作成します。

《 記述例 》

次のように記述します。

	Sub レコード抽出()
		Dim db As DAO.Database
		Dim rs As DAO.Recordset
		Dim strMsg As String

		Set db = CurrentDb()
		Set rs = db.OpenRecordset("名前テーブル", dbOpenDynaset)

		rs.Filter = "性別 = '男'"

		Set rs = rs.OpenRecordset()

		Do Until rs.EOF
			strMsg = strMsg & vbNewLine & rs!NO & ":" & rs!名前 & ":" & rs!性別
			rs.MoveNext
		Loop

		MsgBox "該当者" & vbNewLine & strMsg

		rs.Close: Set rs = Nothing
		db.Close: Set db = Nothing
	End Sub
    

実行すると男性のみのレコードが抽出されて、新しいレコードセットが作成されます。

【※ 該当レコードがない場合】

Filterプロパティを使用してレコードを抽出しようとしても、該当するレコードが全くない場合があります。この場合は空のレコードセットが作成されますが、事前にレコードの有無を調べるには、RecordCountプロパティを使います。

《 記述例 》

先ほどのプロシージャに該当するレコードがない場合の処理は以下のように追加記述します。(太字)

	Sub レコード抽出()
		Dim db As DAO.Database
		Dim rs As DAO.Recordset
		Dim strMsg As String

		Set db = CurrentDb()
		Set rs = db.OpenRecordset("名前テーブル", dbOpenDynaset)
    
		rs.Filter = "性別 = '男性'"
    
		Set rs = rs.OpenRecordset()

		If rs.RecordCount = 0 Then
			MsgBox "該当するレコードは存在しません"
			End
		End If

		Do Until rs.EOF
			strMsg = strMsg & vbNewLine & rs!NO & ":" & rs!名前 & ":" & rs!性別
			rs.MoveNext
		Loop

		MsgBox "該当者" & vbNewLine & strMsg

		rs.Close: Set rs = Nothing
		db.Close: Set db = Nothing
	End Sub
    

IfステートメントでRecordCountプロパティが「0」を返した時、メッセージを表示させてプロシージャを終了します。

レコードの抽出(あいまい条件)

抽出する条件にあいまいさを含んだレコードを抽出するには、Like演算子を組み合わせて使用します。
例えば、[名前]フィールドのレコード内に漢字の「森」が含まれる名前を抽出する場合は、以下のように記述します。

   Recordset.Filter = "名前 Like '*森*'"

◆ Like演算子で使える文字列パターン
文字列パターン 説明
? 1文字を表す
* 任意の文字数を表す
# 任意の1文字の数字を表す
[mojiretu] mojiretuの中の1文字
[!mojiretu] mojiretu以外の1文字
《 記述例 》

「名前テーブル」のレコードの中から[名前]に「森」の文字が含まれているレコード抽出するには、次のような記述をします。

	Sub あいまい抽出()
		Dim db As DAO.Database
		Dim rs As DAO.Recordset
		Dim strData As String

		Set db = CurrentDb()
		Set rs = db.OpenRecordset("名前テーブル", dbOpenDynaset)

		rs.Filter = "名前 like '*森*'"
    
		Set rs = rs.OpenRecordset()

		Do Until rs.EOF
			strData = strData & vbNewLine & rs!NO & ":" & rs!名前 & _
				":" & rs!性別
			rs.MoveNext
		Loop

		MsgBox "該当者" & vbNewLine & strData

		rs.Close: Set rs = Nothing
		db.Close: Set db = Nothing
	End Sub
    

動作を確認すると、[名前]に「森」の文字が含まれるレコードが表示されます。

【※ Like演算子の使用例】
説明
Like "あ*" 「あ」で始まる文字列
Like "*子" 「子」の漢字で終わる文字列
Like "[ア-カ]*" 「ア」から「カ」で始まる文字列
Like "*山*" 「山」という漢字が含まれている文字列
Like "??県" 先頭に2文字が含まれる県名

レコードの並べ替え

データベース機能には並べ替えがありますが、この並べ替えはテーブルタイプとダイナセット、スナップショットタイプとは異なります。
テーブルタイプの場合は、並べ替えを行うフィールドに事前にインデックスを作成しておく必要がありますが、ダイナセットタイプ、スナップショットタイプはインデックスを作成する必要はありません。

テーブルタイプの並べ替え

テーブルタイプのレコードセットで並べ替えを行うには、Indexプロパティを使ってインデックスを設定する必要があります。
主キーが設定されているフィールドは自動的にインデックスが設定されますが、それ以外のフィールドで並べ替えを行うには、インデックスを事前に設定しておきます。
ここでは、[名前テーブル]に年齢と血液型のフィールドを新たに設けたものを利用します。

インデックスの事前設定は、2007バージョンであれば[名前テーブル]をデザインビューで開き、[デザイン]タブの[表示/非表示]グループの[インデックス]ボタンをクリックします。
ここでは、インデックス名とフィールド名に[年齢]フィールドを追加して、並べ替え順序を「昇順」に設定します。

《 記述例 》

年齢を昇順にして並べ替えるには以下のように記述します。

  Sub テーブルタイプ並べ替え()
  	Dim db As DAO.Database
  	Dim rs As DAO.Recordset
  	Dim strData As String

  	Set db = CurrentDb()
  	Set rs = db.OpenRecordset("名前テーブル", dbOpenTable)
  
  	rs.Index = "年齢"

  	Do Until rs.EOF
  		strData = strData & vbNewLine & rs!No & ":" & rs!名前 & ":" & rs!性別
  		If delOK = vbOK Then
  		strData = strData & ":" & rs!年齢 & ":" & rs!血液型
  		rs.MoveNext
  	Loop

	MsgBox "並べ替え:年齢で昇順" & vbNewLine & strData

  	rs.Close: Set rs = Nothing
  	db.Close: Set db = Nothing
  End Sub
    

動作を確認すると年齢の若いレコードから並べ替えられていることが確認できます。

ダイナセット、スナップショットタイプの並べ替え

テーブルタイプの並べ替えは、直接レコードセット内で並べ替えますが、ダイナセットタイプは昇順、降順の設定を行った新しいレコードセットを作成する必要があります。
レコードタイプがダイナセット、スナップショットタイプの場合は、Sortプロパティを使用します。そして、事前にインデックスを作成する必要はありません。

◆ Sortプロパティ

Sortプロパティに設定する値は、並べ替えに使うフィールド名と並べ替えを表すキーワードになります。昇順の場合は「ASC」、降順の場合は「DESC」のキーワードを使用します。

【書式】 レコードセット.Sort = 並べ替え順

また、Sortプロパティを実行した後は、RecordsetオブジェクトのOpenRecordsetメソッドを実行して、Recordsetオブジェクトを取得し直す必要があります。

《 記述例 》

ダイナセットタイプのレコードタイプを使って、年齢を降順にするには以下のように記述します。

  Sub ソートで並べ替え()
  	Dim db As DAO.Database
  	Dim rs As DAO.Recordset
  	Dim strData As String

  	Set db = CurrentDb()
  	Set rs = db.OpenRecordset("名前テーブル", dbOpenDynaset)
  
  	rs.Sort = "年齢 DESC"
	Set rs = rs.OpenRecordset()

  	Do Until rs.EOF
  		strData = strData & vbNewLine & rs!No & ":" & rs!名前 & ":" & rs!性別
  		strData = strData & ":" & rs!年齢 & ":" & rs!血液型
  		rs.MoveNext
  	Loop

	MsgBox "Sort並べ替え:年齢を降順" & vbNewLine & strData

  	rs.Close: Set rs = Nothing
  	db.Close: Set db = Nothing
  End Sub
    

年齢が降順になって並べ替えられるのが確認できます。

もし、「rs.Sort = "年齢 DESC"」の部分の並べ替えのキーワードを省略して「rs.Sort = "年齢"」とした場合は、昇順が既定値として設定されます。