2013-07-01 4 views
7

Posso utilizzare VBA per creare un nuovo ADODB.Connection e ADODB.Command e ADOBD associati. parametri e quindi creare un PivotCache e una tabella pivotCome posso utilizzare VBA per aggiungere una connessione (a un'origine dati esterna) in Excel e salvarlo nell'elenco di fogli di calcolo di Excel di Connections

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 

... ma dopo che ho eseguire questa macro, se controllo le proprietà di connessione nella lista Connessioni (nella scheda dati della barra multifunzione) compaiono disabilitato (in grigio) e il comando SQL non appare lì (limitando ulteriori modifiche solo tramite VBA).

Come posso creare questi stessi oggetti ma integrarli con l'interfaccia utente di Excel in modo che gli utenti futuri non debbano utilizzare VBA? Qualche idea?

risposta

7

È possibile utilizzare uno macro recorder per generare un codice VBA che aggiungerà una connessione all'istanza di Excel.
Ho aggiunto il codice alla fine di questa risposta, tuttavia è possibile generare il proprio se si seguono i passi di seguito:
1) Avviare un registratore di macro
2) Nella barra multifunzione, fare clic sulla scheda Data. Clicca sul Connections e quindi scegliere il pulsante Add come mostrato nello screenshot qui sotto
step 2
3) Nella schermata successiva, scegli la tua connessione DB esistente, e seguire i passi sui prossimi 2 o 3 schermi a configurare la connessione.
4) Una volta che la connessione viene stabilita e appare nell'elenco connessioni, fare clic sul pulsante Properties e sulla prossima schermata Export Connection File
4
5) Arrestare il registratore di macro e aperto VBE(alt+F11) e modificare il codice nel tuo Module1 6) Rimuovere queste righe dal codice macro

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

7) Salvare e chiudere il file ora

Nota quando si riapre il file ed eseguire la macro la connessione deve essere aggiunto all'elenco connessioni


è ora possibile aggiungere il collegamento dal file esportato con questo codice

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


o può eseguire il codice registrato e lasciare che la macro inserirlo per voi

+1

Stai implicando che le connessioni non vengano salvate nel file xls, ma possono essere esportate in un file .odc che viene caricato al prossimo avvio del file xls? – Sam

+0

se continui a perdere la stringa di connessione, questo è un modo per aggirare il problema da un file salvato. se lo si vuole ridistrare come è allora tutte le persone che usano il foglio di calcolo Excel potranno avere la propria stringa di connessione esportata/importata. –

+0

Grazie per il vostro aiuto. – Sam

Problemi correlati