簡単な覚書ですが、誰かの役に立てれば幸いです。
ExcelとAccessの連携を取りたい時に色々調べた結果、便利そうなレコードセットという機能を発見しました。
#レコードセットについて
VBAの参照設定することで使える配列より勝手がいいかなと思う情報の集合体
イメージはテーブルを作っていくイメージ(と、いうか実際にテーブルとして扱われるのを無理やり扱ってるのかも)
#配列との違い
配列は1つの型のみ設定出来ますが、
レコードセットは各フィールド毎に型設定出来るので、次のようなデータを扱い時などに便利
No | 名前 | 給料 | 住所 |
---|---|---|---|
1 | AAA | 15円 | 熊本 |
2 | BBB | 20円 | 愛知 |
配列では、2次元配列を準備してなんとか入れる事は出来ますが、どこに何が入っているかが面倒
レコードセットでは
フィールドという箱を準備し、その中にデータを格納出来るのですごく便利です。
イメージは配列の箱ごとに名前を付けてあげるイメージ?
#実際の定義方法
参照設定で、"Microsoft ActiveX Data Object *** Library"を選択
(***はバージョンです。自分の環境だと6.1が最新でした)
あとはエクセルVBA内で
'追加
sub otamesi()
dim Rs as new Adodb.Recordset
end sub
'ここまで
オブジェクトを定義し、好き勝手使えます。
(Rsは変数名なので、お好きにどうぞ)
#使い方
主に自分が使う機能を記載します
##フィールド定義
そもそも値を入れる箱を準備する必要がありますので、その対応を行います。
sub otamesi()
dim Rs as new Adodb.Recordset
'追加
with Rs.Fields
.append "フィールド名", adVarChar, 65535
End with
'ここまで
end sub
##解説
対象 | 説明 |
---|---|
.append | フィールド追加用のメソッド |
"フィールド名" | セットするフィールド名 |
adVarChar | セットする型 |
65535 | adVarCharは文字列型であり、文字数のセットが必須のため、65535文字入るよう設定(こんなに長くは要らないのでお好きに) |
型などの制約は[MSDN](https://docs.microsoft.com/ja-jp/office/client-developer/access/desktop-database-reference/append-method-ado | |
)の"Type"の項目を参照ください |
#フィールド値設定
実際にフィールドに値を格納します
sub otamesi()
dim Rs as new Adodb.Recordset
with Rs.Fields
.append "フィールド名", adVarChar, 65535
End with
'追加
Rs.Open
with Rs
.addnew
!フィールド名 = "愛してるのさ君たちを!"
.update
End with
'ここまで
end sub
##解説
まずは値を入れたり、参照したりする際は"Open"必要なので忘れずに
当然使い終わった後に"Close"後、メモリ解放ください(マクロ終了時にメモリ解放されるみたいなので厳密にやる必要はないかもですが、アトゼキの気持ちでやりましょう)
対象 | 説明 |
---|---|
.Open | レコードセットを使いますよーという命令 |
.addnew | 新しく情報登録しますよーという命令 |
!フィールド名 = "愛しているのさ君たちを!" | 値を入れるフィールドを選択し、値をセット可能。文言はACの主任 |
.update | 設定した値を登録レコードセットに登録してねという命令 |
"Rs!フィールド名"で指定のフィールド名を参照できます | |
具体的な内容自体はMSDNにありますので、以下を参照ください | |
・Open:R/W許可 | |
・Addnew:新規レコード追加時に呼び出し必要 | |
・Update:レコードセット更新 |
#ワークシートへの出力
これが一番簡単だと思います
sub otamesi()
dim Rs as new Adodb.Recordset
with Rs.Fields
.append "フィールド名", adVarChar, 65535
End with
Rs.Open
with Rs
.addnew
!フィールド名 = "愛してるのさ君たちを!"
.update
End with
'追加
Rs.MoveFirst
Range("A1").CopyRecordset(Rs)
'ここまで
end sub
#解説
対象 | 説明 |
---|---|
.MoveFirst | レコードセット一覧の一番初めに戻してねという命令 |
Range("A1").CopyRecordset(Rs) | 現在開かれているワークシートのレンジA1を起点にレコードセットの内容をコピペしてねという命令 |
#終わりに
正直ここまで書くのに2時間かかったので、続きは次回・・・