Daten-Abfrage dynamisieren und automatisieren
#1
Hallo Leute,
ich habe folgendes Problem:
Ich habe eine Excel Datei(über 100MB groß) mit über 50 Tabellenblättern die alle Zeitreihen-Daten in dem Format enthalten: (siehe Quelldatei.xlsx)
 [img]
Dateiupload bitte im Forum! So geht es: Klick mich!
]

Nun möchte ich daraus immer die vorletzte Spalte mit dem Kopf "2016" in eine Auswertungs-Tabelle ziehen: (siehe Auswertung.xlsm)
[img]
Dateiupload bitte im Forum! So geht es: Klick mich!
]

Erklärung zu den hochgeladenen Dateien: Die Datei "Quelldatei.xlsx" enthält die Zeitreihen-Daten in 3 beispielhaften Tabellenblättern und hat sonst keine weitere Funktion. Die Datei "Auswertung.xlsm" hat ein Blatt "Daten", worin die Daten(immre Spalte "2016") aus "Quelldatei" importiert werden sollen, alle nacheinander Spalte für Spalte. Falls es hilft, ist in dem Blatt "DatenParameter" die gleiche Tabelle nochmal, nur anstatt von normalen Tabellenköpfen, der Name des jeweiligen Blattes woraus die Daten gezogen werden sollen.

Das wollte ich mit einer Abfrage(Query) umsetzen. Allerdings müsste ich dann für jedes einzelne Worksheet (über 50) eine neue Abfrage einrichten. Daher dachte ich wäre es sinnvoll dies mit VBA zu automatisieren. Allerdings schaffe ich es nicht alles, was variabel sein soll, mit Variablen zu bestücken, d.h. dass Name des Worksheets und Spaltename automatisch verändert werden können.

Code:
   ActiveWorkbook.Queries.Add Name:="RoE", Formula:= _
        "let" & Chr(10) & "    Source = Excel.Workbook(File.Contents(""C:UsersMaxOneDriveFinanzenReutersProjekttimeseries request neu.xlsm""), null, true)," & Chr(10) & "    Sheet = Source{[Item=""RoE"",Kind=""Sheet""]}[Data]," & Chr(10) & "    PromoteHeaders = Table.PromoteHeaders(Sheet, [PromoteAllScalars=true])," & Chr(10) & "    RemoveColumns = Table.SelectColumns(PromoteHeaders,{""2016""})" & Chr(10) & "in" & Chr(10) & "    RemoveColumns"
    With ActiveSheet.ListObjects.Add(SourceType:=0, Source:= _
        "OLEDB;Provider=Microsoft.Mashup.OleDb.1;Data Source=$Workbook$;Location=RoE", _
        Destination:=Range("$D$1")).QueryTable
        .CommandType = xlCmdSql
        .CommandText = Array("SELECT * FROM [RoE]")
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .PreserveColumnInfo = False
        .ListObject.DisplayName = "RoE"
        .Refresh BackgroundQuery:=False
    End With

In dem Fall heißt das Worksheet "RoE", weshalb ich versuchen wollte überall wo dieser Name steht, eine Variable "shName" einzusetzen. Allerdings scheitert dies scheinbar beim
Code:
Location=RoE
und 
   
Code:
.CommandText = Array("SELECT * FROM [RoE]")


.xlsm   Auswertung.xlsm (Größe: 31,47 KB / Downloads: 2)

.xlsx   Quelldatei.xlsx (Größe: 23,95 KB / Downloads: 4)

Ich hoffe ihr könnt mir dabei helfen.
Vielen Dank im Voraus!

PS: Ist das überhaupt die beste, vorallem schnellste Möglichkeit um über 100MB Daten zu laden, denn Excel läd ja trotzdem immer die ganze Tabelle auch wenn nur eine spezielle Spalte benötigt wird.

Edit: Beispieldatei hinzugefügt.
Top
#2
Hallo

Der Datenaufbau erinnert mich diese Videos:

Mr Excel & excelisfun Trick 174: Transform Data Set: Advanced Filter? Or Power Query?
https://www.youtube.com/watch?v=JBSDZl7mB7I

Excel Magic Trick 1242: Transform Large Data Set to Final GDP Report: TTC, MATCH, Filter & Format
https://www.youtube.com/watch?v=IZtYysDCyps

Bill Szysz at YouTube: Power Query - Duel 174
https://www.youtube.com/watch?v=Zw9EyVVtGLA

Excel Magic Trick 1243: Transform Data Set: Power Query 2nd Method or Advanced Filter?
https://www.youtube.com/watch?v=dk7-Ana8qZc

Excel Magic Trick 1244: Transform GDP Data Set: Advanced Filter with Formula Criteria wins!
https://www.youtube.com/watch?v=tdNkFEt4NmI
Wir sehen uns!
... Detlef

Meine Beiträge können Ironie oder Sarkasmus enthalten.

Top
#3
Hallo la,

zur Info:

http://ms-office-forum.net/forum/forumdisplay.php?f=29
Gruß,
steve1da
Top
#4
(15.07.2017, 12:15)shift-del schrieb: Der Datenaufbau erinnert mich diese Videos:

Danke für die vielen Videos!
Ich weiß ja wie ich die Daten bekomme mit PowerQuery. Allerdings geht es mir darum, dass mit etwa 50 Zeitreihen mit jeweils über 10000 Zeilen automatisiert zu machen, also nicht jedes mal eine Abfrage selbst erstellen oder duplizieren muss, sondern Name des Sheets und Spaltename variabel setzen kann, sodass ich das 50 mal mit VBA Loop durchlaufen lassen kann. Allerdings schaffe ich es nicht manche Werte variabel zu setzen. Da liegt mein Problem. Und "einfaches" kopieren lassen von VBA funktioniert wohl bei solchen großen Datenmengen nicht so gut und vorallem nicht schnell.
Top
#5
[Sarkasmus] In der Tat, 50 Abfragen zu erstellen ist wirklich eine unzumutbare Aufgabe ... [/Sarkasmus]
Jeder Dienstleister wird dir die Arbeit gewiss gerne abnehmen!
Oder du arbeitest dich in VBA mehr ein, aber das kostet ja auch wieder
Beste Grüße
  Günther

Excel-ist-sexy.de
  …schau doch mal rein!
Der Sicherheit meiner Daten wegen lade ich keine *.xlsm bzw. *.xlsb- Files mehr herunter! -> So geht's ohne!
Top
#6
(15.07.2017, 12:31)mhryvo schrieb: sodass ich das 50 mal mit VBA Loop durchlaufen lassen kann.
Warum VBA wenn es doch auch mit Power Query geht?
Wir sehen uns!
... Detlef

Meine Beiträge können Ironie oder Sarkasmus enthalten.

Top
#7
Wink 
Ja, ich werde dafür aber keinen Dienstleister nutzen  :19:
Und ja ich arbeite mich in VBA ein, aber ich will nicht sinnlos in der Theorie lernen, sondern damit Aufgaben bewerkstelligen und das versuche ich gerade.
Eigentlich ist meine Frage ja erstmal ganz einfach. Ich frage erstmal ja nur danach, ob es möglich ist, die beiden von mir zitierten Punkte im Code mit Variablen zu bestücken oder nicht.
Wenn das möglich ist, dann sollte ich es schaffen, dass ganze in einer Loop zum laufen zu bringen.

(15.07.2017, 13:00)shift-del schrieb: Warum VBA wenn es doch auch mit Power Query geht?
Kann man mit PowerQuery auch Schleifen schreiben, sodass das ganze mehrmals ausgeführt ist? Weil es sind ja wirklich immer die gleichen Abfragen nur mit anderen Blattnamen und evtl. Spaltennamen.
Ich dachte eigentlich, dass mein Konstrukt eine Art Powerquery erstellt? Ich habe ja auch mit PowerQuery die Abfrage so eingestellt, dass die richtige Spalte ausgegeben wird. 

Also nochmal zur Info: Der obengenannte Code erstellt die Abfrage mit meiner PowerQuery Formel, sodass meine gewünschte Spalte ausgegeben wird. Allerdings ja nur für das Worksheet was ich angegeben habe.
Allerdings will ich das ja für alle weitere Worksheets in den darauffolgenden Spalten (in der Auswertungsdatei) auch durchführen.

Allerdings kommt mir gerade die Idee, ob man mit PowerQuery-Editor während man ein Worksheet gefiltert hat, auch auf die anderen Worksheets zugreifen kann?
Top
#8
Hallo,

(15.07.2017, 13:13)mhryvo schrieb: Eigentlich ist meine Frage ja erstmal ganz einfach. Ich frage erstmal ja nur danach, ob es möglich ist, die beiden von mir zitierten Punkte im Code mit Variablen zu bestücken oder nicht.

Code:
 Dim strName As String
 strName = "RoE"

  ActiveWorkbook.Queries.Add Name:="RoE", Formula:= _
       "let" & Chr(10) & "    Source = Excel.Workbook(File.Contents(""C:UsersMaxOneDriveFinanzenReutersProjekttimeseries request neu.xlsm""), null, true)," & Chr(10) & "    Sheet = Source{[Item=""RoE"",Kind=""Sheet""]}[Data]," & Chr(10) & "    PromoteHeaders = Table.PromoteHeaders(Sheet, [PromoteAllScalars=true])," & Chr(10) & "    RemoveColumns = Table.SelectColumns(PromoteHeaders,{""2016""})" & Chr(10) & "in" & Chr(10) & "    RemoveColumns"
   With ActiveSheet.ListObjects.Add(SourceType:=0, Source:= _
       "OLEDB;Provider=Microsoft.Mashup.OleDb.1;Data Source=$Workbook$;Location=" & strName, _
       Destination:=Range("$D$1")).QueryTable
       .CommandType = xlCmdSql
       .CommandText = Array("SELECT * FROM [" & strName & "]")
Gruß Uwe
[-] Folgende(r) 1 Nutzer sagt Danke an Kuwer für diesen Beitrag:
  • mhryvo
Top
#9
Ah sehr gut, genau das wollte ich wissen. Habe schon gemerkt, dass man irgendwie anders deutlich machen muss, dass es Variablen sind und kein Text/strings. Danke! Werde ich gleich mal ausprobieren.
Top
#10
Mit "Daten aus Arbeitsmappe" wähle ich die Arbeitsmappe und die Tabellenblätter aus.
Mit "Abfragen als neu anfügen" kommen alle Einzel-Tabellen in eine Tabelle.
Dann kommt die Feinarbeit.
Z.B. die Spalte A splitten, NA durch null ersetzen, die Jahres-Spalten entpivotisieren, die Fehlerzeile entfernen, Überschriften ändern.
Dann habe ich eine Tabelle mit 497 Zeilen.
 ABCD
1NameTypJahrWert
211 88 0 SOLUTIONSEARNINGS PER SHR20000,18
311 88 0 SOLUTIONSEARNINGS PER SHR20010
411 88 0 SOLUTIONSEARNINGS PER SHR20020
511 88 0 SOLUTIONSEARNINGS PER SHR20030
611 88 0 SOLUTIONSEARNINGS PER SHR20040,62
711 88 0 SOLUTIONSEARNINGS PER SHR20051,41
811 88 0 SOLUTIONSEARNINGS PER SHR20060,79
911 88 0 SOLUTIONSEARNINGS PER SHR20070,75
1011 88 0 SOLUTIONSEARNINGS PER SHR20081,52
1111 88 0 SOLUTIONSEARNINGS PER SHR20091,18
1211 88 0 SOLUTIONSEARNINGS PER SHR20100,53
1311 88 0 SOLUTIONSEARNINGS PER SHR20110,14
1411 88 0 SOLUTIONSEARNINGS PER SHR20120,13
1511 88 0 SOLUTIONSEARNINGS PER SHR20132,46
1611 88 0 SOLUTIONSEARNINGS PER SHR20140
1711 88 0 SOLUTIONSEARNINGS PER SHR20150
1811 88 0 SOLUTIONSEARNINGS PER SHR20160
1911 88 0 SOLUTIONSEARNINGS PER SHR20170
202G ENERGYEARNINGS PER SHR20111,44
212G ENERGYEARNINGS PER SHR20121,52
222G ENERGYEARNINGS PER SHR20132,58
232G ENERGYEARNINGS PER SHR20140,2
Diese Tabelle wurde mit Tab2Html (v2.4.1) erstellt. ©Gerd alias Bamberg

Die Schreibweise der Firmennamen ist allerdings nicht identisch.
Wir sehen uns!
... Detlef

Meine Beiträge können Ironie oder Sarkasmus enthalten.

[-] Folgende(r) 1 Nutzer sagt Danke an shift-del für diesen Beitrag:
  • mhryvo
Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste