Betrag gestaffelt nach Jahren genau aufteilen
#31
Lieber Bosco,

diese Funktioniert.
Ich konnte keinen Fehler errkennen.
Code:
=WENNFEHLER((DATEDIF(MAX($A14;(MONATSENDE(D$1;-12)+1));MIN(D$1;$B14);"YM")+1)*$C14/(DATEDIF($A14;$B14;"M")+1);0)

Gerne könnte noch jemand das prüfen. 19
Antworten Top
#32
Hallo Liesl,

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.

Aber auch Sigi.21's und meine Lösung lassen sich noch verbessern, siehe http://www.bplumhoff.de/roundtosum_de/

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.

Viele Grüße,
Bernd


Angehängte Dateien
.xlsm   CEF_Betrag gestaffelt nach Jahren genau aufteilen.xlsm (Größe: 77,1 KB / Downloads: 6)
Antworten Top
#33
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.
Zum übersetzen von Excel Formeln:

http://dolf.trieschnigg.nl/excel/index.p...gids=en+de
Antworten Top
#34
(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.
Antworten Top
#35
Du hast offensichtlicht den letzte Code nicht getestet.
Zum übersetzen von Excel Formeln:

http://dolf.trieschnigg.nl/excel/index.p...gids=en+de
Antworten Top
#36
In Excel Formel:

PHP-Code:
=IF(OR(YEAR(D$1)<YEAR($A2);YEAR(D$1)>YEAR($B2));"";IF(YEAR($A2)=YEAR(D$1);D$1-$A2;IF(YEAR($B2)=YEAR(D$1);$B2-DATE(YEAR($B2);1;0);D$1-DATE(YEAR(D$1);1;0)))*$C2/($B2-$A2)) 
Zum übersetzen von Excel Formeln:

http://dolf.trieschnigg.nl/excel/index.p...gids=en+de
Antworten Top
#37
Alternative Schreibweise, ohne nested IF's

PHP-Code:
=CHOOSE(1+(YEAR(D$1)<YEAR($A2))+(YEAR(D$1)>YEAR($B2))+2*(YEAR($A2)=YEAR(D$1))+3*(YEAR($B2)=YEAR(D$1));D$1-DATE(YEAR(D$1);1;0);0;D$1-$A2;$B2-DATE(YEAR($B2);1;0))*$C2/($B2-$A2
Weil die Formel Tagesgenau berechnet werden Schaltjahre auch miteinbezogen.

z.B 30-04-2003 bis 01-05-2005
Zum übersetzen von Excel Formeln:

http://dolf.trieschnigg.nl/excel/index.p...gids=en+de
Antworten Top
#38
(29.06.2022, 10:20)snb schrieb: Alternative Schreibweise, ohne nested IF's

PHP-Code:
=CHOOSE(1+(YEAR(D$1)<YEAR($A2))+(YEAR(D$1)>YEAR($B2))+2*(YEAR($A2)=YEAR(D$1))+3*(YEAR($B2)=YEAR(D$1));D$1-DATE(YEAR(D$1);1;0);0;D$1-$A2;$B2-DATE(YEAR($B2);1;0))*$C2/($B2-$A2
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.
Antworten Top


Gehe zu:


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