Wir wünschen allen Forenteilnehmern ein frohes Fest und einen guten Rutsch ins neue Jahr. x

LET Funktion | Wo ist der/die Fehler
#1
Hallo zusammen,

irgendwie funktioniert eine LET Funktion nicht. Diese sieht so aus:
=LET(
    e; EINDEUTIG(HSTAPELN(JAHR('time_card | Tag | ohne 0'!A2:A4000); TEXT('time_card | Tag | ohne 0'!A2:A4000; "MMMM"); 'time_card | Tag | ohne 0'!D2:D4000; 'time_card | Tag | ohne 0'!C2:C4000; 'time_card | Tag | ohne 0'!L2:L4000));
    VSTAPELN(
        {"Jahr"."Monat"."Name"."Kategorie"."Tagessatz"."Stunden"."Kosten"};
        HSTAPELN(
            e;
            SUMMEWENNS(
                'time_card | Tag | ohne 0'!I2:I4000;
                JAHR('time_card | Tag | ohne 0'!A2:A4000); INDEX(e;;1);
                TEXT('time_card | Tag | ohne 0'!A2:A4000; "MMMM"); INDEX(e;;2);
                'time_card | Tag | ohne 0'!D2:D4000; INDEX(e;;3);
                'time_card | Tag | ohne 0'!C2:C4000; INDEX(e;;4)
            );
            SUMMEWENNS(
                'time_card | Tag | ohne 0'!I2:I4000;
                JAHR('time_card | Tag | ohne 0'!A2:A4000); INDEX(e;;1);
                TEXT('time_card | Tag | ohne 0'!A2:A4000; "MMMM"); INDEX(e;;2);
                'time_card | Tag | ohne 0'!D2:D4000; INDEX(e;;3);
                'time_card | Tag | ohne 0'!C2:C4000; INDEX(e;;4)
            ) * INDEX(e;;5) / 8
        )
    )
)

Idee ist:
nun möchte ich unter Blatt 'Blatt 2' eine Tabelle die mir anzeigt:
Spalte 1 Jahr
Spalte 2 Monat
Spalte 3 Benutzer
Spalte 4 Kategorie
Spalte 5 Tagessatz
Spalte 6 Stunden (alle in diesem Monat abgeleisteten Stunden von dem Benutzer aufsummiert)
Spalte 7 Kosten (berechnet nach Anzahl der Stunden in dem Monat * den Tagessatz /8)  Erklärung ein Arbeitstag hat 8 Stunden. 

anbei auch das Excel (genutzt wird Excel 365 deutsch)

Viele Grüße und einen schönen Abend

Driver


Angehängte Dateien
.xlsx   test cleverexcel.xlsx (Größe: 12,86 KB / Downloads: 12)
Antworten Top
#2
hier mal eine Idee. Nicht die eleganteste Variante. Mach was draus.

Code:
=LET(
    zeil; SEQUENZ(ANZAHL2('time_card | Tag | ohne 0'!A2:A4000));
    spA; INDEX('time_card | Tag | ohne 0'!A2:A4000; zeil; 1);
    spD; INDEX('time_card | Tag | ohne 0'!D2:D4000; zeil; 1);
    spL; INDEX('time_card | Tag | ohne 0'!L2:L4000; zeil; 1);
    spI; INDEX('time_card | Tag | ohne 0'!I2:I4000; zeil; 1);
    bnutzer; EINDEUTIG(FILTER(spD; spD <> ""); FALSCH; FALSCH);
    mont; MONAT(HEUTE());
    std; NACHZEILE(
        bnutzer;
        LAMBDA(usr; SUMME(WENN((MONAT(spA) = mont) * (spD = usr); spI)))
    );
    kst; NACHZEILE(
        bnutzer;
        LAMBDA(usr; SUMME(WENN((MONAT(spA) = mont) * (spD = usr); spI * spL)))
    );
    VSTAPELN(
        {"Monat". "Name". "Stunden". "Kosten"};
        HSTAPELN(SEQUENZ(ZEILEN(bnutzer); ; mont; 0); bnutzer; std; kst)
    )
)
Antworten Top
#3
Und wo ist die Wunschlösung?
Antworten Top
#4
Du kannst doch nicht innerhalb der Definition von Variable e diese Variable e benutzen - sie ist ja noch gar nicht zu Ende definiert. Das wäre ein klassischer "Zirkelbezug".
Antworten Top
#5
Hi oee,

Zitat:Du kannst doch nicht innerhalb der Definition von Variable e diese Variable e benutzen - sie ist ja noch gar nicht zu Ende definiert. Das wäre ein klassischer "Zirkelbezug".

das ist nicht das Problem, der Teil ist korrekt! Problem ist, dass SUMMEWENNS nicht mit Jahr(Bereich);Monat(Bereich) und Tag(Bereich) umgehen kann!

@Driver,

so sollte es passen:

Code:
=LET(e;EINDEUTIG(HSTAPELN(JAHR('time_card | Tag | ohne 0'!A2:A4000);TEXT('time_card | Tag | ohne 0'!A2:A4000;"MMMM");'time_card | Tag | ohne 0'!D2:D4000;'time_card | Tag | ohne 0'!C2:C4000;'time_card | Tag | ohne 0'!L2:L4000));VSTAPELN({"Jahr"."Monat"."Name"."Kategorie"."Tagessatz"."Stunden"."Kosten"};HSTAPELN(e;SUMMEWENNS('time_card | Tag | ohne 0'!I2:I4000;'time_card | Tag | ohne 0'!A2:A4000;">=1."&INDEX(e;;2)&"."&INDEX(e;;1);'time_card | Tag | ohne 0'!A2:A4000;"<="&MONATSENDE("1."&INDEX(e;;2)&"."&INDEX(e;;1);0);'time_card | Tag | ohne 0'!D2:D4000;INDEX(e;;3);'time_card | Tag | ohne 0'!C2:C4000;INDEX(e;;4));SUMMEWENNS('time_card | Tag | ohne 0'!I2:I4000;'time_card | Tag | ohne 0'!A2:A4000;">=1."&INDEX(e;;2)&"."&INDEX(e;;1);'time_card | Tag | ohne 0'!A2:A4000;"<="&MONATSENDE("1."&INDEX(e;;2)&"."&INDEX(e;;1);0);'time_card | Tag | ohne 0'!D2:D4000;INDEX(e;;3);'time_card | Tag | ohne 0'!C2:C4000;INDEX(e;;4))*INDEX(e;;5)/8)))
Gruß

Edgar

Meine Antworten sind freiwillig und ohne Gewähr!
Über Rückmeldungen würde ich mich freuen.
[-] Folgende(r) 1 Nutzer sagt Danke an BoskoBiati für diesen Beitrag:
  • Driver
Antworten Top
#6
Hallo, passt perfekt!!! Vielen Dank :) Schönes Wochenende
Antworten Top
#7
Du hast Recht, das war doch keine Definition - ich hatte das "HSTAPELN" übersehen.
Antworten Top
#8
Hallo,

in der Beispieltabelle wird Ralf Rabi im selben Monat (Feb. 23) einmal mit einem Tagessatz von 60 und einmal mit 65 aufgeführt.
Meiner Ansicht nach müsste somit auch nach Tagessatz gesplitted werden, so denn Tagessatz als Spalte im Ergebnis aufgeführt wird.

Die Formel sieht dann bei wie mir folgt aus, die zudem ein anderes Ergebnis in Summe liefert, als die Formeln hier oben im Thread.

PHP-Code:
=LET(vnDatenFILTER('time_card | Tag | ohne 0'!A2:L4000INDEX('time_card | Tag | ohne 0'!A2:L400001) > 0); 
     vnAuswahlHSTAPELN(JAHR(INDEX(vnDaten01)); 
                         MONAT(INDEX(vnDaten01)); 
                         INDEX(vnDaten04); 
                         INDEX(vnDaten03); 
                         INDEX(vnDaten012); 
                         INDEX(vnDaten09); 
                         WENNFEHLER(INDEX(vnDaten09) * INDEX(vnDaten012) / 80); 
                         JAHR(INDEX(vnDaten01)) & "-" MONAT(INDEX(vnDaten01)) & "-" INDEX(vnDaten012) & "-" INDEX(vnDaten04)); 
     vnMatrixSORTIERENNACH(vnAuswahlINDEX(vnAuswahl01); 1INDEX(vnAuswahl02); 1INDEX(vnAuswahl03); 1); 
     vnUnikateEINDEUTIG(INDEX(vnMatrix0SPALTEN(vnMatrix))); 
     vnSpaltenSEQUENZ(1SPALTEN(vnMatrix)); 
     vnGruppierungWEGLASSEN(REDUCE(""SEQUENZ(ZEILEN(vnUnikate)); LAMBDA(A;V
                    LET(FFILTER(vnMatrixINDEX(vnMatrix0SPALTEN(vnMatrix)) = INDEX(vnUnikateV1)); 
                    VSTAPELN(AMAP(INDEX(F10); vnSpaltenLAMBDA(X;YWENN((<> 2) * (<> 6) * (<> 7); X
                    WENN(<> 2SUMME(INDEX(F0Y)); TEXT(DATUM(2000X1); "MMMM"))))))))); 1; -1); 
     VSTAPELN({"Jahr"."Monat"."Benutzer"."Kategorie"."Tagessatz"."Stunden"."Kosten"}; vnGruppierung)) 

Wenn man jetzt nur auf Stunden und Kosten aggregieren würde, könnte man den Tagessatz im Ergebnis weglassen,
was dann wie folgt aussieht:

PHP-Code:
=LET(vnDatenFILTER('time_card | Tag | ohne 0'!A2:L4000INDEX('time_card | Tag | ohne 0'!A2:L400001) > 0); 
     vnAuswahlHSTAPELN(JAHR(INDEX(vnDaten01)); 
                         MONAT(INDEX(vnDaten01)); 
                         INDEX(vnDaten04); 
                         INDEX(vnDaten03); 
                         INDEX(vnDaten09); 
                         WENNFEHLER(INDEX(vnDaten09) * INDEX(vnDaten012) / 80); 
                         JAHR(INDEX(vnDaten01)) & "-" MONAT(INDEX(vnDaten01)) & "-" INDEX(vnDaten04)); 
     vnMatrixSORTIERENNACH(vnAuswahlINDEX(vnAuswahl01); 1INDEX(vnAuswahl02); 1INDEX(vnAuswahl03); 1); 
     vnUnikateEINDEUTIG(INDEX(vnMatrix0SPALTEN(vnMatrix))); 
     vnSpaltenSEQUENZ(1SPALTEN(vnMatrix)); 
     vnGruppierungWEGLASSEN(REDUCE(""SEQUENZ(ZEILEN(vnUnikate)); LAMBDA(A;V
                    LET(FFILTER(vnMatrixINDEX(vnMatrix0SPALTEN(vnMatrix)) = INDEX(vnUnikateV1)); 
                    VSTAPELN(AMAP(INDEX(F10); vnSpaltenLAMBDA(X;YWENN((<> 2) * (<> 5) * (<> 6); X
                    WENN(<> 2SUMME(INDEX(F0Y)); TEXT(DATUM(2000X1); "MMMM"))))))))); 1; -1); 
     VSTAPELN({"Jahr"."Monat"."Benutzer"."Kategorie"."Stunden"."Kosten"}; vnGruppierung)) 

Gruß
Microsoft Excel Expert · Microsoft Most Valuable Professional (MVP) :: 2011-2019 & 2020-2022 :: 10 Awards
https://de.excel-translator.de/translator :: Online Excel-Formel-Übersetzer :: Funktionen :: Fehlerwerte :: Argumente :: Tabellenbezeichner
Antworten Top
#9
Hallo,

um den schrecklichen Arbeitsblattnamen in der Formel zu beseitigen und den Datenbereich dynamisch zu gestalten, habe ich aus den Quelldaten eine strukturierte (intelligente) Tabelle erzeugt mit Namen "tbDaten".
Ferner habe ich für die Jahr/Monats-Gruppierung nur 1 Spalte verwendet und erst die Ausgabe im Arbeitsblatt gesplittet auf 2 Spalten.

Meine Formel sieht dann so aus:
PHP-Code:
=LET(
    mHSTAPELN(
        DATUM(JAHR(tbDaten[Datum]); MONAT(tbDaten[Datum]); 1);
        tbDaten[Benutzer];
        tbDaten[Kategorie];
        tbDaten[Tagessatz]
    );
    eEINDEUTIG(m);
    sNACHZEILE(
        e;
        LAMBDA(zl;
            SUMME(
                tbDaten[Arbeitszeit] * (INDEX(m; ; 1) = INDEX(zl; ; 1)) *
                    (INDEX(m; ; 2) = INDEX(zl; ; 2)) * (INDEX(m; ; 3) = INDEX(zl; ; 3)) *
                    (INDEX(m; ; 4) = INDEX(zl; ; 4))
            )
        )
    );
    kINDEX(e; ; 4) / 8;
    VSTAPELN(
        {"Jahr""Monat""Name""Kategorie""Tagessatz""Stunden""Kosten"};
        HSTAPELN(JAHR(INDEX(e; ; 1)); esk);
        HSTAPELN("""""""Gesamt:"""SUMME(s); SUMME(k))
    )

Falls die Funktion "GRUPPIERENNACH" bereits zur Verfügung steht:
PHP-Code:
=LET(
    gGRUPPIERENNACH(
        HSTAPELN(
            DATUM(JAHR(tbDaten[Datum]); MONAT(tbDaten[Datum]); 1);
            tbDaten[Benutzer];
            tbDaten[Kategorie];
            tbDaten[Tagessatz]
        );
        tbDaten[Arbeitszeit];
        SUMME;
        0;
        0
    
);
    koHSTAPELN("Jahr""Monat""Name""Kategorie""Tagessatz""Stunden""Kosten");
    wwHSTAPELN(JAHR(INDEX(g; ; 1)); gINDEX(g; ; 4) * INDEX(g; ; 5) / 8);
    suHSTAPELN("""""""Gesamt:"""SUMME(INDEX(ww; ; 6)); SUMME(INDEX(ww; ; 7)));
    VSTAPELN(kowwsu)

Mit lieben Grüßen
Anton.

Windows 10 64bit
Office365 32bit
Antworten Top


Gehe zu:


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