Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1964to1968
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

PQ Abfrage aktualisieren wenn Bedingung erfüllt

PQ Abfrage aktualisieren wenn Bedingung erfüllt
14.02.2024 12:29:49
Chris
Hallo an die Excel Gemeinschaft,

es würde mich freuen, wenn ihr mir verraten würdet, wenn es überhaupt möglich ist, wie ich folgendes Problem lösen kann.

https://www.herber.de/bbs/user/167050.xlsx

Ist es möglich, dass sich die PQ Abfrage automatisch aktualisiert, sobald ich im Blatt Alle Spalte C ein Datum einfüge, welches weniger als 30 Jahre zurückliegt?
Wobei die Daten in 4 verschiedenen Formaten eingefügt werden können, siehe die Zellen C2, C3, C4 sowie C13.

Würde mich freuen, wenn es da eine Lösung gibt.

Vielen Dank
Christian



17
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: PQ Abfrage aktualisieren wenn Bedingung erfüllt
14.02.2024 13:58:34
Yal
hallo Christian,

es wird nicht zu vermeiden, dass deine Daten(pl. v. Datum) vorher auf einem Standard gebracht werden müssen.

Mache eine Kopie alle Daten in einer separaten Spalte, und sortiere diese.
Es gibt nur 2 Muster: Monat davor, dann als Text, oder Monat in der Mitte, dann entw. Text oder Zahl.
Nach der Sortierung sind alle nach Muster d-m-y oben, m-d-y unten. Mache eine Trennung dazwischen.

Es kommt eine Umwandlung in "richtige" Datum, die Du dann per Sverweis an der richtigen Stelle wieder reinbringen kannst.

Umwandlung Stufe 1: die Monatstext in Zahl: lege folgende UDF in einem Modul
Function MonatZuZahl(Wert) As String

Dim Erg, L, i, Arr
'achtung: bedeutende führende Leerzeichen!
Const cEnFull = " january february march april may june july august september october november december"
Const cEnShort = " jan feb mar apr may jun jul aug sep oct nov dec"
Const cDeFull = " januar februar märz april mai juni juli august september oktober november dezember"
Const CDeShort = " jan feb mrz apr mai jun jul aug sep okt nov dez"

Erg = LCase(Wert)
For Each L In Array(cEnFull, cDeFull, cEnShort, CDeShort) 'Reihenfolge ist relevant
Arr = Split(L)
For i = 1 To 12
If InStr(1, Erg, Arr(i), vbTextCompare) Then Erg = Replace(Erg, Arr(i), i)
Next
Next
MonatZuZahl = Erg
End Function


Dann setze diese Funktion in das Excelblatt neben den sortierten Daten.
Dann werden die Daten geparsed. Neue UDF:
Function DateParse(ByVal DatString As String, Optional Lexer As String = "DMY") As Date

Dim R, S

Set R = CreateObject("VBScript.RegExp")
R.Pattern = "(\d+)\D+(\d+)\D+(\d+)"
Set S = R.Execute(DatString)
DateParse = DateSerial( _
CInt(S(0).SubMatches(InStr(1, Lexer, "Y", 1) - 1)), _
CInt(S(0).SubMatches(InStr(1, Lexer, "M", 1) - 1)), _
CInt(S(0).SubMatches(InStr(1, Lexer, "D", 1) - 1)))
End Function


Hier musst Du achten, dass auf einmal
=DateParse(A1; "dmy")
für d-m-y Datumsmuster (oben) und
=DateParse(A1; "mdy")
für d-m-y Datumsmuster (unten) zu verwenden ist.

Dann hast Du Zahlen, die durch Zahlenformat als Datum darstellen lässt. jetzt wie gesagt: sverweis und kopieren-durch Wert ersetzen.

Jetzt musst du nur noch achten, dass ein richtige Datum eingegeben wird, und eine Ereignisprozedure, die das ListObject (VBA für Tabelle) aktualisiert.
Würde ich aber nicht machen. Lieber Strg+Alt+F5 drücken: es aktualisiert alle Tabellen und Pivot.

Aber wenn schon, sieht es so aus:
Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Column = 3 Then If CDate(Target.Value) (Date - 10957) Then Worksheets("Liste").ListObjects("Tabelle1_1").QueryTable.Refresh BackgroundQuery:=False
End Sub

10957 sind 30 * 365,25

VG
Yal

Anzeige
AW: PQ Abfrage aktualisieren wenn Bedingung erfüllt
14.02.2024 14:12:44
Chris
Hallo Yal,

erstmal vielen Dank für deine Mühe. Ich werde es auf jeden Fall auch austesten.
Aber du hast dabei zwei Dinge meines Erachtens nicht bedacht.

Zum Einen, die Powerquery Abfrage an sich hat ja den Zweck, die Daten in ein einheitliches Format zu bringen. Wenn ich die Daten auf einem anderen Weg in ein einheitliches Format bringe, brauche ich die Abfrage nicht mehr.

Zum Anderen, wenn ich deinen Vorschlag mit Strg+Alt+F5 umsetze, bin ich genauso weit wie jetzt, ob ich jetzt Strg+Alt+F5 drücke oder Daten - alle aktualisieren., es bliebe dabei, dass ich die Aktualisierung von Hand starten muss.

Ich würde gerne, wenn das was ich mir vorstelle, zu kompliziert ist, einen anderen Vorschlag machen, der hoffentlich leichter umzusetzen ist. Nicht jünger als 30 Jahre sondern bei jedem Datum aktualisieren, das im Jahr 1994 oder später liegt.

Dann müsste es doch ausreichen, bei vorhandenen Daten das Jahr zu überprüfen und bei Texten, egal in welchem Format die letzten 4 Zeichen.

Gruß
Christian
Anzeige
Testergebnis
14.02.2024 21:01:09
Chris
Hallo Yal,

die DateParse Funktion funktioniert leider nicht so wie gedacht. Hier ein Beispiel, wo sie nicht funktioniert. 4.2.98 ist ungleich 14.4.97
https://www.herber.de/bbs/user/167058.xlsm

Das mit dem SVERWEIS und dem aktualisieren klappt, nur leider an manchen Stellen die falschen Daten.

Aber wie ich ja bereits sagte, diese beiden UDF machen meine PQ Abfrage unnötig, sind aber deutlich umständlicher als diese.
Zu deiner zweiten Antwort, prinzipiell gebe ich dir recht mit dem Sinn. Aber mein Gedanke war folgender: Die Originaldatei hat ca. 14500 Zeilen, Zeit für jede Aktualisierung der Abfrage ca. 1 Sekunde.
Wie du jetzt siehst befinden sich in Zeile 1 auch 4 Formeln. Änderungen an diesen sind für mich nur interessant, wenn ein neues Datum dazukommt, welches weniger als 30 Jahre zurück liegt, also ist eine permanente Aktualisierung nicht notwendig.
Wenn ich jetzt hingehe und nach jeder Änderung aktualisiere waren jedesmal 1 Sekunde also insgesamt ca. 4 Stunden umsonst gewartet.
Jedesmal wenn ein Datum das weniger als 30 Jahre zurückliegt, die Abfrage von Hand aktualisieren, geht irgendwann auf die Nerven.
Von Hand tippe ich die Daten nicht ein wegen der Gefahr der Tippfehler, daher kopiere ich sie, obwohl sie dann unterschiedliche Formate haben.

Aber langsam fange ich an zu verstehen, dass ich bereits den praktikabelsten Weg gewählt hatte.

Gruß
Christian
Anzeige
AW: PQ Abfrage aktualisieren wenn Bedingung erfüllt
15.02.2024 16:28:58
Chris
Hallo Yal,

also wenn du in einem Punkt Recht hast, dann Misverständnisse. Ich habe, gebe ich zu die beiden Versionen von Dateparse nicht berücksichtigt. Aber ich denke auch, jedem kann es mal passieren, dass man etwas überliest oder an etwas nicht denkt, oder? Ich bin genauso wenig perfekt, wie du.

Aber nun zu den Misverständnissen. Mir leuchtet nicht ein, weshalb du eine Lösung vorschlägst, die als einmalige Aktion gedacht ist, wenn ich schreibe, dass ich eine Lösung suche, die auf ein bestimmtes Ereignis reagiert, damit müsste doch klar sein, dass ich keine einmalige Lösung suche.

Des Weiteren ob Schwachsinn oder nicht, lässt sich drüber streiten. Wie ich schon gesagt habe, könnte man auch eine Lösung nehmen, die auf jede Änderung in Spalte C reagiert, ich denke das bekäme ich sogar noch selber hin, zu programmieren. Aber wie gesagt, ich wollte mir 4 Stunden unnötigen Zeitaufwand ersparen, indem ich das ganze nur aktualisieren lasse, wenn sich die 4 Formeln für mich relevant ändern.

Dein Vorschlag mit dem Wechsel zum Blatt Liste ist an für sich nicht schlecht, allerdings mache ich das kaum. Die PQ Abfrage ist ein Mittel zum Zweck um die 4 Formeln in Spalte 1 zu berechnen, also wechsele ich das Blatt eher selten bis gar nicht, die für mich relevanten Daten sind die Formelergebnisse und die stehen nicht umsonst in einer fixierten Zeile, sondern damit ich sie immer im Blick habe, egal wo im Blatt ich mich gerade befinde.

Das mit dem praktikablesten Weg war denke ich von mir blöd ausgedrückt. Damit war der Aufwand gemeint, den ich gehen muss, um die Formeln zu aktualisieren. Ob ich das jetzige beibehalte, indem ich aktualisiere in dem ich auf Daten - alle aktualisieren klicke. Alternativ dazu ein Makro nehme, welches auf das Auswählen des anderen Tabellenblatts reagiert, das kommt vom Aufwand her aufs selbe raus.

Deine ursprüngliche Makrolösung kann zwar, jetzt wo ich MEINEN Fehler gefunden habe, die PQ Abfrage ersetzen und auch die 4 Formeln können sich dann genauso auch auf die Spalte mit den SVERWEISEN beziehen, anstatt auf die PQ Abfrage. Nur, ich zitiere dich mal: "Mache eine Kopie alle Daten in einer separaten Spalte, und sortiere diese."
Diese Kopie wird keine neuen Daten beinhalten, wenn ich welche im Original hinzufüge. Es ist also wie du schon sagtest, nur eine einmalige Aktion.

Deshalb ist aus meiner Sicht keiner der Vorschläge geeignet, um mir die Arbeit in dem Sinn zu erleichtern, den ich erreichen wollte.
Um diesen kurz und knapp auf den Punkt zu bringen, mir zu ersparen, auf Daten - alle aktualisieren klicken zu müssen, nachdem ein Datum dazukam das weniger als 30 Jahre zurückliegt, um zu erreichen, dass die 4 Formelergebnisse sich aktualisieren.

Gruß
Christian
Anzeige
aber ich habe mich jetzt entschieden...
15.02.2024 17:08:48
Chris
ich mache es jetzt so, dass bei jeder Eingabe im Bereich sich die Abfrage aktualisiert

Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Column = 3 Then Worksheets("Liste").ListObjects("Abfrage").QueryTable.Refresh BackgroundQuery:=False
End Sub

(und ja hab jetzt andere Bezeichnungen)

auch wenn es jedes Mal 1 Sekunde Warten bedeutet.

ich habe da jetzt deinen Vorschlag übernommen, wenn ich es selbst gemacht hätte hätte ich die Syntax genommen wie ich sie an anderer Stelle nutze um PQ Abfragen zu aktualisieren:

Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Column = 3 Then ActiveWorkbook.Connections("Abfrage - Abfrage").Refresh
End Sub


Ich bedauere es, dass es zu so vielen Ärgernissen kam, ich weiß dass ich daran nicht unschuldig war und entschuldige mich dafür
Danke für deine Hilfe
Christian
Anzeige
AW: aber ich habe mich jetzt entschieden...
15.02.2024 17:43:56
Yal
Hallo Chris,

es war kein Ärgernis, es war Diskussion ;-)

Du kannst
BackgroundQuery:=True
verwenden. Es führt dazu, dass Du weiterarbeiten kannst, während es aktualisiert. Ob es Nebenwirkung für die Kalkulation, die auf diese Tabelle warten, ist mir nicht klar.

Die Lösung der Prüfung der Eingabe auf "innerhalb von 30 Jahren" ist auch in meiner ersten Antwort drin.

VG
Yal
mal noch ein anderer Lösungsansatz
15.02.2024 19:09:41
Chris
ich hoffe du haust ihn mir nicht um die Ohren...

Der eine Ansatz war ja, deine UDF Konvert zu nutzen, um alle Daten ins Format TT.MM.JJJJ umzuwandeln.

Dann ist es doch bestimmt auch möglich, nur das gerade eingegebene Datum umzuwandeln und zu prüfen ob es weniger als 30 Jahre zurückliegt. Und wenn ja, die Abfrage aktualisieren.

Wenn man immer nur das gerade eingegebene Datum umwandelt, sollten ja auch sämtliche Performanceprobleme gelöst sein.

Anzeige
AW: mal noch ein anderer Lösungsansatz
15.02.2024 19:58:27
Yal
Also im Prinzip berechnet Excel nur die Formel-Zellen, deren Eingangsparameter sich geändert haben. D.h. wenn Du "Konvert" direkt in der Haupttabelle verwendest, dann wird die Berechnung nicht spürbar sein. Es ändert aber leider nichts an dem "Duplikat entfernen", den Du durch die Abfrage hast.
Es gibt die Formel "Eindeutig()", die diese Duplikat entfernen vornimmt. Was diese für die Performance bedeutet, kann ich nicht einschätzen.

Ich verstehe, dass Du statistische Bewertung auf die Daten machst, aber warum gibt es nicht eine Phase "Vorbereitung der Daten" und eine Phase "Auswertung der Daten"? Diese "es muss standig alles aktuell sein" entspricht nicht die -übliche- Regel des Kunsts (wie gesagt, ich frage nur um die Reflexion anzustossen. Am Ende bleibst Du Herr im Haus :-)

VG
Yal
Anzeige
AW: mal noch ein anderer Lösungsansatz
16.02.2024 12:24:16
Chris
Es mag ja sein, dass das nicht den üblichen Regeln der Kunst entspricht, bzw. der Art, wie Profis Excel nutzen.
Ich nenne es Neugierde, worauf das Ganze hinausläuft.
jedenfalls...
16.02.2024 12:26:58
Chris
...die Variante mit dem Makro



Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 3 Then ActiveWorkbook.Connections("Abfrage - Abfrage").Refresh
End Sub


die Abfrage zu aktualisieren, ist deutlich schneller, als die Variante mit den UDF.


Vielen Dank für die Rückmeldung. owT
16.02.2024 13:46:22
Yal
AW: aber ich habe mich jetzt entschieden...
15.02.2024 18:46:14
Chris
Hallo Yal,

ok, warum und wozu kann ich dir zumindest verraten, das wird eine Liste, wann welcher Schauspieler in welchem Film/Serie mitgespielt hat und wie alt er war, als der Film/ die Serie veröffentlicht wurde.

U30 war jetzt ein Beispiel, wenn die Liste fertig ist, will ich verschiedene Statistiken zu Schauspielern in unterschiedlichen Altersklassen machen, z.b. die Frage ob Schauspieler früher in späterem Alter mit der Schauspielerei angefangen haben als heute und ähnliches.

Die 4 Formeln dienen einfach Prognosen, worauf die statistischen Daten die ich irgendwann mal auswerten will hinauslaufen, wenn die Tabelle mal fertig ist.

Aber nun zu deinem Vorschlag mit der Konvert Formel.

Dabei gibt es leider auch 2 Probleme,
zum einen bei 14500 Zeilen eine Berechnungezeit von 5 Sekunden, wobei ich deinen Vorschlag das Ganze zu beschleunigen noch nicht getestet habe.
Zum Zweiten, wenn du dir bitte die PQ Abfrage nochmal anschaust, da steckt auch ein Duplikate Entfernen drin. Wenn ich jetzt die 4 Formeln in Zeile 1 statt auf die PQ Abfrage auf die Spalte mit der Konvert Formel beziehe, geben sie andere Ergebnisse aus, weil keine Duplikate entfernt wurden (oder anders ausgedrückt, weil Personen mehrfach vorkommen).

Werde dann jetzt mal noch nach deinem Vorschlag zum Beschleunigen schaun und dann auch nochmal Rückmeldung geben.

Christian

Anzeige
AW: PQ Abfrage aktualisieren wenn Bedingung erfüllt
15.02.2024 17:35:14
Yal
Hallo Christian,

ich komme näher, wie deine Anwendung funktioniert: die ganze Liste aus imdb wird immer wieder aktualisiert, sei es per hand oder per Abfrage (warum und wozu weiss ich immer noch nicht). Darum kommen unterschiedliche Datumformat.

Ich habe festgestellt, dass bei den Daten, die mit Monat anfangen (muster "mdy"), der Monat immer alfanumerisch ist. Daher lässe sich diese Zustand leicht testen, um den passende Behandlungsmuster zu verwenden.
Man kombiniere die beide Funktionen in einer dritten, und nur diese wird in dem Blatt "alle" verwendet:

Function Konvert(ByVal Target) As Long

If TypeOf Target Is Range Then Target = Target.Cells(1).Value
Konvert = DateParse(MonatZuZahl(Target), IIf(Left(Target, 1) Like "[a-zA-Z]", "mdy", "dmy"))
End Function

Ich glaube, das könnte dein "optimale Lösung sein" (aber wie gesagt, ich überschaue das gesamt immer noch nicht).


Es gibt auch den Trick der selbst referierende Tabelle (löst aber nicht das Problem der Performance):
deine Quelltabelle heisst "Tabelle1". Du baust eine PQ-Afrage darauf: die 4 Spalten "Spalte1" bis "Spalte4" markieren und "andere Spalten entfernen" (scheint werkwürdig, aber dazu kommt man später), Spalte mit Datum duplizieren, der typ des Duplikats in Datum umwandeln und zurückgeben ("Schliessen & laden"). Es ergibt eine "Tabelle1_1". Dann "Tabelle1" löschen und "Tabelle1_1" in "Tabelle1" umbenennen. Diese Quelle wird gelesen, behandelt und das Ergebnis ersetzt das original, das beim nächste Aktualisierung wiederum als Quelle fungieren wird.

Da das Ergebnis eine Spalte mehr als das originale-Orignal hat, wird es zu einem Problem, wenn wir diese 5te Spalte nicht vorher eliminieren, weil das Duplizieren wird mekern: Spaltename bereits vorhanden. Drum zuerst nur die 4 ersten Spalten behalten.

VG
Yal


Anzeige
AW: PQ Abfrage aktualisieren wenn Bedingung erfüllt
15.02.2024 18:58:39
Chris
Hallo Yal,

wenn ich alles richtig verstanden habe, auch bei dem Trick dasselbe Problem, Duplikate werden nicht entfernt.

Gruß
Christian
AW: Testergebnis
14.02.2024 22:09:18
Yal
Hallo Chris,

vielleicht habe ich was übersehen, vielleicht reden wir einfach aneinander vorbei:

Umstellung der Daten:
es war meinerseits als eine einmalige Aktion gedacht. Dann hat man einen sauberen Zustand. Alles anderes ist spielerei. 14500 Zeilen bei fast jede Änderung (0,007% der Daten wurden geändert!) ist eine Schwachsinn, auch wenn "nur die Daten junger als 30 Jahren" die Aktualisierung auslösen sollen.

Aktualisierung:
ich habe als letztes vorgeschlagen, nur zu aktualisieren, wenn man auf das Blatt "Liste" wechselt. d.h. nur eine Sekunde, wenn man es braucht. Warum muss diese Auswertung zu jedem Zeitpunkt aktuell sein? Wozu braucht man überhaupt diese Auswertung? Was wird damit gemacht, ausser diese darzustellen (da braucht man die aktua nur, wenn man die Daten anschaut, also wenn man aufs Blatt wechselt)

DateParse rechnet falsch:
zwar ist der zweite Parameter dieser Funktion optional, aber nicht umsonst. Ich habe klar gestellt, dass es einmal
=DateParse(A1; "dmy")
sein soll und einmal
=DateParse(A1; "mdy")
(Vielleicht hätte ich besser =DateParse(A1000; "mdy") schreiben sollen)
Aber Du hättest auch dir die Fragen stellen können: warum wurde mir gesagt, ich soll die Datum sortieren und diese separieren und warum wird mir 2 Varianten angezeigt.
dmy steht für "Day-Month-Year", mdy für ... ?
(14.02.2024 13:58:34: "Nach der Sortierung sind alle nach Muster d-m-y oben, m-d-y unten. Mache eine Trennung dazwischen.")

Also "Apr 14 1997" ist eindeutig mdy, wird aber zuerst mit MonatZuZahl zu "4 14 1997" umgewandelt und mit DateParse(.. ;"mdy") zu "14.04.1997", aber nur wenn man die Anweisung vollständig und richtig gelesen hat. Wer nicht, hat auch nicht das Recht zu sagen, dass der Code falsch wäre. Programmieren ist nichts für Diletanten, weil Computer deine Ungenauigkeit nicht abfangen.

Ich hatte ebenfalls, weil die PQ Datum-Einordnung wirkungsvoller zu sein scheint, die Text-Datum zu duplizieren und der Duplikat als Datum-Typ umzuwandeln, dann den SVerweis zu verwenden. Ist irgendwo untergegangen.

"Aber langsam fange ich an zu verstehen, dass ich bereits den praktikabelsten Weg gewählt hatte."
Mit Verlaub, aber mit mehr als 20 Jahren beruflichen Erfahrung als Unternehmenberater in diesem Bereich, halte ich diese Aussage für ein typische Dunning-Kruger-Bias.

Nicht böse gemeint. Aber jemand in der Überzeugung zu belassen, dass er alles richtig macht, obwohl es absolut nicht der Fall ist, ist das Gegenteil von Hilfe.

VG
Yal
AW: PQ Abfrage aktualisieren wenn Bedingung erfüllt
14.02.2024 15:51:16
Yal
Hallo Christian,

der Code für die Aktualisierung nach Eingabe in Spalte C ist im letzten Codefenster im Posting unten zu finden. Es ist ein Einzeiler. Also nicht kompliziert.

Ich meine nur, dass es wenig sinn, bei jede Eingabe, die Abfrage zu aktualisieren. Es würde reichen, diese zu aktualisieren, wenn man auf das Blatt wechselt, wo die Abfrage herausgegeben ist, also im Blatt "Liste". Der Code dafür wäre:

Private Sub Worksheet_Activate()

ListObjects("Tabelle1_1").QueryTable.Refresh BackgroundQuery:=False
End Sub


und muss in dem Codepane vom Blatt "Liste" abgelegt werden, also auf dem Blattreiter "Liste" rechtsklicken, "Code anzeigen" anklicken und schon bist Du an der richtige Stelle.
Ich bleibe aber dabei, dass sinnvoller die Datum in der Quelle zu justieren.

VG
Yal

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige