【SQL Server】Excel VBAのレコードセットを使ってテーブルの一括更新
公開日:
:
Microsoft Office, データベース Excel, SELECT文, SQL, SQL Server, UpdateBatch, VBA, エクセル, テーブル, バッチ更新, レコードセット, 一括更新
前々回は読み取り専用でレコードセットへ取得し、結果をエクセルへ書き出し
前回はVBAから更新SQL(Insert、Update、Delete)を発行し、テーブルを直接更新
今回は、SELECT文でレコードセットへデータを取得し、
レコードセット内のデータ更新し、更新内容をテーブルへ一括で反映する
実行前の準備
VBAを実行する前に、
ツール/参照設定の「Microsoft ActiveX Data Objects 6.1 Library」にチェックする
※6.1じゃなくてもOK。2.0、2.1、6.0で動作することは確認済み
レコードセットへデータ取得し、
レコードを更新後にテーブルへ一括反映のサンプル
サンプルでは、取得したレコードセットに対して、レコードの追加、削除、修正後に「UpdateBatch」メソッドを使用してテーブルへ反映させている。
※接続文字列はWindows認証、SQL Server認証を環境によって使い分ける。
Option Explicit
Sub RecordSet_UpdateBatch()
On Error GoTo ErrorProc
Dim DBSrv As String
Dim DBName As String
Dim strSQL As String
Dim rs As Recordset
Dim strConn As String
'----------------------------------------------------
' DBSrvにDBサーバ名、DBNameにデータベース名
'----------------------------------------------------
DBSrv = "DBSERVER\SQLEXPRESS"
'DBSrv = "DBSERVER\SQLEXPRESS,49391" 'ポート指定付
DBName = "db_Sales"
'----------------------------------------------------
' SQL作成(更新対象テーブルのSELECT)
'----------------------------------------------------
strSQL = "SELECT * FROM [Work_Table]"
'----------------------------------------------------
' 接続文字列の指定
'----------------------------------------------------
'Windows認証
strConn = "Provider=SQLOLEDB;Data Source='" & DBSrv & "';Initial Catalog='" & DBName & "';Trusted_Connection=Yes"
'SQL Server認証
'strConn = "Provider=SQLOLEDB;Data Source='" & DBSrv & "';Initial Catalog='" & DBName & "';UID=【ユーザ名】;PWD=【パスワード】;"
'オブジェクト生成
Set rs = New ADODB.Recordset
'バッチ更新モードでレコードセットをオープン
rs.Open strSQL, strConn, adOpenKeyset, adLockBatchOptimistic, adCmdText
'----------------------------------------------------
' レコードの追加
'----------------------------------------------------
rs.AddNew
rs.Fields("ID").Value = "00016"
rs.Fields("ユーザ名").Value = "VBA_レコードセットで追加"
rs.Fields("日時").Value = Now
'----------------------------------------------------
' レコードの削除
'----------------------------------------------------
rs.MoveFirst
Do Until rs.EOF
If rs.Fields("ID").Value = "00001" Then
rs.Delete
End If
rs.MoveNext
Loop
'----------------------------------------------------
' レコードの修正
'----------------------------------------------------
rs.MoveFirst
Do Until rs.EOF
If rs.Fields("ID").Value = "00015" Then
rs.Fields("ユーザ名").Value = "VBA_レコードセットで更新"
End If
rs.MoveNext
Loop
'----------------------------------------------------
' DB更新(上記のレコードの追加、削除、修正をDBに反映)
'----------------------------------------------------
rs.UpdateBatch
'クローズ
rs.Close
Set rs = Nothing
Exit Sub
'エラー処理
ErrorProc:
MsgBox Err.Number & vbCrLf & Err.Description
End Sub
検証環境
Excel 2007 or Excel 2013
SQL Server 2012
Adsense
関連記事
-
-
【Office】Access2007のピボットテーブルとExcel連携
仕事でAccess2007でEXCELみたいにピボットテーブルを使えますか? と質問を頂いた。
-
-
【Access】「更新可能なクエリであることが必要です」のクエリのエラーポップアップ
Accessでクエリを作成し、実行すると 「更新可能なクエリであることが必要です。」
-
-
【SQL Server 2012】バッチ(コマンドプロンプト)でリストア
バッチ(コマンドプロンプト)を使って、SQL Server 2012のリストアしてみたいと思います。
-
-
【Access】クエリで小数点の切り下げ、切り上げ
Access2007には、roundup、rounddown関数がない。 なので、純粋に関数だ
-
-
【Access】リンクテーブルの一括変換。ODBCを使わずにSQL Serverへ接続
Accessのリンクテーブルの接続先を一括で変更する方法 この方法なら、ODBCを使用していな
-
-
【SQL Server】バックアップ取得日を確認する方法
前回の記事で、SQL Serverのデータベースのリストアした日付を確認するSQLを作りましたが、今
-
-
【Outlook】Gmailを使う時の設定(Gmailアカウント側)
OutlookでGmailを使用するには、Gmailのアカウント側でいくつか設定をしなければいけない
-
-
【SQL Server 2012】バッチ(コマンドプロンプト)でバックアップ
バッチ(コマンドプロンプト)を使って、SQL Server 2012のバックアップを取得します。
-
-
【Access】循環参照エラーの回避方法
Accessでクエリを実行しようとすると クエリ定義の SELECT で指定されている別名
-
-
【Excel】複数項目を指定した昇順、降順の並べ替え方法
Excel 2013でのお話。 なぜかわからないが、Excelのオートフィルターを使うと単一の

