Dann schau' Dir bitte die anliegende Datei genauer an (Bereitstellung ohne jede Gewährleistung, aber ich verwende einen aktuellen Virenscanner).
Alle bisher vorgeschlagenen Formellösungen sind m. E. fehlerhaft, d. h. nicht gut (genug) programmiert und nicht gut (genug) getestet.
Sigi.21's VBA Lösung und meine Formellösung sind meines Erachtens korrekt, aber prüfe es bitte selbst.
Der bereitgestellte Test checkt lediglich, ob Sigi.21's und meine Berechnungen für alle Kombinationen zwischen 31.12.2003 und 1.1.2006 nahezu identisch sind.
Allgemein lautet meine Empfehlung für Geldbetragsverteilungen: defensiv prgrammieren! Eine Gewichtsfunktion kann zunächst die gewünschte Verteilung bestimmen. Anschließend sollte die Betragsverteilung mithilfe der Gewichtssumme erfolgen, um sicherzustellen, dass genau der vorhandene Betrag und keine andere (fehlerhafte!) Summe verteilt wird.
Man muss entscheiden ob Monatsgenau oder Tagsgenau gearbeitet werden muss. Für eine Tagsgenaue Berechnung:
Code:
Sub M_snb() sn = Tabelle8.Cells(1).CurrentRegion y = sn(2, 3) / (sn(2, 2) - sn(2, 1))
For jj = 4 To 12 If Year(sn(1, jj)) >= Year(sn(2, 1)) And Year(sn(1, jj)) <= Year(sn(2, 2)) Then Select Case Year(sn(1, jj)) Case Year(sn(2, 1)) sn(3, jj) = (DatePart("y", sn(1, jj)) - DatePart("y", sn(2, 1))) * y Case Year(sn(2, 2)) sn(3, jj) = DatePart("y", sn(2, 2)) * y Case Else sn(3, jj) = DatePart("y", sn(1, jj)) * y End Select End If Next End Sub
Mein Excelformel war Monatsgeanu bestimmt.
Wenn Monatgenau gearbeitet werden muss sollen die Tage immer identische Monatstage sein: Dann ist 30-04-2001 bis 30-04-2006 richtig und ist 30-04-2002 bis 01-05-2006 falsch. Die Genauigkeit bestimmt also die Eintragswerten.
(28.06.2022, 15:50)snb schrieb: Man muss entscheiden ob Monatsgenau oder Tagsgenau gearbeitet werden muss. Für eine Tagsgenaue Berechnung:
Code:
Sub M_snb() sn = Tabelle8.Cells(1).CurrentRegion y = sn(2, 3) / (sn(2, 2) - sn(2, 1))
For jj = 4 To 12 If Year(sn(1, jj)) >= Year(sn(2, 1)) And Year(sn(1, jj)) <= Year(sn(2, 2)) Then Select Case Year(sn(1, jj)) Case Year(sn(2, 1)) sn(3, jj) = (DatePart("y", sn(1, jj)) - DatePart("y", sn(2, 1))) * y Case Year(sn(2, 2)) sn(3, jj) = DatePart("y", sn(2, 2)) * y Case Else sn(3, jj) = DatePart("y", sn(1, jj)) * y End Select End If Next End Sub
Mein Excelformel war Monatsgeanu bestimmt.
Wenn Monatgenau gearbeitet werden muss sollen die Tage immer identische Monatstage sein: Dann ist 30-04-2001 bis 30-04-2006 richtig und ist 30-04-2002 bis 01-05-2006 falsch. Die Genauigkeit bestimmt also die Eintragswerten.
Nein. Egal, ob man nach Monaten oder Tagen abrechnet, sollten für legale Eingabewerte auch ordentliche Resultate ausgegeben werden. Wenn Deine Formel für nicht-vorgesehene Eingaben murkst, dann limitiere die möglichen Eingaben. Sonst bleibt es Murks.
Weil die Formel Tagesgenau berechnet werden Schaltjahre auch miteinbezogen.
z.B 30-04-2003 bis 01-05-2005
Deine Formel ist Murks. 1. Liesl fragte nach einer Formellösung für eine Abrechnung nach Monaten, nicht nach Tagen. 2. Für die Periode 28.2.2004 - 29.2.2004 gibt Deine o. g. Formel einen Fehler aus.
Falls Du weitere Hilfe für Deine fehlerhaften Formeln benötigst, mach' bitte einen eigenen Thread auf. Hier bist Du off-topic.