見出し画像

【自動化】実行ユーザーごとで接続文字列を変更しよう!【VBA】

みなさん。こんにちは!
VBAで外部データをやりとりするツールがやっと完成!
でも他のユーザーに実行してもらうと接続文字列を自分用に設定してしまっていて動かないので、ユーザー自身にコードを書き換えてもらって…。
これだとあまりに不便ですよね。
ということで!接続文字列をユーザーごとに自動で書き換えて接続してくれるコードをご紹介します!
今回はSQL Serverを使いますが、一部分をご自身が利用するデータベース用に書き換えれば応用できます!


テスト準備

SQL Serverから取得するデータ、「users」テーブルを作成します。

テスト用テーブル

フォーム準備

まずは、データベースに接続する処理を実行させるフォームを作ります!

データベースに接続するためのフォーム

ここでのポイントは接続文字列に必要な要素をフォームで入力してもらえるようにテキストボックスを用意することです!
では、接続文字列に必要な要素とは何かを説明していきます。

★で囲んでいる部分がユーザーごとで変化する部分

ConnectionString = "DRIVER=SQL Server;" _
                     & "Server= ★サーバー名★ ;" _
                     & "Database= ★データベース名★ ;" _
                     & "TrastConnection:No;" _
                     & "UID= ★ユーザ★ ;" _
                     & "PWD= ★パスワード★ ;"

使用するデータベースで接続文字列の書き方が変わるので、書き方を調べて、フォームも作り変えてください!

コードで文章を固定してしまうと、

  1. コード画面を開く

  2. 接続文字列を生成しているコードを探す

  3. 書き換える

  4. コード画面を閉じる

  5. 実行

というようにユーザーにたくさんステップを踏ませてしまい、不便です。
そのため、フォームでユーザーに入力してもらった情報を接続文字列に書き込むようにすれば、

  1. フォームに接続情報を入力する

  2. 実行

となり、利便性がかなり向上します。

コード

以下、VBAコードです。

'「接続する」ボタンを押下して動く処理
Private Sub btnSqlConnect_Click()
    
    Dim cnSQL As New ADODB.Connection
    Dim rsSQL As New ADODB.Recordset
    
    'SQL Server用の接続文字列関数の呼び出し
    strSQLConn = Me.BuildSQLConnectString
    
  '関数の結果、空だった場合は処理終了
    If strSQLConn = "" Then Exit Sub
  
  '関数で作成した接続文字列で接続
    cnSQL.Open strSQLConn
    
    rsSQL.Open "users", cnSQL, , adLockReadOnly
    
    Debug.Print "id:" & rsSQL("id") & " name:" & rsSQL("name")

    Set cnSQL = Nothing
    Set rsSQL = Nothing

End Sub
'===================================================
'SQL Server接続文字列作成
'
'引数:
'
'戻り値:
'   True       接続文字列
'  False       空文字
'===================================================
Function BuildSQLConnectString() As String

    Dim ret As String '戻り値用変数
    
    '入力値チェックしつつ、接続文字列組み立て
    If IsNull(Me.Server) Or _
       IsNull(Me.Database) Or _
       IsNull(Me.Uid) Or _
       IsNull(Me.Pwd) Then
        
        Call MsgBox("「SQL Server接続情報」に未入力の項目があります。" & vbCrLf & "全項目入力してください。", vbOKOnly, "SQLServer接続文字列組み立て不可")
    Else
        ret = "DRIVER=SQL Server;" _
                & "Server=" & Me.Server & ";" _
                & "Database=" & Me.Database & ";" _
                & "TrastConnectio=:No;" _
                & "UID=" & Me.Uid & ";" _
                & "PWD=" & Me.Pwd & ";"
    End If
    
    BuildSQLConnectString = ret
    
End Function

肝になるのは2節目の関数です。
フォームで入力した内容をMeキーワードで取得して、フォーム準備で説明した部分に当てはめています。
フォームの入力でどれか1つでも空だった場合はエラーメッセージを表示させて戻り値に空文字を返す処理を行っています。

実行結果

実行結果

イミディエイトウィンドウにテストで作成したテーブルのデータが表示されていますね!
今回はDebug.Printでイミディエイトウィンドウに表示させていますが、Recordsetオブジェクトで情報を受け取っているので汎用性が高いです!

おわりに

VBAの接続文字列は出現頻度が多いので、少しでも便利に使えるようにしたいですよね!
この記事以外にもVBAについて便利にするための記事をたくさん投稿していますので、よろしければそちらもご覧ください!
最後までお読みいただき、ありがとうございました!

この記事が気に入ったらサポートをしてみませんか?