Hat denn niemand eine Idee? :-(
Fehlen noch Informationen von mir?
Eremit
Guten Morgen,
Ich möchte eine komplette PostgreSQL-Relation in eine Excel-Tabelle kopieren. Zuerst wird dazu eine Verbindung zwischen Rechner und Server aufgebaut:
Der eigentliche Import geschieht mit einem VBA-Skript. In der Vergangenheit nahm ich dazu ein Makro auf, modifizierte dieses leicht - und es lief! So sah es aus:Code:plink.exe <nutzername>@<ip-adresse> -P 2222 -pw <passwort> -v -ssh -L 5432:localhost:5432
Nach der Umstellung auf Office 2010 in unserer Firma :-( funktionierte dies nicht mehr. Es kam Laufzeitfehler '1004': Allgemeiner ODBC-Fehler.Code:Sub tdb_ImportRelation(s As String) ' One relation called s is imported from databank ' fields of type 'text' lead to ODBC-errors and can therefore not be imported [...] With ActiveSheet.QueryTables.Add(Connection:= _ Array(Array("ODBC;DRIVER={PostgreSQL ANSI};DATABASE=<db-name>;SERVER=localhost;PORT=5432;PASSWORD=xxxxxx;UID=<nutzer-name>;;SSLmode=disable;ReadOnly=1;Protocol=7.4;FakeOidI")), Destination:=Range("A1")) .CommandText = Array("SELECT * FROM ""public""." & Chr(34) & s & Chr(34)) .Name = "qt_1" .FieldNames = True .RowNumbers = False .FillAdjacentFormulas = False .PreserveFormatting = True .RefreshOnFileOpen = False .BackgroundQuery = True .RefreshStyle = xlInsertDeleteCells .SavePassword = True .SaveData = True .AdjustColumnWidth = True .RefreshPeriod = 0 .PreserveColumnInfo = True .Refresh BackgroundQuery:=False End With [...] ' Bei jeder Abfrage wird eine QueryTable als benannter Bereich im Register Clipboard abgelegt. ' Wenn man die nicht löscht, gibts davon irgendwann hunderte und es können dubiose ODBC-Fehler auftreten. ActiveSheet.QueryTables(1).Delete End Sub
Mein erster Gedanke war, dass durch das Aufspielen von Office 2010 der Treiber entfernt worden sein könnte. Den ursprünglichen Treiber hatte ich mir als zip "psqlodbc-08_02_0400.zip" runtergeladen und installiert. Der aktuell installierte Treiber stammt aus einem zip namens psqlodbc_09_00_0200-x64.zip, direkt von der PostgreSQL-Homepage. Die Treiberdatei heißt psqlodbc_x64.msi. Leider ging es dann immer noch nicht.
Daraufhin habe ich mir den alten Code angeschaut und gedacht, dass Excel vielleicht das eine oder andere überflüssige Zeug da rein geschrieben hatte. Da ich denke, dass einfacher Code tendenziell auch weniger Fehler enthält, habe ich ihn folgendermaßen umgeschrieben:
Leider geht das noch immer nicht.Code:Sub tdb_ImportRelation(s As String) ' One relation called s is imported from databank ' fields of type 'text' lead to ODBC-errors and can therefore not be imported Dim ConnectionString As String Dim SQLString As String Dim rng As Range [...] ConnectionString = "ODBC;DATABASE=<db-name>;SERVER=localhost;PORT=5432;UID=<nutzername>;PASSWORD=xxxxxx;DRIVER={PostgreSQL ANSI};PROTOCOL=7.4" SQLString = "SELECT * FROM ""public""." & Chr(34) & s & Chr(34) Set rng = ActiveSheet.Range("A1") ' With ActiveSheet.QueryTables.Add(Connection:=Array(Array(ConnectionString), rng, SQLString)) With ActiveSheet.QueryTables.Add(ConnectionString, rng, SQLString) .Name = "qt_1" .Refresh End With [...] ' Bei jeder Abfrage wird eine QueryTable als benannter Bereich im Register Clipboard abgelegt. ' Wenn man die nicht löscht, gibts davon irgendwann hunderte und es können dubiose ODBC-Fehler auftreten. ActiveSheet.QueryTables(1).Delete End Sub
Weitere Informationen:
- PostgreSQL 8.3.8
- Mein Rechner = Windows 7 64 bit, 8GB Arbeitsspeicher, Office 2010.
Für Tips wäre ich dankbar.
Eremit
Hat denn niemand eine Idee? :-(
Fehlen noch Informationen von mir?
Eremit
--
https://www.xing.com/profile/Andreas_Kretschmer7ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
Leider kann ich mir nicht aussuchen, ob und wann in unserer Firma diese Updates eingespielt werden. Die Hilfefunktionen von Office helfen (wie meistens) nicht weiter.
Der Import nach Excel geschieht nicht ohne Grund. Was meinst Du mit "einfach CSV nutzen"?
In der Zwischenzeit habe ich herausgefunden, dass die ODBC-Verbindung in dem vor mir oben angegebenen verkürzten Code unter Windows XP (aber mit Office 2010) funktioniert - weiß der Himmel warum. Aber ich wäre nicht der Erste, der sich Altrechner ins Büro stellt, um den Udates unserer IT zu entkommen... Der Trend geht bei uns klar zum Zweit- oder gar Drittrechner ;-)
Eremit
Suchergebnisse für
Dann macht ihr tendenziell was falsch...In der Zwischenzeit habe ich herausgefunden, dass die ODBC-Verbindung in dem vor mir oben angegebenen verkürzten Code unter Windows XP (aber mit Office 2010) funktioniert - weiß der Himmel warum. Aber ich wäre nicht der Erste, der sich Altrechner ins Büro stellt, um den Udates unserer IT zu entkommen... Der Trend geht bei uns klar zum Zweit- oder gar Drittrechner ;-)
Eremit
Andreas
--
https://www.xing.com/profile/Andreas_Kretschmer7ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
Um diesen Thread abzuschließen: ich kriege diese Abfrage nur mit Windows XP und Office <=2007 zum Laufen. Hier nochmal der Code:
Um die query tables zu löschen, empfiehlt sich am Ende der Prozedur der folgende Code:Code:Sub tdb_ImportRelation(s As String) ' One relation called s is imported from databank ' fields of type 'text' lead to ODBC-errors and can therefore not be imported Dim ConnectionString As String Dim SQLString As String Dim ZellAdresse As String Dim rng As Range ' First delete present contents. Important, because, when data sets were deleted in the databank ' one or more lines at the end of each list remain, leading to seemingly duplicate IDs. ' In this example data are imported into a sheet called 'Clipboard' and in thereafter are ' moved to different locations within the file tdb_SelectClipboard tdb_ClearSheet ' Get data from the databank ConnectionString = "ODBC;DATABASE=<dbname>;SERVER=localhost;PORT=<portnumber>;UID=<username>;PASSWORD=xxyyzz;DRIVER={PostgreSQL ANSI};PROTOCOL=7.4" SQLString = "SELECT * FROM ""public""." & Chr(34) & s & Chr(34) Set rng = ActiveSheet.Range("A1") With ActiveSheet.QueryTables.Add(ConnectionString, rng, SQLString) .RefreshStyle = xlInsertDeleteCells .PreserveFormatting = True ' Nur mit der folgenden Zeile gelingt später das Löschen der QueryTables ... .Refresh BackgroundQuery:=False ' ... und mit dieser nicht :-) '.Refresh End With ' Copy imported data from register clipboard to the other registers Range("A1").Select tdb_SelectWrittenRange Selection.Copy Application.Goto Reference:="import_" & s tdb_PasteValues End Sub
Trotzdem vielen Dank für alle Antworten.Code:Sub tdb_DeleteAllQueries() Dim qt As QueryTable Dim WSh As Worksheet For Each WSh In ThisWorkbook.Worksheets For Each qt In WSh.QueryTables qt.Delete Next qt Next WSh End Sub
Eremit
Links: Tobias Bauer - IT- und Funkdienstleistungen - Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen - Funkforum
Lesezeichen