ADOは「ActiveX Data Object」の略で、データベースを操作するためのさまざまなオブジェクトを持つオブジェクトライブラリです。ADOの持つさまざまなオブジェクトを組み合わせることで、データベースを自由に操作することができます。
SQL Server、Oracle、Excelファイルなど、Access以外の外部データベースも同様に操作が可能となります。
本記事では主に、データベースへの接続方法に絞って解説していきます。
データベース操作の主な流れ
- データベースに接続する
- レコードの取得を行う
- 取得したレコードへの検索や追加・更新・削除など、データベースの操作を行う
- データベースへの接続を解除する
※AccessでADOを利用するには、「参照設定」ダイアログボックスで「Microsoft ActiveX Data Objects X.X Library」(X.Xはバージョン番号)への参照設定が必要です。
ADOで使用するオブジェクト
ADOでは主に次のオブジェクトによって構成されています。
オブジェクト名 | 説明 |
---|---|
Connection | データベースへの接続を保持するオブジェクト |
Command | データベースへのコマンドを保持するオブジェクト |
Recordset | レコードの集まりを保持するオブジェクト |
Field | フィールドを保持するオブジェクト |
Parameter | パラメータを保持するオブジェクト |
Property | プロパティを保持するオブジェクト |
Error | エラーを保持するオブジェクト |
データベース接続で使用するオブジェクト
Connectionオブジェクト
Connectionオブジェクトはデータベースへの接続を保持するオブジェクトです。Connectionオブジェクトの主なプロパティとメソッドは、以下となります。
プロパティ | 説明 |
---|---|
ConnectionString | データベースへの接続情報を返す |
State | データベースへの接続状態を返す (※接続している場合は「adStateOpen」 接続していない場合は「adStateClosed」を返す) |
メソッド | 説明 |
---|---|
Open | レコードの集まりを保持するオブジェクト |
Close | フィールドを保持するオブジェクト |
Execute | パラメータを保持するオブジェクト |
BeginTrans | トランザクションを開始する |
CommitTrans | 変更を保存してトランザクションを終了する |
RollbackTrans | 変更を取り消してトランザクションを終了する |
データベースへの接続
データベースに接続するには、ConnectionオブジェクトのConnectionStringプロパティに「接続文字列」を設定します。ただし、カレントデータベースに接続する場合は、CurrentProjectオブジェクトのConnectionプロパティを使用するため、接続文字列は必要ありません。
アクセスファイルへの接続
例. カレントデータベースに接続する場合
Function ConnectToCurrentDb()
Dim cn As ADODB.Connection
Set cn = CurrentProject.Connection
Select Case cn.State
Case adStateOpen
MsgBox "データベースに接続しています。"
Case adStateClosed
MsgBox "データベースに接続していません。"
End Select
Set cn = Nothing
End Function
例. カレントデータベース以外に接続する場合
Function ConnectToOtherDb()
Dim cn As ADODB.Connection
Set cn = New ADODB.Connection
cn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Data\sample.accdb;"
cn.Open
Select Case cn.State
Case adStateOpen
MsgBox "データベースに接続しています。"
Case adStateClosed
MsgBox "データベースに接続していません。"
End Select
cn.Close
Set cn = Nothing
End Function
カレントデータベース以外に接続する場合は、cn.Open(cn.Close) の処理を入れる必要があります。
あらかじめConnectionStringプロパティに接続文字列を設定していなくても、以下のようにOpenメソッドの第1引数に直接、接続文字列を指定することでデータベースに接続できます。
例. カレントデータベース以外に接続する場合(ConnectionStringプロパティで接続文字列を設定しない)
Function ConnectToOtherDb()
Dim cn As ADODB.Connection
Set cn = New ADODB.Connection
cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Data\sample.accdb;"
Select Case cn.State
Case adStateOpen
MsgBox "データベースに接続しています。"
Case adStateClosed
MsgBox "データベースに接続していません。"
End Select
cn.Close
Set cn = Nothing
End Function
外部データベースファイルへの接続
例. CSVファイルに接続
Function ConnectToCSV()
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Set cn = New ADODB.Connection
cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=C:\Data;" & _
"Extended Properties='text;HDR=Yes;FMT=Delimited';"
Set rs = cn.Execute("SELECT * FROM test.csv")
Do Until rs.EOF
MsgBox rs.Fields(0) + rs.Fields(1) + rs.Fields(2) + rs.Fields(3)
rs.MoveNext
Loop
rs.Close
cn.Close
Set rs = Nothing
Set cn = Nothing
End Function
「Data Source」には接続するCSVファイルが保存されているフォルダのパスを「フォルダのパス」+「\」の形式で記述します。
例えば、Cドライブのルートフォルダにあるなら「C:\」を、CドライブのTESTという名のフォルダにあるなら「C:\TEST」をそれぞれ記述します。
以下のように、CurrentProject.Pathを変数に入れて設定することで、カレントデータベースのあるフォルダのパスを指定することができます。変数に入れることで後からパスのみ変更する場合も分かりやすくなります。
Dim MyPath As String
MyPath = CurrentProject.Path & "\"
cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & MyPath & ";" & _
"Extended Properties='text;HDR=Yes;FMT=Delimited';"
次に、ConnectionオブジェクトのExecuteメソッドを使用してオブジェクト変数にレコードセットを格納します。
Set rs = cn.Execute("SELECT * FROM test.csv")
FROM句の後に「ファイル名.拡張子」の形式で記述します。(「ファイル名#拡張子」と記述しても同様に動作します)
Openメソッドの引数として渡していた接続文字列の設定を、以下のようにあらかじめConnectionオブジェクトのプロパティとして設定することも可能です。
cn.Provider = "Microsoft.ACE.OLEDB.12.0"
cn.Properties("Extended Properties") = "text;HDR=Yes;FMT=Delimited"
cn.ConnectionString = "C:\Data"
cn.Open
HDR=YESとすることで、1行目をヘッダーとして扱うようになります(NOの場合は1行目をデータとして扱います)。
カンマ区切り形式のデータであれば、拡張子が「txt」のテキストファイルでも、同様に外部データベースとして利用することができます。
例. Excelファイルに接続
Function ConnectToExcel()
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Set cn = New ADODB.Connection
cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=C:\Data\test.xlsx;" & _
"Extended Properties='Excel 12.0 Xml;HDR=YES';"
Set rs = cn.Execute("SELECT * FROM [Sheet1$]")
Do Until rs.EOF
MsgBox rs.Fields(0) + rs.Fields(1) + rs.Fields(2) + rs.Fields(3)
rs.MoveNext
Loop
rs.Close
cn.Close
Set rs = Nothing
Set cn = Nothing
End Function
「Data Source」には接続するExcelファイルのパスを記述します。
例えば、Cドライブのルートフォルダにある「test.xlsx」という名前のファイルなら「C:\test.xlsx」を、CドライブのTESTという名のフォルダにあるなら「C:\TEST\test.xlsx」をそれぞれ記述します。
次に、ConnectionオブジェクトのExecuteメソッドを使用してオブジェクト変数にレコードセットを格納します。
Set rs = cn.Execute("SELECT * FROM [シート名$]")
FROM句の後に対象となるワークシート名を「[シート名$]」の形式で記述します。
例えば「Sheet1」という名前のワークシートのデータをレコードセットに取得する場合、「[Sheet1$]」と記述します。
レコードセットを取得するとき、WHERE句を使用してレコードを抽出することができます。ただし、接続文字列の「Extended Properties」で「HDR」の設定を「YES」に設定している場合と「NO」に設定している場合とで抽出条件の指定の仕方が変わってきます。
(「HDR」の設定を「YES」に設定)
- CSVファイル
SELECT * FROM ファイル名.拡張子 WHERE フィールド名 = 値
- Excelファイル
SELECT * FROM [シート名$] WHERE フィールド名 = 値
(「HDR」の設定を「NO」に設定)
- CSVファイル
SELECT * FROM ファイル名.拡張子 WHERE 列番号 = 値
- Excelファイル
SELECT * FROM [シート名$] WHERE 列番号 = 値
「HDR」の設定を「NO」に設定している場合、フィールド名を使って抽出条件を指定することはできません。
そのため、列番号 = 値と指定します。「列番号」には、抽出条件に指定するフィールドを「F+番号」といった形式で記載します。
例えば、1列目を抽出対象とするなら F1 = 値、2列目を抽出対象とするなら F2 = 値 とします。
まとめ
本記事では、Access VBAにおけるADOについて、データベースへの接続をメインに説明してきました。
ADOではAccessの内部ファイルのみならず、CSVファイルやExcelファイルといった外部ファイルへのアクセスも可能となります。
接続の際の記載が多少違う部分もありますが、基本的にはどのデータベースファイルでも同様な操作が可能となります。
参考文献
- VBA エキスパート 公式テキスト 「Access VBA スタンダード」 武藤 玄