1
Excel / Antw: Excel 2016 Funktion gesucht, um einzelne Werte aus Access-DB abzurufen
« am: Juni 13, 2016, 21:27:37 Nachmittag »
Habe jetzt folgenden Code zusammengehackt...
Sub DWDDataPoolHolen()
'
' DWDDataPoolHolen Makro
'
'
Application.ScreenUpdating = False
Application.StatusBar = "Initialisiere DWDDataPool"
ThisWorkbook.Worksheets.Add.Name = "DWD Query"
On Error GoTo weiter
Sheets("DWD Query").Select
Application.StatusBar = "Setze Zeiger auf " & Sheets("Konfiguration Wind").Range("AX13").Value
ActiveWorkbook.Queries.Add Name:="DWDDataPool", Formula:= _
"let" & Chr(13) & "" & Chr(10) & " Quelle = Access.Database(File.Contents(""C:\HyRE-x\DWD\DWDDataPool.accdb""), [CreateNavigationProperties=true])," & Chr(13) & "" & Chr(10) & " _DWDDataPool = Quelle{[Schema="""",Item=""DWDDataPool""]}[Data]," & Chr(13) & "" & Chr(10) & " #""Gefilterte Zeilen"" = Table.SelectRows(_DWDDataPool, each [Index] = " & Sheets("Konfiguration Wind").Range("AX13").Value & ")" & Chr(13) & "" & Chr(10) & "in" & Chr(13) & "" & Chr(10) & " #""Gefilterte Zeilen"""
With ActiveSheet.ListObjects.Add(SourceType:=0, Source:= _
"OLEDB;Provider=Microsoft.Mashup.OleDb.1;Data Source=$Workbook$;Location=""DWDDataPool""" _
, Destination:=Range("$A$1")).QueryTable
.CommandType = xlCmdSql
.CommandText = Array("SELECT * FROM [DWDDataPool]")
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.PreserveColumnInfo = False
.ListObject.DisplayName = "DWDDataPool"
.Refresh BackgroundQuery:=False
End With
weiter:
Application.StatusBar = "Schreibe Import-Maske"
Selection.ListObject.QueryTable.Refresh BackgroundQuery:=False
Application.StatusBar = "Übergebe Daten an Tabelle"
Call WerteSetzen_DWDQuery
Application.StatusBar = "Trenne Verbindung"
Do While ActiveSheet.QueryTables.Count > 0
ActiveSheet.QueryTables.Item(ActiveSheet.Queries.Count).CancelRefresh
ActiveSheet.QueryTables.Item(ActiveSheet.Queries.Count).Unlink
Loop
Do While ActiveWorkbook.Connections.Count > 0
ActiveWorkbook.Connections.Item(ActiveWorkbook.Connections.Count).Delete
Loop
Sheets("DWD Query").Delete
End Sub
Das importieren der Daten funktioniert damit wunderbar. Allerdings nur 1x. Damit das Makro ein zweites mal sauber abläuft, muss ich manuell die Arbeitsmappenabfrage löschen. Meine Versuche, zunächst die queries und anschließend die Connections via VBA zu löschen, werden gnadenlos ignoriert.
Auch mußte ich eine "On error goto"-Krücke einbauen, da das Makro nach Ausführung des Befehls
With ActiveSheet.ListObjects.Add(....
...
end with
automatisch neu startet.
Ist das en Bug, oder ist der Code so "unsauber", daß VBA quasi abstürzt und deshalb das Makro erneut startet?
Bin für jede Anregung dankbar!
LG
André
Sub DWDDataPoolHolen()
'
' DWDDataPoolHolen Makro
'
'
Application.ScreenUpdating = False
Application.StatusBar = "Initialisiere DWDDataPool"
ThisWorkbook.Worksheets.Add.Name = "DWD Query"
On Error GoTo weiter
Sheets("DWD Query").Select
Application.StatusBar = "Setze Zeiger auf " & Sheets("Konfiguration Wind").Range("AX13").Value
ActiveWorkbook.Queries.Add Name:="DWDDataPool", Formula:= _
"let" & Chr(13) & "" & Chr(10) & " Quelle = Access.Database(File.Contents(""C:\HyRE-x\DWD\DWDDataPool.accdb""), [CreateNavigationProperties=true])," & Chr(13) & "" & Chr(10) & " _DWDDataPool = Quelle{[Schema="""",Item=""DWDDataPool""]}[Data]," & Chr(13) & "" & Chr(10) & " #""Gefilterte Zeilen"" = Table.SelectRows(_DWDDataPool, each [Index] = " & Sheets("Konfiguration Wind").Range("AX13").Value & ")" & Chr(13) & "" & Chr(10) & "in" & Chr(13) & "" & Chr(10) & " #""Gefilterte Zeilen"""
With ActiveSheet.ListObjects.Add(SourceType:=0, Source:= _
"OLEDB;Provider=Microsoft.Mashup.OleDb.1;Data Source=$Workbook$;Location=""DWDDataPool""" _
, Destination:=Range("$A$1")).QueryTable
.CommandType = xlCmdSql
.CommandText = Array("SELECT * FROM [DWDDataPool]")
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.PreserveColumnInfo = False
.ListObject.DisplayName = "DWDDataPool"
.Refresh BackgroundQuery:=False
End With
weiter:
Application.StatusBar = "Schreibe Import-Maske"
Selection.ListObject.QueryTable.Refresh BackgroundQuery:=False
Application.StatusBar = "Übergebe Daten an Tabelle"
Call WerteSetzen_DWDQuery
Application.StatusBar = "Trenne Verbindung"
Do While ActiveSheet.QueryTables.Count > 0
ActiveSheet.QueryTables.Item(ActiveSheet.Queries.Count).CancelRefresh
ActiveSheet.QueryTables.Item(ActiveSheet.Queries.Count).Unlink
Loop
Do While ActiveWorkbook.Connections.Count > 0
ActiveWorkbook.Connections.Item(ActiveWorkbook.Connections.Count).Delete
Loop
Sheets("DWD Query").Delete
End Sub
Das importieren der Daten funktioniert damit wunderbar. Allerdings nur 1x. Damit das Makro ein zweites mal sauber abläuft, muss ich manuell die Arbeitsmappenabfrage löschen. Meine Versuche, zunächst die queries und anschließend die Connections via VBA zu löschen, werden gnadenlos ignoriert.
Auch mußte ich eine "On error goto"-Krücke einbauen, da das Makro nach Ausführung des Befehls
With ActiveSheet.ListObjects.Add(....
...
end with
automatisch neu startet.
Ist das en Bug, oder ist der Code so "unsauber", daß VBA quasi abstürzt und deshalb das Makro erneut startet?
Bin für jede Anregung dankbar!
LG
André