■ ADOレコードセットを操作しよう!2
レコードを検索する
レコードセットから指定した条件のレコードを検索し、カレントレコードにします。
検索したレコードがレコードセットの中に存在しないときは、BOFまたはEOFプロパティがTRUEになり、カレントレコードは未定義になります。
書式: Recordset.Find 検索条件, SkipRows, SearchDirection, Start
Recordset |
開いているレコードセットオブジェクト |
検索条件 |
比較演算子を用いて検索する列と、検索させる値を文字列で指定します。比較演算子にlikeを使用したり、文字列%を含めると、曖昧検索をすることができます。 |
SkipRows |
検索の実行時に読み飛ばすレコードの数を指定します。この引数を省略すると、カレントレコードから検索を行います。 |
SearchDirection |
adSearchBackward |
後方検索し、レコードセットの先頭で終了します。一致するレコードが見つからない場合、カーソルはBOFに移動します。(カーソルタイプがadOpenForwardOnlyの場合は使用できません) |
adSearchForward |
前方検索し、レコードセットの末尾で終了します。一致するレコードが見つからない場合、カーソルはEOFに移動します。 |
Start |
検索開始位置を指定します。省略した場合はカレントレコードから検索を開始します。 |
例:
次の例ではSyainNAMEが"山田 太郎"のレコードを検索します。
RS.Find "SyainNAME = '山田 太郎'"
次の例ではSyainNAMEが"山田"で始まるレコードを検索します。
RS.Find "SyainNAME Like '山田%'"
比較演算子を用いて検索することも可能です。
RS.Find "Kinzoku < 10"
次の例ではレコードセットの中から"山田"で始まるレコードを全て検索し、出力します。
最初のレコードはSkipRows引数に0を指定して実行しますが、2件目以降のレコードではSkipRows引数に1を指定し、カレントレコードの次から検索させています。
For i=1 To RS.RecordCount
If i=1 Then
RS.Find "SyainNAME Like '山田%'", 0, adSearchForward
Else
RS.Find "SyainNAME Like '山田%'", 1, adSearchForward
End If
If Not RS.EOF Then
Debug.Print RS.Fields("SyainID") & "/" & RS.Fields("SyainNAME")
End If
Next i
※ If Not RS.EOF Then を記述しないと、検索して見つからなかった場合に「要求された操作には現在のレコードが必要です」とエラーが表示されます。
※ OLEプロバイダやカーソルの種類がRecordCountをサポートしていない場合には、RecordCountプロパティは"-1"を返します。
※ RecordCountプロパティは、静的カーソルまたはキーセットカーソルでは実際の数を返しますが、前方スクロールタイプのカーソルでは"-1"を返します。
レコードを抽出する
Filterプロパティを設定することで、指定した条件のレコードを抽出することができます。
抽出されたレコード件数は、RecordCountプロパティの値で取得できます。
書式: Recordset.Filter = 抽出条件
Recordset |
開いているレコードセットオブジェクト |
抽出条件 |
抽出する条件を表した文字列。比較演算子を用いて抽出する列と、抽出させる値を文字列で指定します。 |
例:
次の例ではSyainNAMEが"山田 太郎"のレコードを抽出します。
RS.Filter "SyainNAME = '山田 太郎'"
次の例ではSyainNAMEが"山田"で始まるレコードを抽出します。
RS.Filter "SyainNAME Like '山田%'"
比較演算子を用いて抽出することも可能です。
RS.Filter "Kinzoku < 10"
次の例では、勤続年数が10年以上、20年未満のレコードを抽出し、全て出力しています。
RS.Filter = "(Kinzoku >= 10) And (Kinzoku < 20)"
If RS.RecordCount = 0 Then
MsgBox "該当するレコードは存在しません"
Else
Do
Debug.Print RS.Fields("SyainID") & "/" & RS.Fields("SyainNAME")
RS.MoveNext
Loop Until RS.EOF
End If
レコードセットのフィルタを解除するには、adFilterNone定数または長さ0の文字列を代入します。
次の例はどちらもレコードセットのフィルタを解除します。
RS.Filter = adFilterNone
RS.Filter = ""
レコードを並べ替える
並べ替えが可能なレコードセットを取得するには、次のようにレコードセットオブジェクトを開く前にCursorLocationプロパティの値を"adUseServer"から"adUseClient"に変更する必要があります。
RS.CursorLocation = adUseClient
RS.Open SQL,CN,adOpenKeyset,adLockOptimistic
書式: Recordset.Sort = 並替条件
Recordset |
開いているレコードセットオブジェクト |
並替条件 |
並べ替えるフィールドと並べ替え順序。並べ替えに使用するフィールド名と並べ替え順序を表すキーワードを文字列で指定します。
昇順に並べ替えるときはASCを、降順に並べ替えるときはDESCキーワードを使用します。(デフォルトでASC)
また、複数のフィールドで並べ替えを行うにはフィールドを","で区切って指定します。この場合、先に指定したフィールドが優先されます。 |
例:
次の例ではレコードセットのレコードを勤続年数の少ない順に並べ替えます。
RS.Sort ="Kinzoku ASC"
次の例ではレコードセットのレコードを勤続年数の少ない順に、さらにSyainIDの順に並べ替えます。
RS.Sort ="Kinzoku ASC,SyainID ASC"
次の例では、行った並べ替えを解除しています。
RS.Sort =""
CloseメソッドとSet 〜 Nothing
最後にレコードセットオブジェクトを閉じるCloseメソッドと、メモリを消去するSet 〜 Nothing を説明します。
Closeメソッドはオブジェクトを閉じます。オブジェクトを閉じてもメモリからは削除されません。再びOpenメソッドで開くことができます。
メモリ上から完全に削除するには、オブジェクト変数にNothing を代入してやる必要があります。Nothingを代入すると、その変数とオブジェクトの関係を無効にし、使用していたメモリ上の領域を開放します。
例:
次の例では、レコードセットを閉じメモリをクリアした後、コネクションを閉じてメモリをクリアしています。
RS.Close
Set RS = Nothing
CN.Close
Set CN = Nothing
以上、ADOオブジェクト操作の代表的なものについて紹介しました。この他にもADOオブジェクトにたいするメソッドは存在しますが、利用頻度の高いものを優先的に解説しました。
SQLステートメントとADOオブジェクト操作をマスターすれば、ExcelVBAからデータベースを自由自在に操作できます。
もちろん、今回ご紹介した内容はAccessVBA、VB6.0でも共通して使用できます。
ぜひ、お役立てください。
|