AccessVBA/ADO

ADOオブジェクト

データベースを操作する為に、9つのオブジェクトが用意されています。

オブジェクト内容
Connectionデータベースの接続情報
CommandSQLステートメント
Parameterクエリのパラメータ
Recordsetレコードセット
Fieldレコードセットに含まれるフィールド
Error接続で発生したエラー
PropertyADOオブジェクトのプロパティ
Recordディレクトリまたはファイル
Streamファイルの内容

ADOオブジェクトを利用する。

  • オブジェクト変数の宣言

Visual Basicの他の変数と同じように、Dim・Static・Private・Publicステートメントを使って宣言します。

書式

Dim オブジェクト変数名 As クラス

Dim cn As ADODB.Connection

オブジェクトへの参照を割り当てる

書式

Set オブジェクト変数名 = [New] クラス
  • 新規Connectionオブジェクトへの参照を代入
    Dim cn As ADODB.Connection
    Set cn = New ADODB.Connection
  • 新規オブジェクトへの参照を代入する場合は、オブジェクト変数の宣言にまとめる事ができる。
    Dim cn As New ADODB.Connection

データベースに接続する方法

プログラムでデータベースを操作するには、最初に操作の対象となるデータベースに接続しなければなりません。
ことときにConnectionオブジェクトを利用します。

  1. ConnectionオブジェクトのConnectionStringプロパティを設定する。
  2. ConnectionオブジェクトのOpenメソッドを実行する。
  • ConnectionStringプロパティ

データベースへの接続情報を管理するプロパティです。
カレントデータベース以外に接続する場合は、自分で接続情報を作成する必要があります。

  • 書式
    connection.ConnectionString = "keyword1=value; keyword2=value2; ・・・"
    
    connection :開いているConnectionオブジェクト
    keyword    :接続に使うキーワード
    value      :キーワードに設定する値
  • Openメソッド

ConnectionStringプロパティに設定された接続情報を使って、データベースに接続する処理を行います。

  • 書式
    connection.Open
  • Closeメソッド

Opneメソッドを使ってデータベースに接続した後は、Closeメソッドを使ってオブジェクトを閉じてください。

  • 書式
    オブジェクト変数名.Close

connection.Close

しかし、これだけではオブジェクト参照に使った領域がメモリ上に残ったままになります。
たくさんのADOオブジェクトを利用するときは、処理速度が遅くなるので注意しましょう。

メモリから完全にこの領域を削除するには

  • 書式
    Set オブジェクト変数名 = Nothing

カレントデータベースに接続する。

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データベースに接続する。

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

いろいろなデータベースに接続する。

接続するデータベースの種類によって、接続情報文字列に設定するキーワードは異なります。

  • 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ファイルに接続)

  • DSNの作成
  1. [コントロールパネル] - [管理ツール] - [データ ソース (ODBC)]
  2. [追加]ボタンをクリック
  3. [データソースの新規作成]ダイアログ - [Driver do Microsoft Excel]を選択
  4. データソース名を「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

レコードセットを取得する

テーブルに登録されているレコードや、クエリを実行して取得したレコードの集まりを管理するのは、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

カーソルタイプとは

他のユーザからの参照範囲を制御する機能をカーソルと呼びます

  • 前方専用カーソル
    レコードセットの先頭から最終方向に向かって、カレントコードを移動します。
    その逆の移動はできません。このタイプのレコードセットでは、他のユーザが行った編集(レコードの追加、編集、削除)の結果は表示されません。
  • キーセットカーソル
    レコードセット内のすべての方向にカレントレコードを移動することができます。
    このタイプのレコードセットでは、たのユーザが追加したレコードや削除したレコードにはアクセスできません。
    他のユーザが編集したレコードは表示されます。
  • 動的カーソル
    レコードセット内のすべての方向に、カレントレコードを移動する事ができます。
    このタイプのレコードセットでは、他のユーザが行った編集結果が表示されます。
  • 静的カーソル
    レコードセット内のすべての方向にカレントコードを移動する事ができます。
    このタイプのレコードセットでは、他のユーザが行った編集結果は表示されません。

テーブルからデータを取得する

  • 書式
    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

レコードセットの機能を調べる

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

カレントコードを移動する方法

レコード内でカレントコードを移動することが出来ます。

  • 書式
    recordset.MoveFirst         先頭レコードに移動
    recordset.MovePrevious      1つ前のレコードに移動
    recordset.MoveNext          次のレコードに移動
    recordset.MoveLast          最終レコードに移動

全てのレコードにアクセスする

  • 例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

選択クエリを使ってレコードセットを取得する

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

レコードセットのブックマーク

取得したレコードが空でなければ、必ずカレントコードが存在します。
カレントコードの位置を管理しているのが、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

「ブックマークをサポートしていない」というエラーが発生

RecordオブジェクトのOpenメソッドでcursortype引数を省略すると、CursorTypeプロパティの値がadForwardOnlyのレコードセットになります。
このタイプのレコードセットは、ブックマークをサポートしていません。

レコードセット内のレコード数を調べる

recordset.RecordCount
  • レコードセットのカーソルタイプによっては、レコード数を取得できません。
    「adOpenForwardOnly」ではRecordCountプロパティはつねに「-1」になります。
    「adOpenDynamic」もレコードソースによっては「-1」になります。

カレントレコードを編集する

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メソッドを使って確認する。
    retvalue = recordset.Supports(adUpdate)

フィールドを1つだけ更新する

  • 例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

複数のフィールドを更新する。

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処理)

フィールドに値を代入してから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

レコードを追加する方法

RecordオブジェクトのAddNewメソッドを利用すると、レコードセットに新規レコードを追加する事ができます。

  • 書式
    recordset.AddNew fields, values
    
    recordset   :開いているRecordsオブジェクト
    fields      :(省略可能)編集するフィールド名
    values      :(省略可能)フィールドに代入する値

追加したレコードに値を代入する

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

レコードを削除する方法

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

レコードを削除するタイミング

RecordsetオブジェクトのLockTypeプロパティの値がadLockOptimisticの場合は、Deleteメソッドを実行した時にレコードが削除されます。レコードを戻すことはできません。
LockTypeプロパティの値がadLockBatchOptimisticの場合は、UpdateBatchメソッドを実行したときに初めて削除されます。
また、Deleteメソッドを実行した後でも、CancelBatchメソッドを実行すると削除したレコードを戻す事ができます。

  • 書式
    recordset.UpdateBatch
    recordset.CancelBatch

レコードを検索する方法

RecordsetオブジェクトのFindメソッドを利用すると、指定した条件を満たすレコードを検索する事ができます。
レコードが見つかったときは、そのレコードがカレントコードになります。

  • 書式
    recordset.Find criteria, skiprows, searchdirection, start
    
    recordset   :開いているRecordsetオブジェクト
    criteria    :レコードを検索する条件
    skiprows    :(省略可)読み飛ばすレコード数
    searchdirection  :(省略可)検索方向
                      adSearchBackward   :先頭レコードに向かって検索
                      adSearchForward    :最終レコードに向かって検索(既定値)
    start       :(省略可)検索開始位置
  • recordset.Find "都道府県 = '大阪府'"

検索条件の書き方

演算子意味例の意味
=等しい"都道府県 = '東京都'"[都道府県]フィールドが[東京都]
<>等しくない"都道府県 <> '東京都'"[都道府県]フィールドが[東京都]以外
<より小さい"生年月日 < #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

カレントレコード以降を検索する

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

レコードを抽出する方法

RecordsetオブジェクトのFilterプロパティに抽出条件を設定すると、その条件を満たすレコードだけを抽出する事ができます。

  • 書式
    recordset.Filter = criteria
    
    recordset   :開いているRecordsetオブジェクト
    criteria    :レコードを検索する条件

抽出条件の書き方

演算子意味例の意味
=等しい"都道府県 = '東京都'"[都道府県]フィールドが[東京都]
<>等しくない"都道府県 <> '東京都'"[都道府県]フィールドが[東京都]以外
<より小さい"生年月日 < #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

日付/時刻フィールドを使って抽出

日本とアメリカでは、日付の書式が異なります。

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が付く)
                /     :日付の区切り記号

フィルタを解除する

RecodsetオブジェクトのFilterプロパティにadFilterNoneを代入すると、フィルタを解除して、もとのレコードセットを取得する事ができます。

  • 書式
    recordset.Filter = adFilterNone

複数の条件でレコードを抽出する

「AかつB」「AまたはB」という条件でレコードを抽出するには、And演算子またはOr演算子を使って条件を作成します。

  • 例1
    [生年月日]フィールドが「1970年1月1日以降」で[性別]フィールドが「1」のレコードを抽出する。
    recordset.Filter = "(生年月日 >= #01/01/1970) Adn (性別 = 1)"
  • 例2 [都道府県]フィールドが「東京都」または「大阪府」のレコードを抽出する。
    recordset.Filter = "(都道府県 = '東京都') Or (都道府県 = '大阪府')"

レコードを並び替える方法

RecordsetオブジェクトのSortプロパティを設定すると、指定したフィールドの値を使って、レコードセット内のレコードを並べ替える事ができます。

  • 書式
    recordset.Sort = sortorder
    
    recordset   :開いているRecordsetオブジェクト
    sortorder   :並べ替え順序
                 ASC  昇順で並べ替え
                 DESC 降順で並べ替え
  • 例1
    [生年月日]フィールドを使って昇順で並べ替える
    recordset.Sort = "生年月日 ASC"
    recordset.Sort = "生年月日"

並べ替えを指定できるレコードセット

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

並べ替えを解除する

Sortプロパティの長さ0の文字列を指定すると、並べ替えを解除して、元のレコードセットに戻すことができます。

  • 例1
    recordset.Sort = ""

複数のフィールドに並べ替えを設定する

複数のフィールドを使って並べ替える場合は、並べ替え順序をカンマ(,)で区切って指定してください。
この場合は、先に指定した並べ替え順序が優先されます。

  • 例1 [性別]フィールドで昇順に並べ替えた後、[生年月日]フィールドで降順に並べ替える
    recordset.Sort = "性別 ASC, 生年月日 DESC"