ich möchte gern per ADODB Abfrage Daten aus einer anderen Arbeitsmappe abrufen.
Der folgende Code funktioniert mit dem query = "Select * from [Dienst$]" nicht, da nur maximal 255 Felder bzw. Spalten abgerufen werden. Die Quelltabelle enthält jedoch in Spalte A eine ID von Mitarbeitern und es folgen 365 / 366 Spalten für jeweils 1 Tag. Es werden also nur die Daten bis einschl. 11. September abgerufen.
Ich habe herausgegoogelt, dass man die Spalten der Quelltabelle mit "F" für Field also so [F1] bis [F200] abrufen kann, wenn im ConnectionString der Wert für die Header auf No steht (HDR=NO).
Mit ein wenig Fleißarbeit kann ich die Abfrage nun auf beide Halbjahre splitten und tippe mir einen Wolf, um die Felder für die Abfrage von Hand zu tippen. Das muss doch einfacher gehen!
Meine drei Fragen:
1.) gibt es die Möglichkeit die Abfrage anders zu formulieren?
Statt query = "Select [F1], [F2], [F3] ... [F200] from [Dienst$]"
irgendwie so query = "Select von F1 bis F200 from [Dienst$]"
2.) Da der Tabellenkopf im Sheet("Dienst") Datumswerte enthält, wäre es noch eleganter / hilfreicher mittels
query = "Select [vonDatum] [bisDatum] from [Dienst$]" abfragen zu können. Ist das möglich?
3.) Lässt sich all dies auch mit "HDR=YES" im ConnectionString irgendwie bewerkstelligen?
Vielen Dank schon einmal!
mein Sub:
Sub copyData_from_Database()
str_Backend_Path = shStart.Range("Backend_Path").Value
'Connection erstellen
Dim Dienst_Conn As ADODB.Connection
'Recordset erstellen, darin werden die Daten im Speicher gehalten
Dim Dienst_Data As ADODB.Recordset
'New Instances erstellen
Set Dienst_Conn = New ADODB.Connection
Set Dienst_Data = New ADODB.Recordset
'Connection String -> Constanten & Quellangaben ganz oben
'Dienst_Conn.ConnectionString = ConStr_XLSM
Dienst_Conn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & _
str_Backend_Path & ";Extended Properties=""Excel 12.0 Macro;HDR=NO"";"
'Connection ÖFFNEN
Dienst_Conn.Open
'Ziel leeren
Dim Zeilenanzahl, Spaltenanzahl As Integer
Zeilenanzahl = shWrite.Cells(Rows.Count, 1).End(xlUp).Row
Spaltenanzahl = shWrite.Cells(1, Columns.Count).End(xlToLeft).Column
With shWrite
.Activate
.Range(Cells(2, 1), Cells(Zeilenanzahl, Spaltenanzahl)).Cells.ClearContents
End With
Dim query As String
'query = "Select * from [Dienst$]" 'ruft nur bis 11.09. ab
' Spalten = [F*] -> hier ID & 1. Januar bis 30. Juni
query = "Select [F1], [F2], [F3], [F4], [F5], [F6], [F7], [F8], [F9], [F10], [F11], [F12], [F13] _
, [F14], [F15], [F16], [F17],
[F18], [F19], [F20], [F21], [F22], [F23], [F24], [F25], [F26], [F27], [F28], [F29], [F30], [ _
F31], [F32], [F33], [F34],
[F35], [F36], [F37], [F38], [F39], [F40], [F41], [F42], [F43], [F44], [F45], [F46], [F47], [F48] _
, [F49], [F50], [F51],
[F52], [F53], [F54], [F55], [F56], [F57], [F58], [F59], [F60], [F61], [F62], [F63], [F64], [F65] _
, [F66], [F67], [F68],
[F69], [F70], [F71], [F72], [F73], [F74], [F75], [F76], [F77], [F78], [F79], [F80], [F81], [F82] _
, [F83], [F84], [F85],
[F86], [F87], [F88], [F89], [F90], [F91], [F92], [F93], [F94], [F95], [F96], [F97], [F98], [F99] _
, [F100]," & _
'"[F101], [F102], [F103], [F104], [F105], [F106], [F107], [F108], [F109], [F110], [F111], [F112] _
, [F113], [F114],
[F115], [F116], [F117], [F118], [F119], [F120], [F121], [F122], [F123], [F124], [F125], [F126], _
[F127], [F128], [F129],
[F130], [F131], [F132], [F133], [F134], [F135], [F136], [F137], [F138], [F139], [F140], [F141], _
[F142], [F143],
[F144], [F145], [F146], [F147], [F148], [F149], [F150], [F151], [F152], [F153], [F154], [F155], _
[F156], [F157],
[F158], [F159], [F160], [F161], [F162], [F163], [F164], [F165], [F166], [F167], [F168], [F169], _
[F170], [F171],
[F172], [F173], [F174], [F175], [F176], [F177], [F178], [F179], [F180], [F181], [F182] from [ _
Dienst$]"
' Query in recordset
Dienst_Data.Open query, Dienst_Conn
' Write header
' Dim i As Long
' For i = 0 To Dienst_Data.Fields.Count - 1
' shWrite.Cells(1, i + 1).Value2 = Dienst_Data.Fields(i).Name
' Next i
' Write data
shWrite.Range("A2").CopyFromRecordset Dienst_Data
'Recordset schließen
Dienst_Data.Close
'Connection schließen
Dienst_Conn.Close
End Sub