5.4 ワークブックやCSVファイルへのデータ追加、更新
ADOを使って開いたワークシートやCSVファイルに変更を加える方法です。これらも、ADOオブジェクトのExecuteというメソッドでSQLを実行し行います。

なお、更新系のSQL文を実行してもレコードセットは返ってきません。また、オープン時は必ず更新モード(ReadOnly=0)を指定する必要があります。

それと、それと少しだけRDBとの違いがあるのも注意が必要。トランザクション処理が出来ない点、INSERT時はプライマリ重複エラーがない点です。

また、ワークシートでは追加(INSERT)と更新(UPDATE)が可能、CSVでは追加(INSERT)のみが可能という制約もあります。
使用例/CSVファイルの場合
CSVファイルは、データの追加(INSERT)のみが可能です。例では、c:\happyというフォルダに入っているADO_EXCEL.csvというCSVファイルへレコードを追加しています。やってることは、かなりムリヤリで実用的じゃないですが、まぁ気にしないでくださいな(汗)

CSVファイルの場合は追加時にキー重複エラーが発生することはありませんが、一応On Error Resume Nextを入れ、更新の後にエラー判定処理を行っています。

なお、基本的には、『3.6 SQLの実行(更新、追加、削除等)』と似ているので、細かいことはそちらを参照してください。大きな違いは、トランザクション処理を行っていない(出来ない)点です。

Sub prcAdCsvInsert()

    'Access VBA Tips
    '5.4 データ追加、更新/CSVは追加のみ

    '@SQLエラーでプログラムが異常終了するのを回避するため
    On Error Resume Next

    Dim objADO As New ADODB.Connection
    Dim strSQL As String

    'ADOを使い更新モードでCSVファイルを扱う準備(Open)を行います。
    objADO.Open "Driver={Microsoft Text Driver (*.txt; *.csv)}; " & _
                 "DBQ=c:\happy;" & _
                 "ReadOnly=0"

    '==============================================================
    '= データ追加の例
    '==============================================================
    'レコード追加のSQLを定義
    strSQL = "INSERT INTO ADO_EXCEL.csv " & _
             "       (日付 " & _
             "       ,店舗コード) " & _
             "VALUES ('2003/11/30' " & _
             "       ,'T5130') "

    'レコード追加のSQLを実行します
    objADO.Execute strSQL

    'SQL実行結果の判定
    If Err.Number <> 0 Then
       'SQLが異常終了したらエラー内容の表示をします
       Call prcSqlError(objADO)
    End If

    'ADOをクローズします
    objADO.Close

    'オブジェクトの破棄
    Set objADO = Nothing

End Sub

'==============================================================
'= エラー時処理(例ではエラーの詳細を表示するだけ)
'==============================================================
Sub prcSqlError(tmpCon As ADODB.Connection)

    Dim objErrItem As Error

    Set objErrItem = tmpCon.Errors.Item(0)

    Debug.Print "Description=" & objErrItem.Description
    Debug.Print "HelpContext=" & objErrItem.HelpContext
    Debug.Print "HelpFile=" & objErrItem.HelpFile
    Debug.Print "NativeError=" & objErrItem.NativeError
    Debug.Print "Number=" & objErrItem.Number
    Debug.Print "Source=" & objErrItem.Source
    Debug.Print "SQLState=" & objErrItem.SQLState

    Set objErrItem = Nothing

End Sub
ワークシートへデータを追加、更新する例
ワークシートは、データの追加(INSERTI)と更新(UPDATE)が可能です。例では、c:\happy\ADO_EXCEL.xlsというワークブックを開き、ワークシートへレコードの追加とレコードの更新を行っています。これも、かなりムリヤリで実用的じゃないですが、まぁ気にしないでくださいな(汗)

なお、ワークシートの場合も追加時のキー重複エラーが発生することはありませんが、一応On Error Resume Nextを入れ、更新の後にエラー判定処理を行っています。

なお、基本的には、『3.6 SQLの実行(更新、追加、削除等)』と似ているので、細かいことはそちらを参照してください。大きな違いは、トランザクション処理を行っていない(出来ない)点です。

Sub prcAdoExcelUpdate()

    'Access VBA Tips
    '5.4 データ追加、更新/Excelは追加と更新のみ

    'SQLエラーでプログラムが異常終了するのを回避するため
    On Error Resume Next

    Dim objADO As New ADODB.Connection
    Dim strSQL As String

    'ADOを使いCSVファイルを更新モードで開きます。
    objADO.Open "Driver={Microsoft Excel Driver (*.xls)}; " & _
                "DBQ=c:\happy\ADO_EXCEL.xls;" & _
                "ReadOnly=0"

    'レコード追加のSQLを定義
    strSQL = "INSERT INTO U_TBL " & _
             "       (日付 " & _
             "       ,店舗コード) " & _
             "VALUES ('2003/11/30' " & _
             "       ,'Z5130') "

    'レコード追加のSQLを2回実行します。
    '(エクセルファイルなのでキー重複エラーは出ません)
    '追加したデータが、次の更新時の対象データになります。
    objADO.Execute strSQL
    objADO.Execute strSQL

    'レコード更新のSQLを定義
    strSQL = "UPDATE U_TBL " & _
             "   SET データ番号 = '100'" & _
             "      ,担当者 = '00M5365'" & _
             "      ,会員番号 = '5144M200210724'" & _
             " WHERE 店舗コード='Z5130'"

    'レコード更新のSQLを実行します。事前に、対象データを2件追加しています。
    'ただし、更新時のキー重複はエラーです
    objADO.Execute strSQL

    'SQL実行結果の判定
    If Err.Number <> 0 Then
       'SQLが異常終了したらエラー内容の表示をします
       Call prcSqlError(objADO)
    End If

    'データベースのクローズ
    objADO.Close

End Sub

'==============================================================
'= エラー時処理(例ではエラーの詳細を表示するだけ)
'==============================================================
Sub prcSqlError(tmpCon As ADODB.Connection)

    Dim objErrItem As Error

    Set objErrItem = tmpCon.Errors.Item(0)

    Debug.Print "Description=" & objErrItem.Description
    Debug.Print "HelpContext=" & objErrItem.HelpContext
    Debug.Print "HelpFile=" & objErrItem.HelpFile
    Debug.Print "NativeError=" & objErrItem.NativeError
    Debug.Print "Number=" & objErrItem.Number
    Debug.Print "Source=" & objErrItem.Source
    Debug.Print "SQLState=" & objErrItem.SQLState

End Sub
Copyright(C) 1999-2006 結城圭介。 All rights reserved