Hallo zusammen,
ich bin ein VBA-Newbie und beschäftige mich seid einigen Tagen mit der Sache. Generell wollen wir Berichte mit einer variablen Zahl von Pivot-Tabellen in Excel erstellen, deren Datenquellen auf einem MS SQL-Server liegen.
Dafür habe ich eine Subroutine erstellt, die eine einzelne Pivot-Tabelle zu einem Projekt erstellen soll, dessen Namen übergeben wird:
Private Sub BuildTable(project As String)
Dim dateStart As String
Dim dateEnd As String
Dim sqlQuery As String
Dim pt As PivotTable
Dim tmpConn(0 To 1) As String
tmpConn(0) = "Driver={SQL Server};Server=MyServer;Database=My_Database;UID=MyUser;Pwd=MyPwd"
tmpConn(1) = "USE [My_Database] EXEC dbo.Get_MyData '" & dateStart & "', '" & dateEnd & "', '" & project & "'"
dateStart = Format(dt1.Value, "yyyymmdd")
dateEnd = Format(dt2.Value, "yyyymmdd")
Set pt = ActiveWorkbook.PivotCaches.Add(SourceType:=xlExternal, SourceData:=tmpConn).CreatePivotTable(TableDestination:=ActiveWorkbook.Worksheets(1).Range("A7"))
...
Hier kommt noch mehr Code
...
End Sub
Debugge ich diese Routine nun schrittweise, so bekomme ich bei der Zeile "Set pt = ..." die Fehlermeldung "Laufzeitfehler 1004: Anwendungs- oder objektorientierter Fehler".
Die Routine wird von einer anderen Rotuine aus demselben Modul aufgerufen. Die Variablen "project", "dateStart" und "dateEnd" werden auch korrekt übergeben bzw. korrekt ausgelesen (habe ich mit MsgBox überprüft). Der SQL-EXEC Befehl funktioniert auch korrekt, wenn ich ihn auf der Datenbank selber ausführe.
Generell scheine ich irgendwie Verständnisprobleme mit diesen DB-Connections zu haben. Ich weiß dann nie, ob ich ODBC / ADODB oder was auch immer verwenden soll (bei MS SQL wäre es ja wahrscheinlich ADODB) und v.a. wie ich es benutze. Den obigen Connection-String habe ich z.B. aus Excel kopiert, nachdem ich mit dem SQL-Query-Wizard eine erfolgreiche Verbindung zur DB aufgebaut habe.
Am liebsten wäre mir sogar, wenn ich beim öffnen des Workbooks eine Verbindung aufbauen und dann auch ein Passwort eingeben muss, da ich das ungern im Code speichern würde. Aber diese Verbindung muss dann ja irgendwann auch wieder geschlossen werden, oder? Vielleicht habt ihr ja ein paar Tipps, wie man das machen könnte und was ich dabei beachten muss (v.a. beim Fehlerhandling).
Viele Grüße
Tobias
|