パソコン情報

【Access】データベースの違うODBCリンクテーブルを一括に変更する方法

SqlServerからのリンクテーブルを一括に変更するVBAを作成したのはいいのですが、リンクテーブルの一部に別のデータベースからのリンクテーブルがありました。

https://pctips.jp/server/stored-detabase-3

ココがポイント

今回は、データベースの違うリンクテーブルを一括で変更する方法を備忘録にしました。

VBAでDAOを使うので参照設定から追加(エラー)

なんで、DAOだとか、ADOだとかあるのか自分には良く理解できませんが、どうしても参考コードがDAOを使用している時があるので、そんな時は、参照設定から、「microsoft DAO 3.6 Object Library」ってのを追加していました。

今回も追加しようとすると、下記のような変なエラーがでました。

なんなんですか!?ってことで調べると、

注意ポイント

Microsoft Office 15.0 Access database engine Object Library」 が参照設定に追加されているのであれば、「microsoft DAO 3.6 Object Library」 を追加する必要はありませんとの事でした。

しるかよ!!

なんかもっと親切に自動で追加されるとかならないのでしょうかね。

本当に不親切なエラーは困る。

データベースが違う対応済VBAコード

Private Sub link_t_btn_Click()
Dim db As DAO.DATABASE, tb As DAO.TableDef
Dim strCon As String
Dim strCon2 As String
 
Dim idns As String
Dim idatabase As String
Dim iuid As String
Dim ipwd As String
Dim iserver As String

idns = DNS
idatabase = DATABASE
iuid = UID
ipwd = PWD
iserver = SERVER
 
'接続文字列(データソースレス接続形式)
strCon = "Driver={SQL Server};DATABASE=" & idatabase & ";UID=" & iuid & ";PWD=" & ipwd & ";SERVER=" & iserver & ""
strCon2 = "Driver={SQL Server};DATABASE=別データベース;UID=別ID;PWD=別パスワード;SERVER=" & iserver & ""
    Set db = CurrentDb

    For Each tb In db.TableDefs
        If tb.Connect <> "" Then
        tb.Connect = strCon
                    
                If tb.name = "dbo_login_user" Or tb.name = "dbo_total_master_client" Then
                
                tb.Connect = strCon2
                
                End If

    '                Debug.Print tb.name

                tb.RefreshLink
        End If
    Next tb

MsgBox "終了しました。"


End Sub

上記コードのポイントは、データベースへの接続文字列を2つ準備しておくことがポイントになるかと思います。今回は、2つのデータベースですが、もっとある場合は、そのデータベース分増やせば対処できるかと思います。

strCon = "Driver={SQL Server};DATABASE=" & idatabase & ";UID=" & iuid & ";PWD=" & ipwd & ";SERVER=" & iserver & ""

strCon2 = "Driver={SQL Server};DATABASE=別データベース;UID=別ID;PWD=別パスワード;SERVER=" & iserver & ""

strConに関しては、フォームからの値を引っ張ってきていますが、strCon2に関しては、別データベースの接続情報をダイレクトに入れております。(サーバーだけは引用)

その時に注意ポイントがダブルコーテーションとかでいつも悩まされますよね。

strCon2 = "Driver={SQL Server};DATABASE=test_database;UID=user;PWD=pctips12345;SERVER=" & iserver & ""

ココがポイント

ダブルコーテーションで囲わないでダイレクトに入れていいようです。

VBAでの注意点(ダブルコーテーション)

SqlserverへのODBC接続文字列は、ダブルコーテーションで囲うことなく・・・本当に初歩的なことなのかもしれませんが、自分にはこの違いが難しくて理解できないのです。

 

IF分で、別データベースの特定のリンクテーブルの張り直しをする時の、

ココがポイント

テーブルを指定する場合はダブルコーテーションで囲います。

If tb.name = "dbo_login_user" Or tb.name = "dbo_master_client" Then
   tb.Connect = strCon2
End If

 

上記のIF分により、データベースの違うテーブルになった場合に、strCon2で設定した別データベースのリンクテーブルに張り直してくれるのです。