web-dev-qa-db-ja.com

VBAを使用してExcelで(外部データソースへの)接続を追加し、そのExcelスプレッドシートの接続リストに保存するにはどうすればよいですか

VBAを使用して、新しいADODB.Connectionおよび関連するADODB.CommandとADOBD.Parameterを作成し、次にPivotCacheとPivotTableを作成できます。

Sub CreatePivotTable()
    'Declare variables
    Dim objMyConn As ADODB.Connection
    Dim objMyCmd As ADODB.Command
    Dim objMyParam As ADODB.Parameter
    Dim objMyRecordset As ADODB.Recordset

    Set objMyConn = New ADODB.Connection
    Set objMyCmd = New ADODB.Command
    Set objMyRecordset = New ADODB.Recordset

    'Open Connection'
    objMyConn.ConnectionString = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=True;Initial Catalog=myMIS;Data Source=localhost;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=WKSTN101;Use Encryption for Data=False;Tag with column collation when possible=False"
    objMyConn.Open

    'Set and Excecute SQL Command'
    Set objMyCmd.ActiveConnection = objMyConn
    objMyCmd.CommandText = "select a.col1, a.col2, b.col3, b.col4" & _
                           "from TableA a, TableB b " & _
                           "where a.col3=b.col5 " & _
                           "and a.col1=?"
    objMyCmd.CommandType = adCmdText

    Set objMyParam = objMyCmd.CreateParameter("COLUMN1", adChar, adParamInput, 20, Range("AnotherSheet!A3").Value)

    objMyCmd.Parameters.Append objMyParam

    'Open Recordset'
    Set objMyRecordset.Source = objMyCmd
    objMyRecordset.Open

    'Create a PivotTable cache and report.
    Set objPivotCache = ActiveWorkbook.PivotCaches.Add(SourceType:=xlExternal)
    Set objPivotCache.Recordset = objMyRecordset
    objPivotCache.CreatePivotTable TableDestination:=Range("A11"), TableName:="PivotTable1"

    With ActiveSheet.PivotTables("PivotTable1")
        .SmallGrid = False
        With .PivotFields("Col3")
            .Orientation = xlRowField
            .Position = 1
        End With
        With .PivotFields("Col4")
            .Orientation = xlRowField
            .Position = 1
        End With
        With .PivotFields("Col1")
            .Orientation = xlColumnField
            .Position = 1
        End With
        With .PivotFields("Col2")
            .Orientation = xlDataField
            .Position = 1
        End With
    End With

...しかし、このマクロを実行した後、[リボン]の[データ]タブにある[接続]リストの接続プロパティを確認すると、それらは無効(グレー表示)に表示され、SQLコマンドは表示されません(さらに制限されます) VBAを通じてのみ変更)。

これらの同じオブジェクトをどのように作成し、Excel UIと統合して、将来のユーザーがVBAを使用する必要がないようにできますか何か案は?

10
Sam

マクロレコーダー を使用して、Excelインスタンスへの接続を追加するVBAコードを生成できます。
この回答の最後にコードを追加しましたが、以下の手順に従うと、独自のコードを生成できます。
1)マクロレコーダーを開始する
2)リボンのDataタブをクリックします。 Connectionsをクリックして、Add下のスクリーンショットに示すようなボタン
step 2
3)次の画面で既存のDB接続を選択し、次の2または3画面の手順に従って接続を構成します。
4)接続が確立され、接続リストに表示されたら、Propertiesボタンをクリックし、次の画面Export Connection File
4
5)マクロレコーダーを停止してVBE(alt+F11)を開き、Module1 6)マクロコードからこれらの行を削除します

.ServerFillColor = False
.ServerFontStyle = False
.ServerNumberFormat = False
.ServerTextColor = False

7)今すぐファイルを保存して閉じます

ファイルを再度開いてマクロを実行すると、接続が接続リストに追加されます。


これで、このコードを使用して、エクスポートされたファイルから接続を追加できます

Workbooks("Book1").Connections.AddFromFile _
        "C:\Users\...\exported_file_name.odc"


または記録されたコードを実行して、マクロに追加させることができます

8
user2140173