ExcelからAccessのテーブルにADOを使って書き込みを実行する
ExcelのワークシートからAccessにADOを使って接続し、テーブルに書き込むVBAを作成してみましょう。
今回の事例ではIDをキーとしたテーブルへの新規登録・更新までのお手軽なサンプルです。
尚、今回の関連記事としてADOを使ってテーブルを読み込む「ADOを使ってExcelからAccessデータを利用してみよう」があります。ExcelのシートやAccessのテーブルは前回のものをそのまま利用しますので、テーブルデザインや参照設定等はそちらのエントリーをご参考下さい。
テーブルをADOで書き込む為のVBAコード
Sub DB_Write() Dim adoCON As New ADODB.Connection Dim adoRS As New ADODB.Recordset Dim strSQL As String Dim odbdDB As Variant Dim wSheetName As Variant Dim i As Integer Dim wLastGyou As Long 'カレントディレクトリのデータベースパスを取得 odbdDB = ActiveWorkbook.Path & "\sample.accdb" 'データベースに接続する adoCON.ConnectionString = "provider=Microsoft.ACE.OLEDB.12.0;" _ & "Data Source=" & odbdDB & "" adoCON.Open 'トランザクション開始 adoCON.BeginTrans 'アクティブなシート名を取得 wSheetName = ActiveSheet.Name With Worksheets(wSheetName) '最終行番号を取得 wLastGyou = .UsedRange.Rows.Count 'Excelの一覧を読み込みAccessに書き込む For i = 3 To wLastGyou 'IDの数値チェック(数字の場合は処理を実行) If IsNumeric(.Cells(i, 1).Value) And _ .Cells(i, 1).Value <> "" Then 'DB接続用SQL strSQL = "SELECT T_item.* FROM T_item " strSQL = strSQL & "WHERE ID = " & CLng(.Cells(i, 1).Value) & " ;" 'カーソルをクライアント側に設定 adoRS.CursorLocation = adUseClient 'レコードセットを開く adoRS.Open strSQL, adoCON, adOpenKeyset, adLockOptimistic '入力されたIDと同一のレコードが無い場合は新規登録 If adoRS.EOF Then adoRS.AddNew adoRS!ID = CLng(.Cells(i, 1).Value) End If adoRS!商品名 = .Cells(i, 2).Value adoRS!品番 = .Cells(i, 3).Value If IsNumeric(.Cells(i, 4).Value) Then adoRS!単価 = CLng(.Cells(i, 4).Value) Else adoRS!単価 = 0 End If If IsNumeric(.Cells(i, 5).Value) Then adoRS!入数 = CLng(.Cells(i, 5).Value) Else adoRS!入数 = 0 End If adoRS.Update 'レコードセットを閉じる adoRS.Close: Set adoRS = Nothing End If Next i End With 'トランザクション終了 adoCON.CommitTrans 'ADOコネクションオブジェクトのクローズ処理 adoCON.Close: Set adoCON = Nothing End Sub
VBAコードの解説
ADOの参照設定やデータベースへの接続方法は以前のエントリーをご参考下さい。
[DB書き込み]ボタンのクリック時のVBAは以下の通りです。
For~NextステートメントでExcelの一覧を読み込む
For~Nextステートメントを使って3行目から最終行までの一覧を繰り返し読み込みます。
※サンプルコード30行目~70行目
For i = 3 To wLastGyou '省略 Next i
ID(A列)の数値チェック
IsNumeric関数を使いIDの数字チェックを行います。IDが数字かつ空白で無い場合に処理を続行します。
※サンプルコード33行目~34行目
If IsNumeric(.Cells(i, 1).Value) And _ .Cells(i, 1).Value <> "" Then
Accessのレコードセットを開きます
キー項目のIDで抽出するSQL(SELECT文)をセットし、Openメソッドでレコードセットを開きます。
※サンプルコード36行目~42行目
'DB接続用SQL strSQL = "SELECT T_item.* FROM T_item " strSQL = strSQL & "WHERE T_item.ID = " & CLng(.Cells(i, 1).Value) & " ;" 'カーソルをクライアント側に設定 adoRS.CursorLocation = adUseClient 'レコードセットを開く adoRS.Open strSQL, adoCON, adOpenKeyset, adLockOptimistic
レコードの存在チェック
上記SQLより指定したIDが存在しない場合(adoRS.EOF)はAddNewメソッドを使い新規レコードを追加します。また、新規登録の場合のみキー項目のIDをセットするようにします。
※サンプルコード45行目~48行目
If adoRS.EOF Then adoRS.AddNew adoRS!ID = CLng(.Cells(i, 1).Value) End If
各セルの値をレコードにセット
各セルの値をレコードの項目にそれぞれセットしUpdateメソッドで更新します。また、単価と入数の項目はIsNumeric関数を使い数値以外の場合に0をセットするようにします。
※サンプルコード50行目~63行目
adoRS!商品名 = .Cells(i, 2).Value adoRS!品番 = .Cells(i, 3).Value If IsNumeric(.Cells(i, 4).Value) Then adoRS!単価 = CLng(.Cells(i, 4).Value) Else adoRS!単価 = 0 End If If IsNumeric(.Cells(i, 5).Value) Then adoRS!入数 = CLng(.Cells(i, 5).Value) Else adoRS!入数 = 0 End If adoRS.Update
レコードセットをクローズします
Closeメソッドを使いレコードセットを閉じます。また、変数にNothingをセットしてクリアします。
※サンプルコード66行目
'レコードセットを閉じる adoRS.Close: Set adoRS = Nothing
以上、今回はExcelからAccessのテーブルにADOを使って書き込む方法についてでした。
今回のサンプルファイルは以下のリンクからダウンロード可能です。