今回は「VBScriptでAccessを操作する方法」についてまとめます。
アプリケーションの起動/終了
インスタンス生成することで起動し、Quit
を実行することで終了できる。
Sub Main() Dim objAccess : Set objAccess = CreateObject("Access.Application") objAccess.Visible = True ' 何か処理… objAccess.Quit Set objAccess = Nothing End Sub Main
データベースへ接続/切断
接続文字列 strConnection
に含まれるファイルパス strFilePath
は絶対パスになるよう構成する。
VBScriptなので接続文字列を組み立てているが、Access VBA を利用するのであれば CurrentProject.Connection
に接続文字列があるので、これを利用すると簡単。
Sub Main() Dim objAccess, strFilePath, strConnection, objConnection, objRecordset, strQuery ' Accessオブジェクト生成 Set objAccess = CreateObject("Access.Application") objAccess.Visible = True ' DB接続文字列 strFilePath = GetCurrentDirectory() & "\Database1.accdb" strConnection = "Provider=Microsoft.ACE.OLEDB.12.0;" & _ "Data Source=" & strFilePath & ";" ' 接続 Set objConnection = CreateObject("ADODB.Connection") objConnection.Open strConnection ' DB操作… ' 切断 objConnection.Close objAccess.Quit Set objConnection = Nothing Set objAccess = Nothing End Sub Function GetCurrentDirectory() Dim objShell : Set objShell = CreateObject("WScript.Shell") GetCurrentDirectory = objShell.CurrentDirectory End Function Main
参考記事
テーブルの操作
テーブル作成
ADODB.Command
を利用して SQL によるテーブル作成を行う。
利用できるデータ型については下の表を参照。
Sub Main() Dim objAccess, strFilePath, strConnection, objConnection, objCommand Set objAccess = CreateObject("Access.Application") objAccess.Visible = False ' DB接続文字列 strFilePath = GetCurrentDirectory() & "\Database1.accdb" strConnection = "Provider=Microsoft.ACE.OLEDB.12.0;" & _ "Data Source=" & strFilePath & ";" ' 接続 Set objConnection = CreateObject("ADODB.Connection") objConnection.Open strConnection ' クエリ実行 Set objCommand = CreateObject("ADODB.Command") objCommand.ActiveConnection = objConnection objCommand.CommandText = "CREATE TABLE [T_COMPANY] (" & _ " [ID] COUNTER," & _ " [DISPLAY_NAME] TEXT(128) NOT NULL," & _ " [REGIST_DATE] DATE," & _ " PRIMARY KEY([ID], [DISPLAY_NAME])" & _ ");" objCommand.Execute ' 切断 objConnection.Close objAccess.Quit Set objCommand = Nothing Set objConnection = Nothing Set objAccess = Nothing End Sub Function GetCurrentDirectory() Dim objShell : Set objShell = CreateObject("WScript.Shell") GetCurrentDirectory = objShell.CurrentDirectory End Function Main
データ型 | 内部設定 | ||
---|---|---|---|
論理名 | 物理名 | DataTypeEnum | Size |
テキスト型 | TEXT | adVarWChar | 536870910 |
メモ型 | LONGTEXT | adVarWChar | 536870910 |
数値型(バイト型) | BYTE | adUnsignedTinyInt | 1 |
数値型(整数型) | SHORT | adSmallInt | 2 |
数値型(長整数型) | LONG | adInteger | 4 |
数値型(単精度浮動小数点型) | SINGLE | adSingle | 4 |
数値型(倍精度浮動小数点型) | DOUBLE | adDouble | 8 |
日付/時刻型 | DATETIME | adDate | 8 |
通貨型 | CURRENCY | adCurrency | 8 |
オートナンバー型 | COUNTER | adInteger | 4 |
Yes/No型 | BIT | adBoolean | 2 |
テーブル削除
テーブル作成同様 ADODB.Command
を利用してクエリで削除する。
Sub Main() Dim objAccess, strFilePath, strConnection, objConnection, objCommand Set objAccess = CreateObject("Access.Application") objAccess.Visible = False ' DB接続文字列 strFilePath = GetCurrentDirectory() & "\Database1.accdb" strConnection = "Provider=Microsoft.ACE.OLEDB.12.0;" & _ "Data Source=" & strFilePath & ";" ' 接続 Set objConnection = CreateObject("ADODB.Connection") objConnection.Open strConnection ' クエリ実行 Set objCommand = CreateObject("ADODB.Command") objCommand.ActiveConnection = objConnection objCommand.CommandText = "DROP TABLE [T_COMPANY]" objCommand.Execute ' 切断 objConnection.Close objAccess.Quit Set objCommand = Nothing Set objConnection = Nothing Set objAccess = Nothing End Sub Function GetCurrentDirectory() Dim objShell : Set objShell = CreateObject("WScript.Shell") GetCurrentDirectory = objShell.CurrentDirectory End Function Main
インデックス作成
Sub Main() Dim objAccess, strFilePath, strConnection, objConnection, objCommand ' Accessオブジェクト生成 Set objAccess = CreateObject("Access.Application") objAccess.Visible = False ' DB接続文字列 strFilePath = GetCurrentDirectory() & "\Database1.accdb" strConnection = "Provider=Microsoft.ACE.OLEDB.12.0;" & _ "Data Source=" & strFilePath & ";" ' 接続 Set objConnection = CreateObject("ADODB.Connection") objConnection.Open strConnection ' クエリ実行 Set objCommand = CreateObject("ADODB.Command") objCommand.ActiveConnection = objConnection objCommand.CommandText = "CREATE TABLE [T_COMPANY] (" & _ " [ID] COUNTER," & _ " [DISPLAY_NAME] TEXT(128) NOT NULL," & _ " [REGIST_DATE] DATE," & _ " PRIMARY KEY([ID])" & _ ");" objCommand.Execute objCommand.CommandText = "CREATE INDEX [IX_COMPANY] ON [T_COMPANY] (" & _ " [DISPLAY_NAME] ASC" & _ ")" objCommand.Execute ' 切断 objConnection.Close objAccess.Quit Set objCommand = Nothing Set objConnection = Nothing Set objAccess = Nothing End Sub Function GetCurrentDirectory() Dim objShell : Set objShell = CreateObject("WScript.Shell") GetCurrentDirectory = objShell.CurrentDirectory End Function Main
参考記事
レコードの操作
データ選択(SELECT)
パラメタライズドクエリを実行してデータ取得し、表示するサンプル。
パラメタライズドクエリは PARAMETERS ステートメント
を最初に宣言することで利用できる。
変数名は "[]" (角括弧)
で囲んで指定する。
変数の具体的な値は PARAMETERS ステートメント
で宣言されたパラメータ順に Command.Parameters
へ設定する。
(= PARAMETERS ステートメント
を宣言していれば、実行するクエリの順序は無視してよい。)
取得された Recordset
は Do ... Loop
で EOF
になるまで Recordset.MoveNext
で順に取り出して利用する。
Recordset
内のカーソルを移動するメソッドは MoveFirst
, MoveLast
, MoveNext
, MovePrevious
がある。
Sub Main() Dim objAccess, strFilePath, strConnection, objConnection, objRecordset ' Accessオブジェクト生成 Set objAccess = CreateObject("Access.Application") objAccess.Visible = False ' DB接続文字列 strFilePath = GetCurrentDirectory() & "\Database1.accdb" strConnection = "Provider=Microsoft.ACE.OLEDB.12.0;" & _ "Data Source=" & strFilePath & ";" ' 接続 Set objConnection = CreateObject("ADODB.Connection") objConnection.Open strConnection ' クエリ作成 Dim strParameters, strQuery strParameters = "PARAMETERS [UserName] TEXT, [Gender] BYTE; " strQuery = "SELECT * FROM T_MEMBER" & _ " WHERE DISPLAY_NAME = [UserName]" & _ " AND GENDER = [Gender];" ' クエリ実行 Set objCommand = CreateObject("ADODB.Command") objCommand.ActiveConnection = objConnection objCommand.CommandText = strParameters & strQuery objCommand.CommandType = 1 ' adCmdText = 1 objCommand.Parameters(0) = "tanaka" objCommand.Parameters(1) = 1 Set objRecordset = objCommand.Execute() Do While Not objRecordset.EOF wscript.echo objRecordset("ID") & ", " & objRecordset("DISPLAY_NAME") objRecordset.MoveNext Loop ' 切断 objConnection.Close objAccess.Quit Set objRecordset = Nothing Set objConnection = Nothing Set objAccess = Nothing End Sub Function GetCurrentDirectory() Dim objShell : Set objShell = CreateObject("WScript.Shell") GetCurrentDirectory = objShell.CurrentDirectory End Function Main
参考記事
- MSDN - PARAMETERS 宣言 (Microsoft Access SQL)
- MSDN - Recordset オブジェクト
- MSDN - Recordset オブジェクトのプロパティ、メソッド、およびイベント
データ追加(INSERT)
INSERT ステートメント
で挿入することもできるが、投入量が多い場合バッファ処理される Recordset
を利用した以下の INSERT
が速い。
Recordset.AddNew
を行うとカーソルが新しいレコードとなるため、そのまま投入したいデータを設定する。
一通りデータ投入が終わったタイミングで Recordset.Update
を実行することで更新される。
INSERT
クエリで実行したい場合、上記「データ選択」で行った ADODB.Command
を利用した方法で投入できる。
こちらの方法の場合、毎回 Command.Execute
を実行する必要がある。
Sub Main() Dim objAccess, strFilePath, strConnection, objConnection, objCommand, objRecordset ' Accessオブジェクト生成 Set objAccess = CreateObject("Access.Application") objAccess.Visible = False ' DB接続文字列 strFilePath = GetCurrentDirectory() & "\Database1.accdb" strConnection = "Provider=Microsoft.ACE.OLEDB.12.0;" & _ "Data Source=" & strFilePath & ";" ' 接続 Set objConnection = CreateObject("ADODB.Connection") objConnection.Open strConnection ' クエリを使ったデータ投入 Dim strParameters, strQuery strParameters = "PARAMETERS [DisplayName] TEXT, [Gender] BYTE, [LoginDate] DATE;" strQuery = "INSERT INTO T_USER (" & _ " DISPLAY_NAME, GENDER, LOGIN_DATE " & _ ") VALUES (" & _ " [DisplayName], [Gender], [LoginDate] " & _ ");" Set objCommand = CreateObject("ADODB.Command") objCommand.ActiveConnection = objConnection objCommand.CommandText = strParameters & strQuery objCommand.Parameters(0) = "mukai with query" objCommand.Parameters(1) = 1 objCommand.Parameters(2) = "2018/9/30" objCommand.Execute objCommand.Parameters(0) = "furuya with query" objCommand.Parameters(1) = 2 objCommand.Parameters(2) = "2018/3/1" objCommand.Execute ' Recordsetを使ったデータ投入 Const adOpenStatic = 3 ' https://msdn.microsoft.com/ja-jp/library/cc389787.aspx Const adLockOptimistic = 3 ' https://msdn.microsoft.com/ja-jp/library/cc389829.aspx Const adCmdTable = 2 ' https://msdn.microsoft.com/ja-jp/library/cc389765.aspx Set objRecordset = CreateObject("ADODB.Recordset") objRecordset.Open "T_USER", objConnection, adOpenStatic, adLockOptimistic, adCmdTable objRecordset.AddNew objRecordset("DISPLAY_NAME") = "mukai with recordset" objRecordset("GENDER") = 1 objRecordset("LOGIN_DATE") = "2018/9/30" objRecordset.AddNew objRecordset("DISPLAY_NAME") = "furuya with recordset" objRecordset("GENDER") = 2 objRecordset("LOGIN_DATE") = "2018/3/1" objRecordset.Update ' 切断 objConnection.Close objAccess.Quit Set objRecordset = Nothing Set objConnection = Nothing Set objAccess = Nothing End Sub Function GetCurrentDirectory() Dim objShell : Set objShell = CreateObject("WScript.Shell") GetCurrentDirectory = objShell.CurrentDirectory End Function Main
参考記事
- MSDN - Open メソッド (ADO Recordset)
- MSDN - CursorTypeEnum
- MSDN - LockTypeEnum
- MSDN - CommandTypeEnum
- MSDN - AddNew メソッド
データ更新(UPDATE)
クエリを使った更新を行う場合、WHERE
句 で指定するカラム名を テーブル名.カラム名
という指定をした方が良い。
ID
はテーブル名もあわせて指定しないと条件指定が有効に働かず全量更新されてしまう。
他のカラムはテーブル名指定しなくても有効に条件指定が効く。
Recordsetを使った更新を行う場合、Find
で対象を検索して削除する。
検索して見つからなかった場合、カーソルが末端に行く( Recordset.EOF
) ので、正しく検索できたかは Recordset.EOF
で確認する。
連続操作する場合、検索開始位置を最初の場所( Recordset.MoveFirst
)へ移動しないと正しく検索できない懸念があるので注意。
Sub Main() Dim objAccess, strFilePath, strConnection, objConnection, objCommand, objRecordset ' Accessオブジェクト生成 Set objAccess = CreateObject("Access.Application") objAccess.Visible = False ' DB接続文字列 strFilePath = GetCurrentDirectory() & "\Database1.accdb" strConnection = "Provider=Microsoft.ACE.OLEDB.12.0;" & _ "Data Source=" & strFilePath & ";" ' 接続 Set objConnection = CreateObject("ADODB.Connection") objConnection.Open strConnection ' クエリを使ったデータ更新 Dim strParameters, strQuery strParameters = "PARAMETERS [Id] LONG, [DisplayName] TEXT;" strQuery = "UPDATE T_USER" & _ " SET T_USER.DISPLAY_NAME=[DisplayName]" & _ " WHERE T_USER.ID=[Id];" Set objCommand = CreateObject("ADODB.Command") objCommand.ActiveConnection = objConnection objCommand.CommandText = strParameters & strQuery objCommand.Parameters(0) = 1 objCommand.Parameters(1) = "ほげほげ" objCommand.Execute ' Recordsetを使ったデータ更新 Const adOpenStatic = 3 ' https://msdn.microsoft.com/ja-jp/library/cc389787.aspx Const adLockOptimistic = 3 ' https://msdn.microsoft.com/ja-jp/library/cc389829.aspx Const adCmdTable = 2 ' https://msdn.microsoft.com/ja-jp/library/cc389765.aspx Set objRecordset = CreateObject("ADODB.Recordset") objRecordset.Open "T_USER", objConnection, adOpenStatic, adLockOptimistic, adCmdTable objRecordset.Find "ID=2" If Not objRecordset.EOF Then objRecordset("DISPLAY_NAME") = "ほげ2" objRecordset.Update End If ' 切断 objConnection.Close objAccess.Quit Set objRecordset = Nothing Set objConnection = Nothing Set objAccess = Nothing End Sub Function GetCurrentDirectory() Dim objShell : Set objShell = CreateObject("WScript.Shell") GetCurrentDirectory = objShell.CurrentDirectory End Function Main
参考記事
データ削除(DELETE)
基本的に注意すべき箇所は UPDATE と同じ。
Sub Main() Dim objAccess, strFilePath, strConnection, objConnection, objCommand, objRecordset ' Accessオブジェクト生成 Set objAccess = CreateObject("Access.Application") objAccess.Visible = False ' DB接続文字列 strFilePath = GetCurrentDirectory() & "\Database1.accdb" strConnection = "Provider=Microsoft.ACE.OLEDB.12.0;" & _ "Data Source=" & strFilePath & ";" ' 接続 Set objConnection = CreateObject("ADODB.Connection") objConnection.Open strConnection ' クエリを使ったデータ削除 Dim strParameters, strQuery strParameters = "PARAMETERS [Id] LONG;" strQuery = "DELETE FROM T_USER" & _ " WHERE T_USER.ID=[Id];" Set objCommand = CreateObject("ADODB.Command") objCommand.ActiveConnection = objConnection objCommand.CommandText = strParameters & strQuery objCommand.Parameters(0) = 3 objCommand.Execute ' Recordsetを使ったデータ削除 Const adOpenStatic = 3 ' https://msdn.microsoft.com/ja-jp/library/cc389787.aspx Const adLockOptimistic = 3 ' https://msdn.microsoft.com/ja-jp/library/cc389829.aspx Const adCmdTable = 2 ' https://msdn.microsoft.com/ja-jp/library/cc389765.aspx Set objRecordset = CreateObject("ADODB.Recordset") objRecordset.Open "T_USER", objConnection, adOpenStatic, adLockOptimistic, adCmdTable objRecordset.Find "ID=2" If Not objRecordset.EOF Then objRecordset.Delete End If ' 切断 objConnection.Close objAccess.Quit Set objRecordset = Nothing Set objConnection = Nothing Set objAccess = Nothing End Sub Function GetCurrentDirectory() Dim objShell : Set objShell = CreateObject("WScript.Shell") GetCurrentDirectory = objShell.CurrentDirectory End Function Main
参考記事
今回は「VBScript で Access を操作する方法」についてまとめました。 参考になったでしょうか? 本記事がお役に立っていると嬉しいです!!
最後に… このブログに興味を持っていただけた方は、 ぜひ 「Facebookページ に いいね!」または 「Twitter の フォロー」 お願いします!!