PDA

Vollständige Version anzeigen : Connection String


aladdin
20.06.2012, 05:41
Guten Tag

In meiner Excel Applikation werden gewisse Daten via ConnectionString aus ACCESS geholt. Mit ACC XP und EXCEL XP Kein Problem. Die nach ACC und EXCEL 2007 / 2010 konvertierte Applikation funktioniert auch gut, bis eben
auf die Connection.

Da unten seht Ihr den Code eines Moduls. Die BLAU markierte Connection-String habe ich gebraucht für die Verbindung ACC XP - EXCEL XP. Für die konvertierte Dateien ACC 2007 - EXCEL 2007 habe ich anstelle dieser Strings die ROT markierte String eingefügt. Leider ohne Erfolg (d.h. das Programm wird ohne Fehlermeldungen geladen, die Grafiken (in diesem Modul der Verlauf von HDL-Werte (Feld = Kontrolle.res4)) bleiben aber leer ohne Zahlen. Die Connention String für ACC und EXCEL XP hat aber einwandfrei funktioniert! Vielleicht seht Ihr gerade ob im Code ein Fehler ist oder etwas fehlt.

Herzlichen Dank in Voraus und freundliche Grüsse

Aladdin

CODE:

Sub verlaufhdl()

Application.ScreenUpdating = False

Sheets("Tabelle5").Select
While ActiveSheet.QueryTables.Count > 0
ActiveSheet.QueryTables(1).Delete
Wend

Range("a11:e29").ClearContents

Dim strPath As String
Dim strFile As String
Dim strConnection As String
Dim strSQL As String
Dim strBedingung As String
Dim strBedingung1
Dim rngzelle As Range

rem FUER XP (funktioniert problemlos)

Rem strPath = "C:\glycoscope\"
Rem strFile = strPath & "patientenx.mdb"
Rem strConnection = "ODBC;DSN=Microsoft Access-Datenbank;DBQ=" & strFile & _
Rem ";DefaultDir=" & strPath & ";DriverId=25;FIL=MS Access;MaxBufferSize=2048;PageTimeout=5;"

rem FUER 2007 / 2010 (Die Daten werden nicht importiert (s. unten Daten-Selektion)

strConnection = "Provider = Microsoft.ACE.OLEDB.12.0;" & _
"Data Source =C:\glycoscope\patientenx.accdb;Persist Security Info=False;"


Dim intbezkontrollx
Dim alterkontrollx, namekontrollx, vornamekontrollx

Open "c:\glycoscope\pattemp\detgh" For Input As #26
Input #26, intbezkontrollx, alterkontrollx, namekontrollx, vornamekontroll
xClose #26

Range("a2") = alterkontrollx
Range("a9") = namekontrollx
Range("b9") = vornamekontrollx
Range("c9") = intbezkontrollx

Dim permax As Integer
permax = 90
permax = Val(Year(Now)) - permax

strBedingung = intbezkontroll
strBedingung1 = permax

rem DATEN-SELEKTION

strSQL = "SELECT Kontrolle.Namekontroll, Kontrolle.Vornamekontroll, Kontrolle.intbezkontroll, Kontrolle.jahrnr, Kontrolle.res4 " & _
"FROM Kontrolle Kontrolle WHERE (Kontrolle.intbezkontroll='" & strBedingung & "') and (Kontrolle.jahrnr>=" & strBedingung1 & ")"

With ActiveSheet.QueryTables.Add(Connection:=strConnection, Destination:=Range("a11"))
.CommandText = strSQL

.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

For Each rngzelle In Range("a11").CurrentRegion
If IsNumeric(rngzelle.Value) Then
rngzelle.Value = Val(rngzelle.Value)
End If
Next

Range("a11:e11").ClearContents

Call sortjahr4
Call nullerwegxyz
Call leerzell2
Call anpassenxyz

End Sub

Atrus2711
20.06.2012, 07:43
Hi,
der rote String klingt eher nach ADO-Connection statt ODBC; die TrustedConnection sogar nach SQL-Server...

versuchs mal so:
DSN=MS Access Database;DBQ=c:\pfad\deine.accdb;DefaultDir=C:\pfad;DriverId=25;FIL=MS Access;MaxBufferSize=2048;PageTimeout=5;

aladdin
22.06.2012, 06:39
Hallo Atrus, vielen Dank, werde es versuchen.

Gruss
Aladdin

aladdin
24.06.2012, 10:02
Hallo Atrus

Ich habe Deine Lösung eingebaut, leider funktioniert es immer noch nicht.
Bin ziemlich hilflos, da der Verlauf der Werte eine sehr wichtige Komponente des Programmes ist. Gibt es weitere Lösungsvorschläge?

Danke in Voraus und Gruss
Aladdin

Thomas Möller
24.06.2012, 10:46
Hallo!

Ich habe Deine Lösung eingebaut, leider funktioniert es immer noch nicht.

Infos über Connection-Strings findest Du auf der gleichnamigen Webseite:
http://www.connectionstrings.com/access-2007

HTH

aladdin
25.06.2012, 14:08
Hallo, vielen Dank, diese Webseite habe auch konsultiert und die Conn Str so eingegebn wie auf diese Seite beschrieben, geht aber ebne nicht.

Gruss
Aladdin

Atrus2711
25.06.2012, 14:12
Versuche mal, die Daten in Access als Tabelle einzubinden (Extras/Externe Daten bzw. ab 2007 Ribbon "Externe Daten". Wenn das klappt, kannst du die Connection so auslesen:
Debug.print Currentdb.TableDefs("EingelinkteTabelle").Connect

aladdin
25.06.2012, 17:53
Danke Atrus, eine interessante Möglichkeit. Also ich habe jetzt in Excel via Externe Daten --> aus ACCESS --> Neues Arbeitsblatt die Daten aus ACC importieren können. Jetzt habe ich diese in der neuen Tabelle. Sorry wenn ich frage, bin halt nicht ein Profi, wo muss ich den Code " Debug.print Currentdb.TableDefs("EingelinkteTabelle" - also die neue Tabelle z.B. Tabelle 5 ?)-.Connect " eingeben? In einem Excel Modul?

Herzlichen Dank in Voraus
Aladdin

Thomas Möller
25.06.2012, 18:52
Hallo!

Sorry wenn ich frage, bin halt nicht ein Profi, wo muss ich den Code " Debug.print Currentdb.TableDefs("EingelinkteTabelle" - also die neue Tabelle z.B. Tabelle 5 ?)-.Connect " eingeben?

den Code kannst Du direkt in das Direktfenster des VBA-Editors eintragen. Diesen kannst Du mit STRG+G öffnen.

HTH

aladdin
26.06.2012, 07:53
Vielen Dank. OK, jetzt habe ich im EXCEL, VBA Editor, Direktbereich den Code

"Debug.print Currentdb.TableDefs("Tabelle18").Connect" eingetippt. Wenn ich aber auf ENTER clicke, erscheint die Fehlermeldung "Laufzeitfehler 424 Objekt erforderlich" obwohl die eingefügte Tabelle18 mit den importierten Werten da ist. Was mache ich falsch? Muss etwa die Datenquelle (ACC DB) aich geöffnet sein?

Danke für Ihre Unterstützung
Aladdin

Atrus2711
26.06.2012, 08:16
Das war VBA-Code für Access...

aladdin
26.06.2012, 09:46
Danke. Mal checken, ob ich das Ganze begriffen habe. Die Connection String befindet sich in der EXCEl-Applikation, dort sollten gewisse Daten aus ACC importiert werden.

Also ich habe jetzt in EXCEL via Externe Daten --> aus ACCESS --> Neues Arbeitsblatt die gewünschte Daten aus ACCESS importieren können. Jetzt habe ich diese im Excel in einer neuen Tabelle (Tabelle18).

Nun muss ich also im ACCESS im Direktbereich
den Code Debug.print Currentdb.TableDefs("EingelinkteTabelle") .Connect eingeben. Als eingelinkte Tabelle wird den vollständigen Pfad gemeint? z.B. c:\glycoscope\Verlauf.xlsm\Tabelle18 gemeint?

Danke fürs Feedbäck und für die Bemühungen
Aladdin

Atrus2711
26.06.2012, 10:03
Halt, ich war auf dem falschen Dampfer. Ich hatte im Sinn, Exceldaten nach Access zu schaufeln. Du willst ja andersrum... :grinange:

sorry. Also hier der Weg:
Starte in Excel eine Makroaufzeichnung, und binde dann einmalig manuell die Accesstabelle ein. Der entstehende Code sollte die Connection enthalten.

aladdin
02.07.2012, 13:54
Hallo Atrus

Also ich habe hier das Makro, mit welchem ich die Daten aus ACC importiert habe. Die Daten werden alle in einem neuen Sheet importiert. Nun, mein Problem ist, dass ich vom Ganzen NUR die Connection String brauche, und zwar als strConnection definiert, weil die Selektion und die Plazierung der Daten separat erfolgen (s. unten den grün markierten Teil, welcher im Code des funktionierenden XP-Modul enthalten ist - siehe Mein Betrag v. 20.06, 6:41 Uhr). Das Ganze ist etwas "zu höh" für mich... Ich habe erfolgslos versucht mit: strConnection= "SourceType: = 0, source:= Array(.... bis Support Complex Data = False":(

Danke für die Geduld, bin wirklich verzweifelt..
Gruss Aladdin

'Manuell Import-Makro
'
ActiveWorkbook.Worksheets.Add
With ActiveSheet.ListObjects.Add(SourceType:=0, source:=Array( _
"OLEDB;Provider=Microsoft.ACE.OLEDB.12.0;Password="""";User ID=Admin;Data Source=C:\Glycoscope\Patientenx2010.accdb;Mode=Share Deny Write" _
, _
";Extended Properties="""";Jet OLEDB:System database="""";Jet OLEDB:Registry Path="""";Jet OLEDB:Database Password="""";Jet OLEDB:Engine " _
, _
"Type=6;Jet OLEDB:Database Locking Mode=0;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New " _
, _
"Database Password="""";Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don't Copy Locale on Comp" _
, _
"act=False;Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False;Jet OLEDB:Support Complex Data=False" _
), Destination:=Range("$A$1")).QueryTable
.CommandType = xlCmdTable
.CommandText = Array("Kontrolle")
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.PreserveColumnInfo = True
.SourceDataFile = "C:\Glycoscope\Patientenx2010.accdb"
.ListObject.DisplayName = "Tabelle_Patientenx2010.accdb"
.Refresh BackgroundQuery:=False
End With
End Sub



strSQL = "SELECT Kontrolle.Namekontroll, Kontrolle.Vornamekontroll, Kontrolle.intbezkontroll, Kontrolle.jahrnr, Kontrolle.res4 " & _
"FROM Kontrolle Kontrolle WHERE (Kontrolle.intbezkontroll='" & strBedingung & "') and (Kontrolle.jahrnr>=" & strBedingung1 & ")"

With ActiveSheet.QueryTables.Add(Connection:=strConnection, Destination:=Range("a11"))
.CommandText = strSQL

Atrus2711
02.07.2012, 15:22
Hi,

Excel trennt den Connectionstring in einen Stapel (Array) von "Scheibchen" auf, da der Connectionstring ziemlich lang werden kann. Access braucht den String "am Stück".

Das ist aber kein Problem: entweder du lässt das Array mit Join() als Text ausgeben, oder du entstapelst das durch scharfes Hingucken. Es entsteht:

OLEDB;Provider=Microsoft.ACE.OLEDB.12.0;Password="";User ID=Admin;Data Source=C:\Glycoscope\Patientenx2010.accdb;Mode=Share Deny Write;Extended Properties="";Jet OLEDB:System database="";Jet OLEDB:Registry Path="";Jet OLEDB:Database Password="";Jet OLEDB:EngineType=6;Jet OLEDB:Database Locking Mode=0;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Password="";Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don't Copy Locale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False;Jet OLEDB:Support Complex Data=False

PS: Diese String ist kein Code, sondern eben der Connectionstring. Dein Excel-Code enthielt Smilies, die durch die Zeichenfolge : D im String eben als Smilies missdeutet wurden. Ich hoffe, ich habe alle Smilies wieder recodiert.... ;)

aladdin
02.07.2012, 16:56
Hallo Atrus (Martin)

Vielen, vielen Dank für Deine Bemühungen! Ich werde es ausprobieren, leider erst in ca. eine Woche, da ich heute abend dringend ins Ausland reisen muss. Ich hoffe, es wird dann funktionieren (falls nicht, sicher meineswegens...) ansonsten werde ich mich wieder melden.

Nochmals herzlichen Dank und Gruss

Aladdin

aladdin
02.07.2012, 17:02
Hallo Atrus (Martin)

Vielen, vielen Dank für Deine Bemühungen! Ich werde es ausprobieren, leider erst in ca. eine Woche, da ich heute abend dringend ins Ausland reisen muss. Ich hoffe, es wird dann funktionieren (falls nicht, sicher meineswegens...) ansonsten werde ich mich wieder melden.

Nochmals herzlichen Dank und Gruss

Aladdin

aladdin
03.07.2012, 03:57
Guten Tag Atrus

Vor meiner Reise ins Ausland habe "Dein" String noch eingebaut (da unten, farbig), leider funktioniert immer noch nicht. Komisch, weil die "manuelle" Verbindung (Excel - Externe Daten aus ACC...) klappt und die Daten aus ACC importiert werden.. Ist irgendwo im aus Makro extrapolierten Satz noch ein Syntaxfehler?

Im Original Code der Excel-App sind keine Snilies enthalten. Keine Ahnung, warum wenn ich den Code kopiere und im Forum-Beitrag einfüge, die "D" in Smilies umgewandelt werden (aberst dann, wenn ich den Beitrag sende) ...??


Danke und Gruss
Aladdin

CODE:

Sub verlaufhdl()

Application.ScreenUpdating = False

Sheets("Tabelle5").Select
While ActiveSheet.QueryTables.Count > 0
ActiveSheet.QueryTables(1).Delete
Wend

Range("a11:e29").ClearContents

Dim strPath As String
Dim strFile As String
Dim strConnection As String
Dim strSQL As String
Dim strBedingung As String
Dim strBedingung1
Dim rngzelle As Range

rem FUER XP (funktioniert problemlos)

Rem strPath = "C:\glycoscope\"
Rem strFile = strPath & "patientenx.mdb"
Rem strConnection = "ODBC;DSN=Microsoft Access-Datenbank;DBQ=" & strFile & _
Rem ";DefaultDir=" & strPath & ";DriverId=25;FIL=MS Access;MaxBufferSize=2048;PageTimeout=5;"

rem FUER 2007 / 2010 (Die Daten werden nicht importiert (s. unten Daten-Selektion)

rem strConnection = "Provider = Microsoft.ACE.OLEDB.12.0;" & _
"Data Source =C:\glycoscope\patientenx.accdb;Persist Security Info=False;"

rem NEU von DIR (ATRUS) Connection String:

strConnection = "OLEDB;Provider=Microsoft.ACE.OLEDB.12.0;Password ="";User ID=Admin;Data Source=C:\Glycoscope\Patientenx2010.accdb;Mode=Share Deny Write;Extended Properties="";Jet OLEDB:System database="";Jet OLEDB:Registry Path="";Jet OLEDB:Database Password="";Jet OLEDB:EngineType=6;Jet OLEDB:Database Locking Mode=0;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Password="";Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don't Copy Locale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False;Jet OLEDB:Support Complex Data=False"



Dim intbezkontrollx
Dim alterkontrollx, namekontrollx, vornamekontrollx

Open "c:\glycoscope\pattemp\detgh" For Input As #26
Input #26, intbezkontrollx, alterkontrollx, namekontrollx, vornamekontroll
xClose #26

Range("a2") = alterkontrollx
Range("a9") = namekontrollx
Range("b9") = vornamekontrollx
Range("c9") = intbezkontrollx

Dim permax As Integer
permax = 90
permax = Val(Year(Now)) - permax

strBedingung = intbezkontroll
strBedingung1 = permax

rem DATEN-SELEKTION

strSQL = "SELECT Kontrolle.Namekontroll, Kontrolle.Vornamekontroll, Kontrolle.intbezkontroll, Kontrolle.jahrnr, Kontrolle.res4 " & _
"FROM Kontrolle Kontrolle WHERE (Kontrolle.intbezkontroll='" & strBedingung & "') and (Kontrolle.jahrnr>=" & strBedingung1 & ")"

With ActiveSheet.QueryTables.Add(Connection:=strConnection, Destination:=Range("a11"))
.CommandText = strSQL

.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

For Each rngzelle In Range("a11").CurrentRegion
If IsNumeric(rngzelle.Value) Then
rngzelle.Value = Val(rngzelle.Value)
End If
Next

Range("a11:e11").ClearContents

Call sortjahr4
Call nullerwegxyz
Call leerzell2
Call anpassenxyz

End Sub

Atrus2711
03.07.2012, 08:27
Hi,
hab selbst mal einen Zugriff auf eine 2007-accdb ausgeführt und den String rauskopiert. Um die Smilies zu vermeiden, die z.B. bei Doppelpunkt D entstehen, ist der String in Code-Tags eingebettet. Das solltest du auch tun.

Provider=Microsoft.ACE.OLEDB.12.0;Password="";User ID=Admin;Data Source=C:\pfad\meinedb.accdb;Mode=Share Deny Write;Extended Properties="";Jet OLEDB:System database="";Jet OLEDB:Registry Path="";Jet OLEDB:Database Password="";Jet OLEDB:Engine Type=6;Jet OLEDB:Database Locking Mode=0;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Password="";Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don't Copy Locale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False;Jet OLEDB:Support Complex Data=False

Vergleich zu deinem String:
OLEDB;Provider=Microsoft.ACE.OLEDB.12.0;Password ="";User ID=Admin;Data Source=C:\Glycoscope\Patientenx2010.accdb;Mode=Share Deny Write;Extended Properties="";Jet OLEDB:System database="";Jet OLEDB:Registry Path="";Jet OLEDB:Database Password="";Jet OLEDB:EngineType=6;Jet OLEDB:Database Locking Mode=0;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Password="";Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don't Copy Locale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False;Jet OLEDB:Support Complex Data=False
Was auffällt (abgesehen vom Pfad): das OLEDB am Anfang fehlt bei mir. Geklappt hat es trotzdem (vielleicht auch deshalb).

aladdin
14.07.2012, 13:35
Guten Tag Atrus

So, bin wieder da. Es klappt immer noch nicht, wobei ich glaube, dass ich bis jetzt den Fehler an die "falsche" Stelle gesucht habe. Nachdem es genügend Zeichen gibt, dass die Connection String korrekt ist, habe ich den veden Verdacht, dass die Verbindung doch hergestellt wird und das der (Syntax ?)Fehler bei der SQLString liegt.
Ich habe dort eine Zeile "On error resume next" eingebaut. In der XP-Version läuft alles normal. Bei der EXCEL 2007 Version gibt ein Laufzeitfehler und der Code stoppt bei der Zeile (gelbmarkiert) "With ActiveSheet.QueryTables.Add (Connection:=strConnection, Destination.......)"
Vermutlich ist der Fehler in dieser Zeile zu suchen und nicht in den folgenden Zeilen: Die Zeile wird beim Compilieren gelb markiert, auch wenn ich am Ende der Zeile "goto 100" einfüge. Muss ich diese Zeile anders schreiben?? Wie gesagt, mit Excel XP wird kein Fehler gemeldet und funktioniert alles problemlos.

Danke für die Bemühungen und Gruss
Aladdin




rem FUER 2007 / 2010 (Die Daten werden nicht importiert (s. unten Daten-Selektion)

strConnection = "Provider = Microsoft.ACE.OLEDB.12.0;" & _
"Data Source =C:\glycoscope\patientenx.accdb;Persist Security Info=False;"

Dim intbezkontrollx
Dim alterkontrollx, namekontrollx, vornamekontrollx

Open "c:\glycoscope\pattemp\detgh" For Input As #26
Input #26, intbezkontrollx, alterkontrollx, namekontrollx, vornamekontroll
xClose #26

Range("a2") = alterkontrollx
Range("a9") = namekontrollx
Range("b9") = vornamekontrollx
Range("c9") = intbezkontrollx

Dim permax As Integer
permax = 90
permax = Val(Year(Now)) - permax

strBedingung = intbezkontroll
strBedingung1 = permax

rem DATEN-SELEKTION

on Error Resume Next


strSQL = "SELECT Kontrolle.Namekontroll, Kontrolle.Vornamekontroll, Kontrolle.intbezkontroll, Kontrolle.jahrnr, Kontrolle.res4 " & _
"FROM Kontrolle Kontrolle WHERE (Kontrolle.intbezkontroll='" & strBedingung & "') and (Kontrolle.jahrnr>=" & strBedingung1 & ")"

[COLOR="YellowGreen"]With ActiveSheet.QueryTables.Add(Connection:=strConnection, Destination:=Range("a11"))

.CommandText = strSQL
.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

100 rem Stop

Thomas Möller
14.07.2012, 14:27
Hallo!

... und das der (Syntax ?)Fehler bei der SQLString liegt.

strSQL = "SELECT Kontrolle.Namekontroll, Kontrolle.Vornamekontroll, Kontrolle.intbezkontroll, Kontrolle.jahrnr, Kontrolle.res4 " & _
"FROM Kontrolle Kontrolle WHERE (Kontrolle.intbezkontroll='" & strBedingung & "') and (Kontrolle.jahrnr>=" & strBedingung1 & ")"

Hinter dem Schlüsselwort FROM hast Du zwei mal den Namen der Tabelle aufgeführt.

Da Du in Deinem SQL-String nur eine Tabelle verwendest,brauchst Du nicht vo jedem Feld den Namen der Tabelle anzugeben. Das macht den SQL-String kürzer, leichter lesbar und somit verständlicher:

strSQL = "SELECT Namekontroll, Vornamekontroll, intbezkontroll, jahrnr, res4 " & _
"FROM Kontrolle " & _
"WHERE (intbezkontroll='" & strBedingung & "') " & _
"AND (jahrnr>=" & strBedingung1 & ")"


HTH

aladdin
15.07.2012, 08:20
Hallo Thomas
Danke für deine Verbesserung dieses "schönheitfehlers". Die Fehlerquelle liegt jedoch (vermutlich) nicht da sondern eben in der Zeile:

"With ActiveSheet.QueryTables.Add(Connection:=strConnection, Destination:=Range("a11"))". Hier wird nämlich die Ausführung des Codes gestoppt und die Zeile als felerhafte markiert, mit der Compiler-Fehlermeldung "Laufzeitfehler". Da mit Excel XP / 2003 der Code wird korrekt ausgeführt, nehme ich an dass unter EXCEL 2007 / 2010 diese Zeile anders formuliert werden muss. Leider weiss ich eben nicht wie....

Gruss Aladdin

Atrus2711
16.07.2012, 08:50
Hier mal das Ergebnis einer Makroaufzeichnung utner Excel 2007 mit Zugriff auf eine accdb-Tabelle. Die SQL ist hier also nur der nackte Tabellenname.

Mach das dochauch mal dir, erstmal mit einer Tabelle, so dass die SQL Nebensache bzw. trivial ist und die schiere VBA-Syntax tragfähig ist.


With ActiveSheet.ListObjects.Add(SourceType:=0, Source:=Array( _
"OLEDB;Provider=Microsoft.ACE.OLEDB.12.0;Password="""";User ID=Admin;Data Source=Laufwerk\pfad\meine.accdb;Mode=Share Deny Write;Extended Pr" _
, _
"operties="""";Jet OLEDB:System database="""";Jet OLEDB:Registry Path="""";Jet OLEDB:Database Password="""";Jet OLEDB:Engine Type=6;Jet O" _
, _
"LEDB:Database Locking Mode=0;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Pas" _
, _
"sword="""";Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don't Copy Locale on Compact=False;Je" _
, _
"t OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False;Jet OLEDB:Support Complex Data=False" _
), Destination:=Range("$A$7")).QueryTable
.CommandType = xlCmdTable
.CommandText = Array("Tabelle")
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.PreserveColumnInfo = True
.SourceDataFile = "Laufwerk\pfad\meine.accdb"
.ListObject.DisplayName = "Tabelle.accdb"
.Refresh BackgroundQuery:=False
End With

aladdin
16.07.2012, 11:49
Hallo Atrus, vielen Dank.

Ich habe das Makro im Modul eingefügt. Effektiv werden die Daten importiert, natürlich die ganze Tabelle. Das Problem ist, dass ich nur die Daten brauche, welche durch Kriterien selektiert werden (strSQL). Nun sehe ich das Zusammenhang nicht, d.h. wie ich die SQL-Abfrage integrieren muss. Ich habe versucht, die Zeile: .CommandText=Array("Kontrolle") durch: .CommandText=Array(strSQL) , jedoch (wie erwartet...) ohne Erfolg.
Wie kann ich die Selektionskriterien integrieren?




Sub verlaufhdl()

Application.ScreenUpdating = False

Sheets("Tabelle5").Select
While ActiveSheet.QueryTables.Count > 0
ActiveSheet.QueryTables(1).Delete
Wend

Range("a11:e29").ClearContents


Dim strPath As String
Dim strFile As String
Dim strConnection As String
Dim strSQL As String
Dim strBedingung As String
Dim strBedingung1
Dim rngzelle As Range


Dim intbezkontrollgrafik
Dim alterkontrollgrafik, namekontrollgrafik, vornamekontrollgrafik

Open "c:\glycoscope\pattemp\detgh" For Input As #26
Input #26, intbezkontrollgrafik, alterkontrollgrafik, namekontrollgrafik, vornamekontrollgrafik
Close #26

Range("a2") = alterkontrollgrafik
Range("a9") = namekontrollgrafik
Range("b9") = vornamekontrollgrafik
Range("c9") = intbezkontrollgrafik

Dim per As Integer
per = 90
per = Val(Year(Now)) - per

strBedingung = intbezkontrollgrafik
strBedingung1 = per

On Error Resume Next

strSQL = "SELECT Kontrolle.Namekontroll, Kontrolle.Vornamekontroll, Kontrolle.intbezkontroll, Kontrolle.jahrnr, Kontrolle.res4 " & _
"FROM Kontrolle Kontrolle WHERE (Kontrolle.intbezkontroll='" & strBedingung & "') and (Kontrolle.jahrnr>=" & strBedingung1 & ")"

ActiveWorkbook.Worksheets.Add

With ActiveSheet.ListObjects.Add(SourceType:=0, source:=Array( _
"OLEDB;Provider=Microsoft.ACE.OLEDB.12.0;Password="""";User ID=Admin;Data Source=C:\Dokumente und Einstellungen\HP_Besitzer\Eigene Dateie" _
, _
"n\Patientenx2010.accdb;Mode=Share Deny Write;Extended Properties="""";Jet OLEDB:System database="""";Jet OLEDB:Registry Path="""";Jet " _
, _
"OLEDB:Database Password="""";Jet OLEDB:Engine Type=6;Jet OLEDB:Database Locking Mode=0;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLE" _
, _
"DB:Global Bulk Transactions=1;Jet OLEDB:New Database Password="""";Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Databa" _
, _
"se=False;Jet OLEDB:Don't Copy Locale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False;Jet OLE" _
, "DB:Support Complex Data=False"), Destination:=Range("$A$1")).QueryTable
.CommandType = xlCmdTable
.CommandText = Array("Kontrolle")
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.PreserveColumnInfo = True
.SourceDataFile = _
"C:\Dokumente und Einstellungen\HP_Besitzer\Eigene Dateien\Patientenx2010.accdb"
.ListObject.DisplayName = "Kontrolle_Patientenx2010.accdb"
.Refresh BackgroundQuery:=False
End With


For Each rngzelle In Range("a11").CurrentRegion
If IsNumeric(rngzelle.Value) Then
rngzelle.Value = Val(rngzelle.Value)
End If
Next

Range("a11:e11").ClearContents

Call sortjahr4
Call nullerwegxyz
Call sortjahr4
Call nullerwegxyz
Call nullerwegx1yz
Call leerzell2
Call anpassengrafikxyz


End Sub


Ausserdem, wenn ich "On Error Resume Next" entferne, wird die Zeile
.ListObject.DisplayName = "Kontrolle_Patientenx2010.accdb" als fehlerhaft markiert.

Gruss Aladdin.

Atrus2711
16.07.2012, 12:03
Hi,

der Displayname ist nur der gewünschte resultierende Name des Tabellenobjekt in Excel. Der darf keine Punkte haben. Vielleicht ist der Name dieses Objekts auch völlig wurscht... :)

Den Commandtext müsstest du eigentlich auch direkt als Text übergeben können. Die Splittung in ein Array dient nur dazu, die z.T. ellenlangen Texte aufteilen zu können.

aladdin
16.07.2012, 14:14
Hi

Wenn ich es direkt als Text eingebe:

.CommandText = "SELECT Kontrolle.Namekontroll, Kontrolle.Vornamekontroll, Kontrolle.intbezkontroll, Kontrolle.jahrnr, Kontrolle.res4 " & _
"FROM Kontrolle Kontrolle WHERE (Kontrolle.intbezkontroll='" & strBedingung & "') and (Kontrolle.jahrnr>=" & strBedingung1 & ""

werden keine Daten importiert (s. Anhang)

Aladdin

Atrus2711
16.07.2012, 14:15
Ergibt dieser SQL denn in Access selbst Ergebnisse? Ich denke da v.a. an die Kriterien.

aladdin
16.07.2012, 16:37
Hallo

Ich hatte im Code einen Tippfehler... Die Daten werden jetzt importiert! Aber es ist nur der Anfang.... Es gibt noch mehrere Prozeduren, welche noch nicht funktionieren, d.h. es muss noch (auf den ersten Blick) ziemlich viela ngepasst werden, bis die Charts (uberhaupt und richtig) dargestellt werden.... dabei klappt es mit OFF XP alles so wunderbar! Es ist zwar eine komplexe Applikation, konnte mir trotzdem nicht voerstellen, dass für OFF 2007 so viel geändert werden muss. Ich muss jetzt analysiern, welche Prozeduren nicht richtig laufen und erlaube mir, das Thema noch offen zu lassen. Ich melde mich bald, vielen Dank für die Unterstptzun speziell an Atrus und Thomas!

Gruss Aladdin.