Accessのテーブルを検索しその結果に基づいてExcelのデータを更新する

ExcelのデータをAccessのテーブルデータに基づいて更新する方法について説明します。
今回の例ではExcelからVBAを使ってAccessデータベースに接続してデータの更新を行います。
具体的な利用手順とコードの内容につきましては以下をご覧ください。

サンプルアプリの説明

下の絵の「ACCESSデータを元に勤務地を更新」ボタンをクリックすると、Excelの社員一覧の勤務地が参照先であるAccess社員一覧テーブルのデータに基づいて更新されます。
今回の例では社員No「001」、「005」、「013」の社員勤務地をAccess社員一覧テーブルのデータに基づいてそれぞれ「名古屋」→「福井県」、「名古屋」→「東京都」、「名古屋」→「東京都」に置き換えます。

ExcelVBAによるAccessデータベースへの接続手順について

以下はADODB(ActiveX Data Objects)ライブラリを使用して、Microsoft Accessデータベースに接続するためのコードです。

Dim conn As Object
Set conn = CreateObject(“ADODB.Connection")
conn.Open “Provider=Microsoft.ACE.OLEDB.12.0;Data Source=【参照先Accessファイル】 ;Persist Security Info=False;"

コードの最初の行では、conn という名前のオブジェクト変数を宣言しています。
conn 変数は、後続の処理でデータベースにアクセスするための Connection オブジェクトを格納するために使用されます。
次に、 CreateObject 関数を使用して、ADODB.Connection オブジェクトを作成し、 Set キーワードを使用して conn 変数に格納しています。
このオブジェクトを使用して、Accessデータベースへの接続を確立することができます。

最後に、conn.Open メソッドを使用して、Accessデータベースへの接続を開始します。
このメソッドは、接続文字列を受け取り、指定されたデータソースへの接続を確立します。
この例では、Provider キーワードで指定された OLE DB プロバイダー(Microsoft.ACE.OLEDB.12.0)を使用して、Data Source キーワードで指定されたパスにある Access データベースに接続されます。
また、Persist Security Info キーワードを False に設定することで、パスワードなしで接続できるようになります。

サンプルコードの解説

処理の大まかな流れは以下の通りです。詳細につきましてはサンプルアプリのコードに書かれているコメントをご覧ください。

 参照先のAccessデータベースファイルを選択
    ↓
 Accessデータベースへ接続
    ↓
 Excelデータの検索キーとなる「社員No」の列番号を取得
    ↓
 Excelのレコードを1行ずつ読み込み、検索キーとなる社員Noをキーに
 参照先Accessの社員一覧テーブルのデータを検索して、該当するデータがあったら勤務地を更新
    ↓
 Accessデータベースの接続を切断
    ↓
 処理完了メッセージを表示する

サンプルアプリのコード   アプリの作成手順はこちら

Option Explicit

Sub UpdateExcelDataFromAccess()
    
    ' 参照先ファイルのパスを格納する変数を定義
    Dim fn As String
    ' 参照先ACCESSファイルをダイアログから選択して、選択したファイルパスを格納する。
    fn = Application.GetOpenFilename(("ACCESSファイル (*.accdb), *.accdb"), , "ブックを選択して下さい。")

    If fn = "False" Then
      MsgBox "キャンセルしました。"
      Exit Sub
    End If
    
    ' Accessデータベースへの接続
    Dim conn As Object
    Set conn = CreateObject("ADODB.Connection")
    conn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & fn & " ;Persist Security Info=False;"
    
    ' 更新対象のテーブルとExcelデータの範囲を指定
    Dim tblName As String
    Dim keyColName As String
    Dim keyColIndex As Integer
    Dim excelDataRange As Range
    tblName = "社員一覧"
    keyColName = "社員No"
    Set excelDataRange = Range(Cells(1, 1), Cells(16, 6))
    
    ' 検索キーとなる「社員No」の列番号を取得
    keyColIndex = CInt(Application.Match(keyColName, excelDataRange.Rows(1), 0))
    
    ' Excelデータのレコードを1件ずつ処理
    Dim i As Integer
    For i = 2 To excelDataRange.Rows.Count
        ' キー列の値を取得
        Dim keyValue As Variant
        keyValue = excelDataRange.Cells(i, keyColIndex).Value
        
        ' 更新対象のレコードを取得
        Dim sql As String
        sql = "SELECT * FROM " & tblName & " WHERE " & keyColName & " = """ & keyValue & """;"
        Dim rs As Object
        Set rs = conn.Execute(sql)
        
        ' レコードが存在する場合はExcelデータを更新する
        If Not rs.EOF Then
            excelDataRange.Cells(i, 5).Value = rs.Fields("勤務地").Value
        End If
        
        rs.Close
    Next i
    
    ' Accessデータベースへの接続を切断
    conn.Close
    
    ' 完了メッセージを表示する
    MsgBox "更新が完了しました。"
    
End Sub

今回の処理とは逆にAccessのテーブルデータをExcelのデータを元に更新する方法は以下のリンク先をご覧ください。
  https://scodebank.com/?p=1114