Excelが大好きだ!

Excel大好き経理マンがExcelの事を書き綴っていきます。


スポンサードリンク

SQLでExcelの集計を簡単・楽しく - ADODB.Recordsetオブジェクト

実際にExcelからSQLを使用するコードに沿って、コードの内容を紹介していきます。


ベースとなるコードは下記のとおりです。
今回は「SQL文の指示を実行」欄です。


データベースのデータの取得・更新等を行うためのオブジェクト。
Microsoft ActiveX Data Objects X.X Libraryへの参照設定(事前バインディング)を行った上で、下記コードでオブジェクトを作成する。

Dim myRS As ADODB.Recordset
Set myRS = New ADODB.Recordset


実行時バインディングを使用する場合はCreateObject関数を使用する。 実行時バインディングの時はMicrosoft ActiveX Data Objects X.X Libraryへの参照設定は不要です。

CreateObject("ADODB.Recordset")


メソッド・プロパティ

Openメソッド

Connectionオブジェクトで接続したデータベースのテーブルへ接続する。

引数 内容
Source テーブル名、SQLなどRecordsetオブジェクトの参照対象を指定(省略可)
ActiveConnection Connection オブジェクトを指定(省略可)
CursorType レコードのカーソル(操作手段)を指定(省略可)
LockType 同時アクセス時の処理を指定(省略可)
Options 引数Sourceの種類を明示的に指定(省略可)


Source

Recordsetオブジェクトに参照させたいテーブル、クエリ、SQL文などを文字列の形で指定。


ActiveConnection

ADO.Connection オブジェクトを指定する


CursorType
定数 内容
adOpenForwardOnly 0 既定値。前方専用カーソル。処理は最も高速。MovePrevious使用不可
adOpenDynamic 2 動的カーソル。Recordset内で全ての動作を許可。
adOpenStatic 3 静的カーソル。データの検索、レポートの作成に使用する。他のユーザーによる追加、変更、削除は表示されない
adOpenkeyset 1 他のユーザーが追加したレコードは反映されず、削除したデータへのアクセス不可以外は、動的カーソルと同じ
adOpenUnspecified -1 カーソルタイプを指定しない

SQLで抽出・集計をするだけならadOpenForwardOnlyで問題ないと思う。
Recordsetオブジェクト.RecordCountを使用する場合はRecordsetオープン時にadOpenStatic、adOpenKeysetが必要。


LockType

同データベースの同じテーブルに同時接続した場合の処理方法を指定。

定数 内容
adLockReadOnly 1 既定値。データの変更はできない
adLockPessimistic 2 レコード単位の排他的ロック
adLockOptimistic 3 レコード単位の共有的ロック。Updateメソッドを呼び出した場合にだけレコードをロックする
adLockBatchOptimistic 4 共有的バッチ更新。バッチ更新モードの場合にのみ指定可
adLockUnspecified -1 ロックタイプを指定しない

レコードの更新を許可したい場合はadLockReadOnly以外の値を指定する。
ベースとなるコードにも記載していないようにあまり意識をしたことはない。
基本的には既定値であるadLockReadOnlyで問題ないと思う。


Options
定数 内容
adCmdText 1 ソースを一般的なSQLとして評価
adCmdTable 2 ソースをテーブル名として評価
adCmdStoredProc 4 ソースをストアドプロシージャ名として評価
adCmdUnknown 8 既定値。ソースのタイプが不明であることを示す。
adCmdFile 256 ソースを保存されたRecordsetのファイル名として評価
adCmdTableDirect 512 ソースを列が全て返されるテーブル名として評価
adCmdUnspecified -1 引数を指定しない

こちらもベースとなるコードに記載していないように意識したことはない。
既定値もしくは本記事の主旨からいえばadCmdTextで問題ないと思う。


Closeメソッド

テーブルへの接続を切断する。
Closeを行わないと、テーブルへ接続されたままになる。

Close後はRecordsetオブジェクトを開放する必要がある。
開放を行わないと不要なオブジェクトがメモリを圧迫する。
Recordset オブジェクトにNothingを代入することで開放される。

myRS.Close
set myRS = nothing


次回は「データの貼り付け作業」欄を紹介していきます。


www.excellovers.com