hm, naja,
03.01.2016 16:44:22
Michael
Hallo Klaus,
1. danke für die Info. Ich arbeite derzeit nicht als Verwalter, aber ich behalt's mal im Hinterkopf.
2. das Summenprodukt ist ja schön, hat aber gewisse Nachteile: sobald neue Werte (höher als 1.1.16) hinzukommn, mußt Du die Formel ändern (je Wert dann von A51 auf A52 usw.)(oder erweitern, mit ANZAHL oder so); außerdem bekommst Du so eben keine Teil-Monate unter.
3. auf die Spalte E zu verzichten, verkompliziert die Berechnungen, d.h. wenn Du die Anzahl der Tage pro Monat nicht in der Spalte hast, mußt Du sie bei Teilmonaten immer selbst errechnen.
Darin sehe ich nur unnötigen Denk- bzw. Formelaufwand.
Wenn derartige Informationen (oder "meine" Hilfsspalten) die Optik stören, kann man sie ja "rechts außen" oder auf einem versteckten Tabellenblatt unterbringen.
4. Die Makrolösung hat den Vorteil, daß sie völlig variabel auf die Position des untersten Werts in A reagiert- Du kannst beliebig Werte hinzufügen.
Mir fällt gerade so ein, daß das Makro nicht sauber arbeitet, wenn nicht pro Monat zumindest *ein* Wert vorhanden ist, das wäre zu ändern, wenn Du denn diesen Weg weiterverfolgen möchtest.
Ansonsten war noch ein Fehler beim ersten Monat drin. Im Beispiel war ja der 31.8. vorhanden, deshalb isses nicht aufgefallen.
Nachfolgend der geänderte Code (insbesondere nach dem ersten "Else") mit dateserial, der dafür sorgt, daß der Monatsletzte verrechnet wird.
Option Explicit
Sub gtz_rechnen()
Dim von&, bis&, bisM&, i&, m&, anfang&, ende&, tage&, letzter&
Dim erster_Monat&, letzter_Monat&
Dim gtz_m As Double
Dim gtz As Variant
Dim datum As Date
'Debug.Print Range("c15").Formula
von = 25
bis = Range("A" & Rows.Count).End(xlUp).Row
gtz = Range("F44:H55")
i = von
erster_Monat = Range("c" & von).Value
letzter_Monat = Range("c" & bis).Value
If erster_Monat = letzter_Monat Then 'nur ein Monat vorhanden
bisM = bis
tage = Range("a" & bisM).Value - Range("a" & von).Value + 1
Else
While Range("C" & i) = erster_Monat
i = i + 1
Wend
bisM = i - 1
datum = Range("a" & bisM).Value
datum = DateSerial(Year(datum), Month(datum) + 1, 1) - 1
tage = datum - Range("a" & von).Value + 1
End If
' Erster Monat:
gtz_m = tage * gtz(erster_Monat, 3)
Range("D" & bisM).Value = gtz_m
If erster_Monat = letzter_Monat Then Exit Sub
' Monate zwischendrin:
erster_Monat = Range("c" & i).Value
If erster_Monat
Deine Datei mit einer reinen Formellösung mag ich nicht weiterverfolgen; es scheint mir zu kompliziert zu sein, Teilmonate "automatisch" zu erkennen - wenn Du willst, kannst Du den Thread ja nochmal auf offen stellen für die Formelprofis.
Ansonsten kann ich Dir anbieten, das Makro etwas zu "elegantisieren", um evtl. Hilfsspalten einzusparen.
Schöne Grüße,
Michael
P.S.: Du wolltest die Monatskürzel anstelle des Datums angezeigt haben; in Deiner "ersten" Tabelle hast Du "oben" die Kürzel händisch als Text eingetragen, damit rechnet es sich schlecht.
Excel macht -gerade beim Datum- einen deutlichen Unterschied zwischen dem intern gespeicherten Wert (40000nochwas) und dem angezeigten. Du kannst jederzeit ein Datum eingeben á la 1.8.15, dann wird "automatisch" auf 01.08.2015 "hochformatiert", das kannst Du aber mit "benutzerdefinierter" (Datums-)Formatierung auf das Monatskürzel umstellen.
Deshalb doch nochmal die Datei anbei, mit entsprechender Formatierung (der Datumsangaben zum jeweils Monatsersten) in türkis: https://www.herber.de/bbs/user/102565.xls