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

Manngebirge strecken / stauchen - suche Algoritmus

Manngebirge strecken / stauchen - suche Algoritmus
09.05.2016 21:18:30
raspi
Ich habe folgende Aufgabenstellung, wo mir kein gescheiter Algoritmus einfällt. Möglicherweise durfte schon mal jemand so etwas erstellen.
Es geht um die Verteilung von Arbeitsaufwand über der Zeit ( auch bekannt unter dem Begriff "Manngebirge").
Beispiel:
Ein Projekt dauert 1 Jahr und nun soll geplant werden, wann wieviele Arbeit anfällt.
Diese Zahlen sind normiert, so dass die Verteilung in % angegeben wird. Abhängig von der gesamtanzahl der voraussichtlichen Stunden werden diese dann über das Jahr entsprechend berechnet. (Dies nur zur info).
Die Aufgabe besteht nun darin, dass die Verteilung der Aufwände in etwa gleich bleibt, selsbt wenn sich die Projektzeit ändert. D.h. die Verteilung soll "gestreckt" oder "gestaucht" werden.
Am Ende soll (zumindest optisch) das "Gebirge" ähnlich aussehen wie zuvor.
Beispiel:
Statt ein Jahr soll ein ähnliches Projekt eben nur 9 Monate dauern. D.h. die prozentuale Verteilung muss gestaucht werden, also in jedem Monat fallen prozentual etwas mehr Stunden an.
So kann es sein, dass bei dieser Tätigkeit zu Beginn des Projektes recht viel Arbeit inverstiert werden muss, dann ist einige Zeit eher wenig (da auf anderes gewartet wird), aber am Ende nimmt der Aufwand wieder zu.
Dies soll sichtbar sein auch bei verkürzter Laufzeit.
Kann man das Problem soweit verstehen?
Ich habe eine iteration, aber diese stimmt nicht, da bei manchen Änderungen die Anzahl der Ergebnismonate nicht korrekt befüllt wird.
Hat jemand eine Idee?
Oder auch nur eine Anregung wie ich nach sowas suchen könnte.
Ich kann gerne auch mal eine Beispieldatei erstellen, damit man das problem erkennt.
Danke

16
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Ist doch ganz einfach
10.05.2016 07:44:05
lupo1
so wie Du es beschreibst - und so viel, wie Du dabei nicht spezifizierst - bedeutet das:
Vorher:
Datum Mannstunden
01.01. 50
02.01. 70
:
31.12. 10
Nachher:
Datum Mannstunden
01.01. 66
02.01. 93
:
30.09. 13
Du multiplizierst also alle Stunden mit 4/3 und hörst 1/4 vorher auf.

Denkfehler Gleichverteilung
10.05.2016 08:10:53
lupo1
Für meine Annahme gab es im wegfallenden letzten Quartal auch genau 1/4 der Arbeit des Projekts. Das ist aber ja nicht so.
Außerdem soll ja das Gebirge als ganzes um ein Viertel gestaucht werden, nicht die bisherigen Werte skaliert.
Das ist nicht so trivial ... ich versuche mal zu basteln.

Anzeige
Korrektur 1
10.05.2016 09:29:46
lupo1
richtig ist:
C2: =(E$2>=A2)*
(SUMME(BEREICH.VERSCHIEBEN(B$2;;;KÜRZEN(ZEILE(A1)*$F$2)))+
REST(ZEILE(A1)*$F$2;1)*INDEX(B:B;ZEILE(A1)*$F$2+2)-SUMME(C$1:C1))
[statt falsch
C2: =(E$2>=A2)*
(SUMME(BEREICH.VERSCHIEBEN(B$2;;;KÜRZEN(ZEILE(A1)*$F$2)))+
REST($F$2;1)*INDEX(B:B;ZEILE(A1)*$F$2+2)-SUMME(C$1:C1))
mit dem vergessenen ZEILE(A1)*]
bitte runterkopieren

Anzeige
AW: Korrektur 1
10.05.2016 15:35:14
raspi
Super, das sieht ja klasse aus.
Zumindest optisch sieht das genauso aus wie benötigt.
Das muss ich mir noch genauer analysieren und dann nach VBA transformieren.
Wenn ich deine Formel ansehe, muss ich feststellen, dass ich viele Funktionen in Excel weder kenne, noch sinnvoll anwenden kann :-( Danke für solche Hilfe.
Es sieht aber so aus, als hätte ich meine Iteration hierzu in VBA ähnlich aufgebaut, aber in die unterschiedlichen Fälle (mit dem Rest) noch nicht sauber verarbeitet.
Hast du eine mögliche VBA Lösung ebenfalls parat?

AW: Korrektur 1
10.05.2016 19:15:41
raspi
Nochmals vielen Dank für den prompten Vorschlag.
Allerdings gibt es noch 2 Fragestellungen, die hier noch nicht enthalten sind und die ich mir mit der Vorlage leider noch nicht beantworten kann.
- wie muss geändert werden, wenn die neue Zeitspanne länger ist, also gestreckt statt gestaucht werden soll ?
- und das größere Problem. Der Beginn des "kürzeren" Zeitraums liegt nicht zu Beginn, sondern irgendwo dazwischen. Also in deinem Beispiel soll der Zeitraum auf 5 Monahte gestaucht werden, aber ab April beginnen.
Ich denke, dass es dann mit einer Tabellen-Lösung, wie du sie hier toll erstellt hast, eng werden dürfte, und man doch auf Schleifen in VBA angewiesen ist.
Noch eine Idee dafür?
Vielen Dank

Anzeige
Deine Wünsche noch mal gelistet
11.05.2016 07:29:31
lupo1
1. Streckung
2. Stauchung zum Ende hin (ergibt ja auch mehr Praxis-Sinn, da oft Deadlines einzuhalten sind)
3. Erklärung der Formel
Nr. 3 ziehe ich mal vor:
=(E$2>=A2)
*(
SUMME(BEREICH.VERSCHIEBEN(B$2;;;KÜRZEN(ZEILE(A1)*$F$2)))+
REST(ZEILE(A1)*$F$2;1)*INDEX(B:B;ZEILE(A1)*$F$2+2)
-SUMME(C$1:C1)
)
(E$2>=A2) sorgt dafür, dass nach dem (stauchenden) eingestellten Datum auf jeden Fall nur 0 gerechnet wird
BEREICH.VERSCHIEBEN(B$2;;;KÜRZEN(ZEILE(A1)*$F$2)) spannt die Tage von Beginn her so weit auf, wie es der Stauchungsfaktor verlangt - und lässt "angebrochene Enden" noch liegen. Die Leistungen darin werden mit SUMME addiert.
+REST(ZEILE(A1)*$F$2;1)*INDEX(B:B;ZEILE(A1)*$F$2+2) packt dann die angebrochene Leistung multipliziert mit der Stauchung dazu
-SUMME(C$1:C1) macht es mir einfach: Ich ziehe die Summe alles vorherigen einfach ab und spare mir dafür die Behandlung angebrochener Anfänge. Persönlich hasse ich -SUMME(C$1:C1), weil man das eigentlich mit einer Hilfsspalte erledigt, damit Excel bei großen Volumina weniger rechnet. Aber ich habe hier mal die Augen zugemacht.

Anzeige
2. Stauchung zum Ende hin
11.05.2016 07:44:48
lupo1
Das ist einfach zu beantworten:
Vorgeschichte: Die Datümer stehen da - eigentlich eher zu verstehen - als lfd. Tage. Denn oft wird ja an WE und FT nicht gearbeitet.
Also kommst Du für Punkt 2. wie folgt zum Ziel:
a) Betrachtet wird nach wie vor das Kalenderjahr
b) Statt nun bis zum 30.9. fertig werden zu müssen, lautet die Aufgabe, erst am 1.4. beginnen zu können
c) Feinjustierung: Vor dem 1.4.16 liegen 91 Tage, nach dem 30.9.16 liegen 92. Daher musst Du nun einen Tag dazugeben: 1.10.2016
d) Das Ergebnis (gezeigt ab 1.1.16) verschiebst Du nun einfach um 91 Tage (auf den 1.4.16)
Also brauche ich nicht unnötig eine zweite Formel für die Zum-Ende-Hin-Stauchung.

Anzeige
2. Stauchung allgemein (nicht Ende/Anfang)
11.05.2016 07:59:23
lupo1
Allgemein stauchst Du somit so:
a) Du hast ungestaucht 366 Tage in 2016
b) Vom 15.3. bis 3.11.2016 sind 233 Tage Differenz (also 234 betroffene Tage).
c) Rechne nun 1.1.2016 + 233. Das ergibt 21.8.2016
d) Diese 21.8.2016 gibst Du als Enddatum ein.
e) Die resultierenden Zahlen shiftest Du (gedanklich) vom 1.1.2016 auf den 15.3.2016.
Ein bisschen wie mit dem Rechenschieber. Eine neue Formel braucht es dafür nicht.

1. Streckung
11.05.2016 08:21:20
lupo1
Die Streckung ergibt sich wie folgt:
a) Lasse Deine Datümer in A nur so weit laufen, wie die Ausgangsdaten bestehen. ENTF sie dahinter,
auch die dazughörigen Leistungen in B.
Beispiel: Lasse 9.1.2016 als letzten Tag stehen
c) Trage das gestreckte Enddatum (gelb) ein
Beispiel: 11.1. 2016
d) In C siehst Du den Fehler #BEZUG!
e) Entferne in C2 mit ENTF die Formel. Falls dahinter noch #BEZUG! bestehen bleibt, dann auch in C3 usw.
f) Kontrolliere immer G2 und H2 (Sum Wert und Sum Stauch). Sie müssen gleich sein.
Auch hier musste ich die Formel also nicht anpassen.

Anzeige
Erläuterung super, aber...
11.05.2016 22:02:53
raspi
Tja,
was soll ich sagen. Zuerst einmal Danke für bisher.
Ich lese deine Erläuterungen, verstehe sie im Wesentlichen (vom Ansatz her), strauchle aber beim Adaptieren auf mein konkretes Problem. Allein schon das Transformieren von Spalten- in Reihenanordnung bereitet mir Probleme, da ich die Syntax noch immer nicht komplett verstehe von diesen Funktionen. D.h. hier muss ich doch noch sehr viel lernen.
Und vor allem werde ich nicht darum herum kommen, dies als Schleifen in VBA zu schreiben, da die hier angefragte Stauchung nur ein Teil des Gesamtpaketes ist und vor allem für x "Manngebirge" durchzuführen ist, die auch veränderlicher Anzahl sind.
Von daher, werde ich
a) solche Funktionen verstehen lernen müssen
b) versuchen, das zu übersetzen
Aber falls es hier jemanden gibt, der die oben erwähnte Formel ebenso schnell in ein Script verwandeln kann, wäre dies super.

Anzeige
AW: 1. Streckung
14.05.2016 19:05:45
Michael
Hi zusammen,
ich schleiche schon ein paar Tage um den Thread herum, habe mir aber erst heute die Beispieldatei angesehen.
Es hat etwas gedauert, bis ich 1. Streckung begriffen habe, sie hat denn doch funktioniert, enthält aber zwei unschöne Sachen:
a) der Graph der Stauchung beginnt erst ab dem 2. Tag und
b) der Graph wird nur bis zum 9.1. angezeigt, da die weiteren Werte ja gelöscht wurden: d.h. man sieht nicht, wie es bis zum 11.1. weitergeht.
Bei a) bin ich mir nicht schlüssig, was mathematisch dahintersteckt und b) würde eine Änderung der Formel bedeuten: die Abfrage auf (E$2>=A3) ist dann so nicht einsetzbar.
Gerade beim vorhandenen Beispiel touchiert die Stauchung am 6.1. die x-Achse, was rechnerisch zwar stimmen mag, aber beide Graphen unterscheiden sich doch deutlich; eventuell ist das Ganze mit reinen Diagramm-Mitteln gar nicht machbar oder erfordert eine "andere" Interpolation.
Das grundlegende Problem ist, daß man jedes Polynom beliebig stauchen und strecken kann, aber die Daten liegen halt tageweise vor. Man bräuchte quasi eine zweite X-Achse für die korrekte Darstellung der Punkte "zwischen" den Tagen.
Geht das?
Schöne Grüße,
Michael

Anzeige
AW: 1. Streckung
15.05.2016 21:10:24
Michael
Hi,
es hat mir keine Ruhe gelassen; insbesondere wollte ich erst mal begreifen, wie man es evtl. angehen könnte:
Userbild
Der Code sieht dann überschaubar aus:
Option Explicit
Sub stauchen()
Dim aOrig As Variant, aWunsch As Variant, aRech#()
Dim iO&, iW&, iR&, i&, j&, p&
aOrig = Range("L5:L8")
aWunsch = Range("M5:M7")
iO = UBound(aOrig)
iW = UBound(aWunsch)
iR = iO * iW
ReDim aRech(1 To iR, 1 To 1)
p = 1
For i = 1 To iO
For j = 1 To iW
aRech(p, 1) = aOrig(i, 1) / iW
p = p + 1
Next
Next
Range("O5").Resize(iR) = aRech ' nur zum Testen
' Stop
p = 1: j = 0
For i = 1 To iR
aWunsch(p, 1) = aWunsch(p, 1) + aRech(i, 1)
j = j + 1
If j > iW Then p = p + 1: j = 0
Next
Range("M5").Resize(iW) = aWunsch
End Sub
Die Datei: https://www.herber.de/bbs/user/105578.xlsm
Falls die Idee prinzipiell so richtig ist, kann man sich dranmachen, es a) bedienbar zu machen für variable Bereiche bzw. Tage und sich b) überlegen, wie mit "0"en umzugehen ist.
Letzteres sollten ja sicher erhalten bleiben (2 Tage auf Kundenreaktion warten o.ä.), aber das ist etwas tricky.
Schöne Grüße,
Michael

Anzeige
AW: 1. Streckung
15.05.2016 21:47:45
raspi
Sehr interessant, dass dieses Problem hier noch jemanden anspricht.
Bin ich doch noch immer dran, das elegant in den Griff zu kriegen.
- Ich habe den Ansatz von Lupo1 nach etlichen Anläufen für mich umsetzen können, indem ich seine Formel nach VBA transferiert hatte. Allerdings habe ich den Ansatz noch nicht bis ins Detail verstanden (schäme mich) und musste daher teilweise auch auf Blattfunktionen zurückgreifen.
Zudem funktioniert das mit der Streckung ebenfalls noch nicht ohne weiteres.
Deinen Gedanken hatte ich so auch schon durchgespielt, war aber in VBA nicht so firm, als dass ich es hätte umsetzen können. Daher schon mal danke auch für deine Vorlage.
Allerdings konnte ich das mit der Streckung in deinem Beispiel auch noch nicht erfolgreicg nachvollziehen/umsetzen. Wie müßte man das anegehen in deiner Beispieldatei?
Und ja, es sollen natürlich 0-Werte enthalten sein können.
Ich lade hier mal meine Ausgangstabelle rein, um den Aufbau bei meinem Problem (so auch das transformieren von Spalten- auf Zeilenweise umzusetzen).
https://www.herber.de/bbs/user/105579.xlsx
Die Stauchung erfolgte hier nach dem Ansatz von Lupo1
Vielleicht fällt dir noch ein, wie man dein Beispiel vervollständigen kann

AW: 1. Streckung
19.05.2016 11:23:34
Michael
Hi raspi,
leider kann man die Frage nicht mehr im Forum bearbeiten.
Deshalb würde ich vorschlagen, daß Du die Frage erneut stellst, dann können wir da weiterdiskutieren; oder Du schickst mir ne mail an:
https://www.herber.de/cgi-bin/profile/call_profile.pl?user=1857094
So oder so interessiert mich die Problematik.
Schöne Grüße,
Michael

Formel zu hoch für mich
10.05.2016 22:23:02
raspi
Nochmals ich...
Deine Formel ist ja extrem trickreich und daher super kurz, nur....
Ich habe versucht, das Ganze zu verstehen und nachzuvollziehen, bin aber kläglich gescheitert.
Das beginnt schon damit, dass ich die einzelnen Funktionen in diesem Zusammenhang oft gar nicht kenne.
Und das zu adpatieren auch die og. Zusatzfragen, gelingt mir schon gar nicht.
Falls du also Erläuterungen zu deiner Formel oder gar equivalent in VBA hättest... wäre supertoll.

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige