Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1884to1888
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

Anzahl von Tage mit Wert größer 0

Anzahl von Tage mit Wert größer 0
25.05.2022 13:09:39
Tage
Hallo,
ich habe folgendes Problem.
In einer Excel-Datei mit Lagerdaten stehen Artikel-Nr., Bestands-Veränderungen, Datum und neue Menge.
Das Ziel ist es zu ermitteln, an wie vielen Tagen war der Artikel verkäuflich, daher Menge größer Null.
Leider kann ich nicht einfach Zählenwenn anwenden, da ein Artikel nur einen Eintrag hat, wenn es eine Veränderung gibt. Plus es kann vorkommen, dass ein Artikel an einem Tag mehr als einen Eintrag hat, dann brauche ich denn letzten Eintrag des Artikels am Tag.
Ursprünglich hatte ich an Minimum pro Tag gedacht, jedoch kann es vorkommen, dass ein Artikel auf null geht und am selben Tag wieder auf Übernull steigt. Wobei dies selten vorkommt und daher eine Ungenauigkeit wäre, die im Rahmen liegt. 
Daher war mein Vorgehen bis jetzt, zu ermitteln wie hoch und wann es denn ersten Eintrag gab (Dies ist in der Regel nicht der 01.01, aber wenn er größer als Null war wurde der 01.01 genommen), wie hoch und wann es denn letzten Eintrag gab, (Dies ist in der Regel nicht der 31.12., aber wenn er größer als Null war wurde der 31.12 genommen),
dann habe ich denn kleinsten Bestand ermitteln und das Datum, anschließend denn kleinsten Bestand für ein späteres Datum als das Datum des kleinsten Bestands.
Anschließend wollte ich denn ersten Eintrag mit Menge größer Null zwischen z. B. denn kleinsten und zweitkleinsten ermitteln. Dies funktioniert leider nicht.
Die Datei mit meinen Berechnungen, und Beispieldaten findet ihr hier https://www.herber.de/bbs/user/153269.xlsx
Vielen Dank
Vermutlich gibt es eine deutlich einfachere Lösung in VBA und/oder Power Querry.
Anbei findet Ihr eine Beispielarbeitsmappe mit dem erwarteten Ergebnis, meine bisherige Berechnung und Beispieldaten.

12
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
ein Ansatz mit PQ
25.05.2022 14:50:30
ChrisL
Hi Jonas
https://www.herber.de/bbs/user/153271.xlsx
Einschränkung:
- Die Lösung stützt ausschliesslich auf den Saldo ab. Darum müsstest du für alle Artikel einen Startwert per 1.1. erfassen.
- Ich habe mich auf die Zielsetzung gemäss Beschreibung (an wie vielen Tagen war der Artikel verkäuflich) konzentriert und dein Wunschergebnis in der Beispieldatei ignoriert.
Ausbaufähig:
- Das Resultat in Tabellenform würde man zwecks Performanceoptimierung nicht ausgeben (habe ich nur zwecks Beispiel/Transparenz angezeigt) und die Daten direkt aggregieren/pivotieren.
- Eine Form von Pivot/Pivot-Chart als Ausgaberesultat bietet Flexibilität u.a. Darstellung über mehrere Jahre, Filter/Datenschnittoptionen etc.
Zur Power-Query:
Trivial ist die Lösung nicht, aber immerhin ist das Thema mit den Saldo-Schwankungen pro Tag einfach zu lösen. Über den Standarddialog eine Gruppierung mit "Min" erstellen. Danach in den Code im erweiterten Editor eingreifen und einfach List.Min mit List.Last überschreiben.
Die Hauptabfrage beginnt mit einer neuen leeren Abfrage. In die Befehlszeile folgendes eintippen, was eine durchgehende Datumsreihe für ganze Jahre erzeugt:

=Table.FromList(List.Dates(Date.StartOfYear(List.Min(QuelleGruppiert[Datum])),Duration.Days(Date.EndOfYear(List.Max(QuelleGruppiert[Datum]))-Date.StartOfYear(List.Min(QuelleGruppiert[Datum])))+1,#duration(1, 0, 0, 0)), Splitter.SplitByNothing(), null, null, ExtraValues.Error)
Mittels benutzerdefinierter Spalte und anschliessender Expansion direkt in Zeilen multiplizierst du die Datumsreihe mit den Artikelnummern:

NeuSpalte =List.Distinct(QuelleGruppiert[Artikelnummer])
Dann einen Join mit den bereits gruppierten Quelldaten und einem FillDown nach unten vervollständigen.
cu
Chris
Anzeige
Anzahl von Tage mit Wert größer 0
25.05.2022 15:55:02
Tage
Vielen Dank Chris
Das spart mir eine ganze Menge Zeit und Nerven.
AW: Anzahl von Tage mit Wert größer 0
26.05.2022 10:14:48
Tage
Hallo Steve,
das finde ich mal eine ganz tolle Art, auf ein Crossposting hinzuweisen! Spitze!
Servus
AW: dazu festgestellt und nachgefragt ...
26.05.2022 11:07:40
neopa
Hallo Chris,
... PQ mit anschließender Pivotauswertung ist hierfür sicherlich die effektivste Lösung.
Mich hatte es nun aber interessiert, ob ich mit einer Formelauswertung nicht auch auf die in der Beispieldatei vorgegebene Lösung kommen kann. Das ist bedingt möglich. Dazu hab ich je einen Datensatz für Art.-Nr. 1 und 2 für den 1.1.19 eingefügt mit einer Menge 0. Danach die Daten nach Art.-Nr und Datum aufwärts sortiert
Mit nachfolgender aufgezeigter nach unten kopierbarer Formel ermittele ich jedoch für Art.Nr 1 ein Tag weniger als von Jonas vorgegeben und für 2 sogar 7 Tage weniger. Die Differenz von 1 Tag für Nr. 1 erklärt sich für mich dadurch, dass ich meine Formel noch ergänzen müsste, für Tage wie den 18.09.19, wo zuvor kein Bestand mehr da war und der eingegangene Bestand sofort wieder verkauft wurde. Auf die mögliche Formelerweiterung hab ich verzichtet. Der Vorgabewert von Jonas für Art. 2 ist aber mE falsch.
Arbeitsblatt mit dem Namen 'Erwartetes Ergebnis'
 AC
1Art.Nr.Tage mit Bestand größer 0
21293
32330
4  

ZelleFormel
C2{=SUMME(WENNFEHLER(WENNFEHLER(AGGREGAT(15;6;Bewegung!B$2:B$999/(Bewegung!A$2:A$999=A2)/(Bewegung!D$2:D$999=0)/(Bewegung!D$1:D$999&gt0);ZEILE(A$2:A199));"31.12.19"*1)-WENNFEHLER(AGGREGAT(15;6;Bewegung!B$2:B$999/(Bewegung!A$2:A$999=A2)/(Bewegung!D$1:D$999=0)/(Bewegung!D$2:D$999&gt0);ZEILE(A$1:A$98));"");0))}
Achtung, Matrixformel enthalten!
Die geschweiften Klammern{} werden nicht eingegeben.
Verlassen Sie den Zelleneditor mit Strg+Shift + Enter, statt Enter alleine.
Verwendete Systemkomponenten: [Windows (32-bit) NT 6.02] MS Excel 2010
Diese Tabelle wurde mit Tab2Html (v2.6.0) erstellt. ©Gerd alias Bamberg

Zur PQ-Lösung. Wenn in der Datei die zusätzlich eingeführten Datensätze für den 1.1.19 auch auf eine Menge 0 gesetzt würde, kommt man für Art. 1 auf den Vorgabewert von 294 und für 2 auf 331 Tage.
Allerdings Jonas,
die ermittelten Tage würden so oder so nur korrekt sein, wenn der Verkauf auch an jedem Tag möglich wäre. Andernfalls müssten noch die Wochenende & Feiertage abgerechnet werden, an denen ein Bestand größer 0 vorhanden ist. Dies wäre auch mit beiden Lösungsansätzen (sicherlich einfacher mit PQ) möglich, aber diesen Zusatzaufwand müsstest Du mE dann schon noch aufbringen.
Gruß Werner
.. , - ...
Anzeige
AW: dazu festgestellt und nachgefragt ...
27.05.2022 11:28:14
ChrisL
Hi Werner
Ich nehme einfach mal an, es handelt sich um einen Webshop, welcher 24/7 geöffnet ist. :)
Schlussendlich generiert man eine statistische Zahl, welcher eine (zu definierende) Berechnungsmethode zugrunde liegt. Wird der letzte Artikel um 23.59 Uhr verkauft, dann wäre der Artikel an diesem Tag in der Praxis trotzdem noch zum Verkauf gestanden. Oder wenn man zwar einen Lagerbestand von 10 hat, aber 20 bestellt werden, kann man die Nachfrage trotzdem nicht vollständig erfüllen.
Mein Lösungsansatz generiert sehr umfangreiche Daten (100 Artikel * 10 Jahre = ca. 365'000 Zeilen). Einerseits könnte man früh (vor Expansion) die Aussage auf "verkäuflich wahr/falsch" reduzieren, womit man den Umfang etwas reduziert. Andererseits könnte man mit einer Differenzberechnung (statt jeden Tag einzeln aufzuführen) die Datenmenge drastisch reduzieren.
Die Einzeldarstellung je Tag gefällt mir aber, weil sich dadurch die Entwicklung auf einem Zeitstrahl darstellen lässt. Zu hohe Lagerbestände über einen längeren Zeitraum sind letztlich auch kontraproduktiv.
Alles eine Frage der konkreten Ausgangslage (Datenmenge aufgrund Multiplikation) und davon, was man genau analysieren möchte.
Deine Formellösung ist beeindruckend, aber für mich ausser Reichweite, um sie im Detail zu verstehen. Wenn ich raten müsste, würde ich vermuten, dass die unterschiedlichen Resultat aufgrund der Differenzberechnung (vs. Einzeltage) entstanden sind. 31.12. minus 1.1. = 364 statt 365 Tage. Ich denke in einer Differenzbetrachtung müsste man den Betrachtungszeitraum für ein ganzes Jahr auf 1.1.19-1.1.20 erhöhen.
Aber eben, ist nur geraten.
cu
Chris
Anzeige
AW: hierzu ...
27.05.2022 14:51:15
neopa
Hallo Chris,
... wenn es sich um einen Webschop handeln sollte, dann ist die Ermittlung natürlich nicht so aufwendig wie ich vermutet habe.
Deine Vermutungen zu meiner Formelermittlung sind teils zutreffend. Ja, ich hätte richtigerweise anstelle den 31.12.19 als Enddatum, den 1.1.20 "falls Fehler"-Wert für WENNFEHLER() definieren müssen. Damit ergibt sich dann als korrekter Ergebniswert für
Artikel 1 aber nicht 294 sondern 295. Dies deshalb, weil ich mit meiner eingestellten Formel für den 18.09. als Differenz nur eine 0 ermittele (richtig ist aber 1), worauf ich aber schon aufmerksam gemacht hatte und was ich auch noch leicht in die Formel integrieren könnte. Den Wert von 295 hast Du mit PQ zwar ermittelt, allerdings ist Zufalls. Denn dort iist der 1.1.19 beinhaltet, obwohl an diesem Tag kein Verkauf möglich war. Dafür ist bei Dir der 18.09. als Nichtverkaufstag ausgewiesen, obwohl da ein Verkauf stattfand.
Die Ermittlung für Artikel 1 in meiner bisher aufgezeigten Formel erfolgt im Prinzip wie folgt (nur eben alles noch in einer Formel zusammengefasst) Sie ergibt 293 und würde mit dem beschriebenen Korrekturen die 295 ergeben:
Arbeitsblatt mit dem Namen 'Bewegung'
 HIJK
1StartEndeDiff 
202.01.201917.07.2019196 
329.08.201910.09.201912 
414.09.201917.09.20193 
518.09.201918.09.2019+1
610.10.201924.12.201975 
724.12.201931.12.20197+1
8  293295

ZelleFormel
H2=WENNFEHLER(AGGREGAT(15;6;Bewegung!B$2:B$999/(Bewegung!A$2:A$999=A2)/(Bewegung!D$1:D$999=0)/(Bewegung!D$2:D$999&gt0);ZEILE(A1));"")
I2=WENNFEHLER(AGGREGAT(15;6;Bewegung!B$2:B$999/(Bewegung!A$2:A$999=A3)/(Bewegung!D$2:D$999=0)/(Bewegung!D$1:D$999>0);ZEILE(A2));"31.12.19"*1)
Verwendete Systemkomponenten: [Windows (32-bit) NT 6.02] MS Excel 2010
Diese Tabelle wurde mit Tab2Html (v2.6.0) erstellt. ©Gerd alias Bamberg

Allerdings war und ist meine noch zu korrigierende Formellösung nur mehr eine für mich. In der Praxis sollte (D)eine entsprechend noch anzupassende PQ/Pivot-Lösung zum Einatz kommen.
Gruß Werner
.. , - ...

Anzeige
PQ Funktion für Startdatum 1.1.
27.05.2022 11:33:21
ChrisL
Hi
Anbei noch eine nette Spielerei, damit man die Startdaten 1.1. nicht manuell ergänzen muss.
https://www.herber.de/bbs/user/153289.xlsx
Die Funktion muss man nicht im Detail verstehen. Neue leere Abfrage:

= fxDatenErgaenzen(QuelleRohdaten,0)
erzeugt die neue Tabelle mit zusätzlichen Zeilen, sofern ein Artikel nicht sowieso schon einen Startwert per 1.1. enthält.

(InputTB as table, loop as number) =>
let
JahrStart = Date.StartOfYear(List.Min(InputTB[Datum])),
AktuelleArtikelnummer = List.First(List.Range(List.Distinct(InputTB[Artikelnummer]),loop,1)),
TBgefiltert = Table.SelectRows(InputTB, each ([Artikelnummer] = AktuelleArtikelnummer)),
MengeNeu = List.First(Table.Column(TBgefiltert, "historische Menge"))-List.First(Table.Column(TBgefiltert, "Mengenänderung")),
OutputTB =
if List.First(TBgefiltert[Datum]) = JahrStart then
InputTB
else
Table.InsertRows(InputTB, 0, {[Artikelnummer = AktuelleArtikelnummer, Datum = JahrStart, Mengenänderung = 0, historische Menge = MengeNeu]}),
output =
if loop = List.Count(List.Distinct(InputTB[Artikelnummer]))-1 then
OutputTB
else
@#"fxDatenErgaenzen" (OutputTB,loop+1)
in
output
cu
Chris
Anzeige
AW: mE sollte das so nicht notwendig sein ...
27.05.2022 15:15:10
neopa
Hallo Chris,
... denn ich interpretiere es so, dass das erste gelistete Datum das Startdatum des Verkaufes des jeweiligen Artikels ist und nicht der 01.01. des Jahres. So hatte ich es jedenfalls gestern und auch heute betrachtet.
Gruß Werner
.. , - ...
AW: mE sollte das so nicht notwendig sein ...
27.05.2022 15:59:21
ChrisL
Hi Werner
Ich habe es aufgrund der Aussage von Jonas so interpretiert, aber sicher bin ich auch nicht
...wann es denn ersten Eintrag gab (Dies ist in der Regel nicht der 01.01, aber wenn er größer als Null war wurde der 01.01 genommen)
Für meine PQ Lösung wäre es aber zwingend notwendig einen 1.1. zu definieren. Da ich mit FillDown (nach unten ausfüllen) gearbeitet habe, würde im schlimmsten Fall der End-Wert von einem Artikel in die Start-Werte des nächsten Artikels übertragen werden. Ansonsten müsste ich noch einmal an meiner Query arbeiten.
Danke auch für die Rückmeldung zum anderen Beitrag. Ich denke Jonas müsste sich melden, wenn er die Logik noch präzisieren möchte. Für die Schwankung am 18.9. habe ich ihn so verstanden, dass er den Tagesendsaldo berücksichtigen möchte, weshalb ich List.Last() (letzter Eintrag am Tag) vorgeschlagen habe. Aber die Logik lässt sich leicht in Min, Max oder First ändern.
cu und ein schönes WE
Chris
Anzeige
AW: ich vermute mal, ...
27.05.2022 17:05:32
neopa
Hallo Chris,
... dass wir von Jonas wohl kaum vor Montag eine Rückmeldung bekommen. Es ist wirklich entscheidend, was er mit seiner Aussage bzgl. des 1.1. wirklich gemeint hat.
Deine Aussage, wonach für Deine PQ-Lösung den 1.1. zu definieren, zwingend notwendig ist, ist nachvollziehbar. Aber wenn am 1.1. noch kein Verkauf möglich war, brauchst Du doch lediglich als "historische Menge" eine 0 zuzuweisen.
Wünsche Dir auch ein schönes WE.
Gruß Werner
.. , - ...
AW: ich vermute mal, ...
27.05.2022 17:16:33
ChrisL
Hi Werner
Vielleicht ist Jonas von der ganzen Sache auch etwas erschlagen und musst die vielen Beiträge erstmal verdauen. :)
Selber bin ich jetzt auch weg. Versuche meine Excel-Sucht auf Bürozeiten zu beschränken ;)
Und ja, natürlich könnte ich auch eine 0 zuweisen, aber mit der Mengenänderung lässt sich sauber rückwärts rechnen, was zum korrekten Resultat führt, vorausgesetzt die Daten wurden per 1.1. "abgeschnitten".
cu und bis zum nächsten mal
Chris
Anzeige

320 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige