Office: (Office 365) Bedingte Summierung in PQ

Helfe beim Thema Bedingte Summierung in PQ in Microsoft Excel Hilfe um das Problem gemeinsam zu lösen; Hallo zusammen, ich habe folgendes Problem: Spalte A: Datum Spalte B: Gewichte Pro Tag wird in Spalte B ein Gewicht geschrieben. Solange jeden Tag... Dieses Thema im Forum "Microsoft Excel Hilfe" wurde erstellt von Hannes182, 15. Januar 2025.

  1. Hannes182 hat Ahnung

    Bedingte Summierung in PQ


    Hallo zusammen,

    ich habe folgendes Problem:

    Spalte A: Datum
    Spalte B: Gewichte

    Pro Tag wird in Spalte B ein Gewicht geschrieben. Solange jeden Tag in Spalte B ein Gewicht geschrieben wird, möchte ich, dass die Gewichte automatisch summiert werden. Solange bis wieder ein Tag kommt an dem das Gewicht 0 ist. Sobald wieder ein Gewicht geschrieben wird, soll die Summierung neu beginnen...usw.

    Beispieldaten finden sich im Anhang. Ich möchte dies in PQ umsetzen.

    Bitte um eure Hilfe.

    Danke
     
    Hannes182, 15. Januar 2025
    #1
  2. d'r Bastler
    d'r Bastler Erfahrener User
    Moin Hannes,

    mit PQ kann ich leider nicht dienen, aber mit wenigen Zeilen VBA, die Du einfach in Deine Tabelle einfügst (Rechtsklick auf den Tabellennamen -> Code anzeigen -> Code einkopieren -> Code-Fenster schließen(X oben rechts) -> Datei speichern.
    Code:
    Option Explicit
    
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)    'wird beim Wechsel in eine andere Zelle gestartet
    Dim i As Integer, r As Integer, sgSum As Single                 'Deklaration der Variablen
    
    r = Cells(Rows.Count, 1).End(xlUp).Row  'bestimmt die letzte belegte Zeile in Spalte A (1)
    
    For i = 1 To r                          'Schleife durch alle belegte Zeilen
        sgSum = sgSum + Cells(i, 1)         'addiert den Wert der aktuellen Zelle zur Summe
        If Cells(i, 1) = 0 Then             'prüft ob die Zelle 0 ist
            Cells(i, 2) = sgSum             'schreibt sie Summe in Spalte B neben die Null
            sgSum = 0                       'setzt die Summe zurück
        End If                              'Prüfung Ende
    Next i                                  'Schleifen-Return
    
    End Sub                                 'setzt r und sgSum zurück. Die nächste Summe wird bei der nächsten 0 berechnet.
    Hier wird Spalte A abgefragt und das Ergebnis nach B geschrieben. Das anzupassen, bekommt man auch ohne echte VBA-Kenntnisse hin -> Kommentare lesen Bedingte Summierung in PQ *;)*

    Schöne Grüße
     
    d'r Bastler, 15. Januar 2025
    #2
  3. d'r Bastler
    d'r Bastler Erfahrener User
    Für eine Version, die Dir die Gesamtsumme in Spalte C schreibt, ergänzt Du den Code oben bei der Variablen-Deklaration mit (beachte das führende Komma)
    Nach schreibt die Summe in Spalte B dann noch diese zwei Zeilen:
    Grüße
     
    d'r Bastler, 15. Januar 2025
    #3
  4. R J
    R J User

    Bedingte Summierung in PQ

    ...dann sollst Du auch eine PQ Solution bekommen...Bedingte Summierung in PQ *:)*
     
  5. Hannes182 hat Ahnung
    Besten Dank für deine ANtwort und Hilde. Leider hab ich von VBA bisher wneig Ahnung. Ich hab deine Code eingebene, jetzt kommt aber "Laufzeitfehler 12 - Typen unverträglich".
     
    Hannes182, 16. Januar 2025
    #5
  6. Hannes182 hat Ahnung
    Super, vielen Dank. Das funktioniert genau so wie ich es brauche. Du hast mir sehr geholfen. Danke :)
     
    Hannes182, 16. Januar 2025
    #6
  7. d'r Bastler
    d'r Bastler Erfahrener User
    Moin Hannes,
    danke für die Rückmeldung. Der Laufzeitfehler tritt dann auf, wenn Du meinen Code 1:1 in Deine Tabelle übernommen hast. Denn Deine Wochentage sind natürlich keine berechenbaren Werte Bedingte Summierung in PQ *;)* An Deine Spalten angepasst läuft er. Nur so als Ermutigung, doch mal was mit VBA zu probieren.

    Schön, dass es die gewünschte PQ-Lösung gegeben hat.

    Schöne Grüße
     
    d'r Bastler, 16. Januar 2025
    #7
    1 Person gefällt das.
  8. Luschi
    Luschi Erfahrener User

    Bedingte Summierung in PQ

    Hallo R J,

    bisher glaubte ich, das List.Accumulate() das locker schafft, was List.Generate() schon lange kann, doch bei der Umstellung Deiner PQ-Funktion stelle sich heraus:
    - das bei der Verwendung von Record als Ausgangsbasis (2. Parameter)
    - zum Schluß die letzte Summierung als Listenelement fehlt
    - und zu Beginn die '0' von Summe vom Start-Record als Listenelement drin ist

    Deshalb sieht m eine Funktion jetzt so aus:
    Code:
    (Gewichte as list) =>
    let
        ListAccu = List.Accumulate(
           Gewichte ,
           [Summe = 0, erg = {}],
           (st, cur)=>
              [
                   Summe = if cur > 0 then st[Summe] + cur else 0,
                   erg = st[erg] & {st[Summe]}
              ])
    in
        List.RemoveFirstN(ListAccu[erg] & {ListAccu[Summe]}, 1)
    Gruß von Luschi
    aus klein-Paris
     
    2 Person(en) gefällt das.
  9. Hannes182 hat Ahnung
    Hallo Luschi,
    ich hab deine Lösung jetzt ausgiebig getestet und sie funktioniert bei mir auch.
    Allerdings habe ich doch ein Problem:

    Wenn Kollegen von mir die Daten aktualisieren wollen, geht das nicht. Es taucht folgender Fehler auf: [Expression Error] Während der Auswertung wurde ein zyklischer Verweis erkannt.

    Komischerweise kommt der Fehler bei mir nicht. Allerdings ist in PowerQuery, die Spalte mit den kummulierten Gewichten rot markiert und es zeigt mir an das dort ein Fehler vorliegt. Allerdings gibt es keine Information welche Art von Fehler. Die Aktualisierung geht bei mir trotz dieses Fehlers, bei Kollegen aber eben nicht.

    Gibts hierzu Ideen? Wäre sehr dankbar.
     
    Hannes182, 3. Februar 2025
    #9
  10. R J
    R J User
    Moin,

    das sagt MS zur Fehlermeldung. Ok, etwas seltsam formuliert, aber im Grunde geht es um einen Zirkelbezug.
    Das hängt vermutlich mit Deinem Aufruf der Funktion zusammen. Wir kennen ja nicht Deinen ganzen Quellcode.
    Ich weiß auch nicht wie Luschi oder Du die Funktion benannt hast, ob sie intern oder extern ist.

    Ich hab Luschis Funktion mal als externe (also eigenständige) Funktion in das Projekt eingefügt und sie fktSummenViaAccumulate genannt.
    Dann sollte folgender M-Code (mit der im Projekt eingefügten, eigenständigen Funktion fktSummenViaAccumulate von Luschi) funktionieren.
    Der Aufruf erfolgt im 2. Abfrageschritt bei Gewichte = fktSummenViaAccumulate(Quelle[#"Gewicht/kg"]),

    Code:
    let
        Quelle = Excel.CurrentWorkbook(){[Name="Tabelle1"]}[Content],
        Gewichte = fktSummenViaAccumulate(Quelle[#"Gewicht/kg"]),
        #"Hinzugefügter Index" = Table.AddIndexColumn(Quelle, "Index", 0, 1, Int64.Type),
        #"Hinzugefügte benutzerdefinierte Spalte" = Table.AddColumn(#"Hinzugefügter Index", "kum. Gewicht", each Gewichte{[Index]}),
        #"Entfernte Spalten" = Table.RemoveColumns(#"Hinzugefügte benutzerdefinierte Spalte",{"Index", "Gewicht/kg"})
    in
        #"Entfernte Spalten"
     
    Zuletzt bearbeitet: 3. Februar 2025
  11. Hannes182 hat Ahnung
    Danke für deine Antwort. Das muss ich mal bei mir testen.
    Was genau meinst du mit interne oder externe Funktion? Also am besten an meinem konkreten Beispiel.
    Bis zu diesem Anwendungsfall hab ich in PQ nur mit Abfragen gearbeitet, aber noch nie mit Funktionen. Ist daher alles noch ziemlich neu für mich.
     
    Hannes182, 3. Februar 2025
    #11
  12. R J
    R J User
    eine externe Funktion ist praktisch eine separate Abfrage. Halt nur als Funktion. Du erstellst quasi eine neue, leere Abfrage, ersetzt den besteheden Code durch Luschis Code, benennst sie (die Abfrage) um in fktSummenViaAccumulate und schon hast Du eine neue, externe Abfrage, bzw. Funktion.

    Intern wäre sie, wenn Du die Funktion in eine bestehende Abfrage einbaust.
    Im Bsp. mach ich das jetzt nicht mit List.Accumulate sondern mit List.Generate: Das Prinzip ist aber das gleiche...

    Code:
    let
        Quelle = Excel.CurrentWorkbook(){[Name="Tabelle1"]}[Content],
     
        Gewichte =
            let
                GewListe = Quelle[#"Gewicht/kg"],
                Maxwert = List.Count(GewListe),
            
                ListGenerate = List.Generate
                (
                    () =>   [x = 0, Summe = GewListe{0}],               //Initialisierung Startwerte
                    (_) =>  _[x] < Maxwert,                             //Abbruchbedingung
                    (_) =>  [                                           //auszuführende Anweisungen
                                x = _[x] +1, 
                                Summe = if GewListe{x} = 0 then 0 else _[Summe]+GewListe{x}
                            ],
                    (_) =>  _[Summe]                                    //Ergebnis
                )
            in
                ListGenerate,                                           //zurückgegebene Liste
            
        AddIDX = Table.AddIndexColumn(Quelle, "Index", 0, 1, Int64.Type),
        AddKumSum = Table.AddColumn(AddIDX, "kum. Gewicht", each Gewichte{[Index]}),
        DelIDX = Table.RemoveColumns(AddKumSum,{"Index"})
    in
        DelIDX
    Hier wird die Liste der kumulierten Gewichte quasi über die interne (also in der Abfrage integrierten) Funktion ListGenerate (ohne Punkt), durch die M-Funktion List.Generate (mit Punkt) gebildet

    Wobei ListGenerate (ohne Punkt) einfach nur ein individuell vergebener Variablenname ist, den Du auch TanteHilde nennen könntest.... wenn es das Verständnis verbessert... Bedingte Summierung in PQ o_O
     
    Zuletzt bearbeitet: 3. Februar 2025
  13. Hannes182 hat Ahnung

    Bedingte Summierung in PQ

    Danke für die Erklärung. dann hab ich das ganze aber glaube ich schon als externe Abfrage mit eingebaut. Die Liste auf die ich dann zugreife wird bei mir auch im Abfragefenster separat angezeigt (in meinem angehängten Bild "Tank 1 Liste") welche durch die Funktion "Abfrage Tank 1 Liste" generiert wird. Diese Liste baue ich dann anschließend in die Abfrage "Tank 1" ein. Tank 1 ist hier das Synonym für "Gewicht/kg" in meiner Beispieldatei.
    Es zeigt mir dann eben Fehler (100%) in "Tank 1 kum" an. Aber Werte werden dort trotzdem richtig angezeigt. Ich könnte mir vorstellen, dass dort das Problem liegt. Komisch fin eich aber, dass es bei mir funktioniert und bei meinen Kollegen nicht.
     
  14. R J
    R J User
    ...ruf mal statt der Liste die Funktion direkt auf. So wie im Post #9 im Schritt Gewichte demonstriert:

    Gewichte = fktSummenViaAccumulate(Quelle[#"Gewicht/kg"]),

    Wichtig ist, dass Du immer darauf achtest, auf welchen Abfrageschritt sich die Funktion beziehen soll. Das muss nicht immer der direkte Vorgängerschritt sein. Es ist bei Deiner Konstellation durchaus möglich, dass sich Deine Tankliste auf eine andere Abfrage bezieht, die dann den Zirkelbezug verursacht, oder, Du versuchst die Tankliste aus der Abfrage zu erstellen, die die Liste erstellt (und sich somit selbst aufrufen muss, obwohl sie gerade mit sich selbst beschäftigt ist) und schwupp... schon hast Du den Zirkelbezug....
    Aber ohne Deine Abfrage konkret zu kennen, lässt sich auch nichts konkretes dazu sagen. Lade doch mal die Datei hoch...
     
    Zuletzt bearbeitet: 4. Februar 2025 um 10:37 Uhr
  15. Hannes182 hat Ahnung
    Ich bin heute nicht mehr dazugekommen selbst nochmal rumzuspielen und den Fehler zu finden, aber anbei nochmal eine Beispieldatei die genau den Fehler hat. Vielleicht hilft das.
     
Thema:

Bedingte Summierung in PQ

Die Seite wird geladen...
  1. Bedingte Summierung in PQ - Similar Threads - Bedingte Summierung

  2. Bedingte Formatierung basierend auf Wert anderer Zelle

    in Microsoft Excel Hilfe
    Bedingte Formatierung basierend auf Wert anderer Zelle: Hallo zusammen, beim Erreichen des 18. Lebensjahres (Geburtsdatum Spalte D, Alter automatisch in Spalte E kalkuliert) soll eine bedingte Formatierung den Namen und Vornamen der Teilnehmer (Spalte...
  3. Anfängerfrage zur bedingten Formatierung

    in Microsoft Excel Hilfe
    Anfängerfrage zur bedingten Formatierung: Mal eine echte Anfängerfrage: Wenn ich in Excel (Mac) als bedingte Formatierung eine Formel verwenden möchte, muss ich immer folgende Schritte durchführen: -Bedingte Formatierung -Neue Regel -...
  4. Negative Datenbalken - bedingte Formatierung

    in Microsoft Excel Hilfe
    Negative Datenbalken - bedingte Formatierung: Liebes Forum! Ich habe in einer Tabelle positive und negative Prozentwerte. Diese Tabelle hat eine bedingte Formatierung mittels Datenbalken. Wie kann ich die negativen Balken in die gleiche...
  5. Formatierung eines Datumsfelds, wenn das gleiche Datum woanders erscheint

    in Microsoft Excel Hilfe
    Formatierung eines Datumsfelds, wenn das gleiche Datum woanders erscheint: Hallo! Hab leider zu meinem Problem bisher nichts gefunden. Ich baue eine Art Kalender, um eine Übersicht über Events + größere ToDos im Jahr zu haben - siehe Screenshot im Anhang. Im Screenshot...
  6. Bedingte Formatierung / Wiederholungen "ausblenden"

    in Microsoft Excel Hilfe
    Bedingte Formatierung / Wiederholungen "ausblenden": Einen schönen guten Tag, Bräuchte mal hilfe bei der Bedingen Formatierung. Ich würde gerne wiederholungen "ausblenden" (schriftfarbe) , so das immer nur der erste werd klar gezeigt wird sowohl...
  7. Kalenderfarbe: Termine außerhalb meiner Organisation

    in Microsoft Outlook Hilfe
    Kalenderfarbe: Termine außerhalb meiner Organisation: Hallo zusammen, ich habe in meinem Kalender einige bedingte Formatierungen für die Farbe (bspw. Terminblocker oder Termine von bestimmten Personen) und würde gerne Termine mit externen Personen...
  8. Bedingte Formatierung bei einem Datumsbereich

    in Microsoft Access Hilfe
    Bedingte Formatierung bei einem Datumsbereich: Hallo liebe Foren Mitglieder Ich benötige Unterstützung bei der Formulierung meines Kriteriums bei einer bedingten Formatierung. Um geplante Abwesenheitszeiträume zu sehen habe ich eine Abfrage...
  1. Diese Seite verwendet Cookies, um Inhalte zu personalisieren, diese deiner Erfahrung anzupassen und dich nach der Registrierung angemeldet zu halten.
    Auf dieser Website werden Cookies für die Zugriffsanalyse und Anzeigenmessung verwendet.
    Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden