SqlServerからのリンクテーブルを一括に変更するVBAを作成したのはいいのですが、リンクテーブルの一部に別のデータベースからのリンクテーブルがありました。
【Sqlserver】複製したデータベースにAccessで接続しストアドが動くのかの実験(データベース複製実験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で設定した別データベースのリンクテーブルに張り直してくれるのです。