2013-07-01 3 views
7

Mogę użyć języka VBA do utworzenia nowego ADODB.Connection i powiązanego polecenia ADODB.Command i ADOBD. parametr, a następnie utworzyć PivotCache oraz tabelę przestawnąJak używać VBA do dodawania połączenia (do zewnętrznego źródła danych) w programie Excel i zapisywania go na tej liście arkuszy kalkulacyjnych programu Excel

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 

... ale po ja uruchomić to makro, gdybym sprawdzić właściwości połączenia na liście połączeń (w zakładce Dane wstęgi) pojawiają się one wyłączone (wyszarzone) i polecenie SQL nie pojawia się tam (ograniczając dalsze zmiany tylko za pomocą VBA).

Jak mogę utworzyć te same obiekty, ale czy można je zintegrować z interfejsem Excel, aby przyszli użytkownicy nie musieli używać VBA? Jakieś pomysły?

Odpowiedz

7

Można użyć kodu macro recorder, aby wygenerować kod VBA, który doda połączenie z instancją programu Excel.
Dodałem kod na końcu tej odpowiedzi, ale można wygenerować swój własny, jeśli wykonaj poniższe czynności:
1) Uruchom makro rejestrator
2) Na wstążce kliknij kartę Data. Kliknij na Connections a następnie wybierz przycisk Add jak pokazano na poniższym zrzucie
step 2
3) Na następnym ekranie wybierz istniejącego połączenia DB, i wykonaj kroki na następne 2 lub 3 ekrany do skonfiguruj połączenie.
4) Gdy połączenie zostanie nawiązane i pojawi się na liście połączeń, kliknij przycisk Properties i na następnym ekranie Export Connection File
4
5) Zatrzymaj makro rejestrator i otwartego VBE(alt+F11) i edytować kod w swoim Module1 6) Usuń te linie z kodu makra

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

7) Zapisz i zamknij plik teraz

Uwaga Po ponownym otwarciu pliku i uruchomić makro połączenie ma być dodany do listy połączeń


można teraz dodać połączenie z eksportowanego pliku z tym kodem

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


lub można uruchomić zapisany kod i niech makro dodać go dla Ciebie

+1

Czy sugerujesz, że połączenia nie zostały zapisane w pliku xls, ale można je wyeksportować do pliku .odc, który zostanie załadowany przy następnym otwarciu pliku xls? – Sam

+0

, jeśli nadal tracisz połączenie, jest to praca do pobrania z zapisanego pliku. jeśli ponownie go zarejestrujesz, wówczas wszystkie osoby korzystające z arkusza kalkulacyjnego Excela będą mogły eksportować/importować własny ciąg połączenia. –

+0

Dzięki za pomoc. – Sam

Powiązane problemy