DateDiff bestimmter Monat innerhalb eines Zeitraums

  • Erst mal Hallo zusammen! (Bin neu hier)

    Ich habe neuerdings Autoit für mich entdeckt und mir vorgenommen einige umfangreiche Excel-Berechnungsblätter in einem lauffähigen Programm abzubilden.

    In dem Berechnungsblättern geht es darum, finanzielle Leistungen nach etlichen Kriterien (Rechtsgrundlage (§), Dienstgrad, Anzahl von Angehörigen, ob diese unterhaltsberechtigt und/oder im gemeinsamen Haushalt leben, ob Entgeldersatzleistungen oder Gehälter - zzgl. eventueller Einkommen durch Teil,- Selbstständigkeiten bezogen werden etc.) berechnet.

    Alles in allem sehr komplex und das Wälzen von Gesetzestexten während der Erstellung hat die Sache nicht einfacher gemacht.
    Die Mühe hat sich jedoch gelohnt und die besagten Berechnungsblätter sind in der Excel-Variante fertiggestellt.

    Bis dato habe ich praktisch die gesamte GUI mit mehr oder weniger Fummelei und durch viel Lesen hinbekommen.
    Jetzt aber gehtes an's Eingemachte und schon stehe ich vor meinem ersten Problem. Stichwort: DateDiff

    Über eingefügte Datepicker wird ein Dienstleistungszeitraum festgelegt, z.B. Beginn der Dienstleistung: 04.03.2016 - Ende der Dienstleistung: 15.04.2015.
    Da die Berechnungen aber monatlich stattfinden, währen das für besagten Dienstleistungszeitraum 2 Teilzeiträume.
    Daher 06.03.2015 - 28.03.2016 = 25 Tage und 01.04.2016 - 15.04.2016 = 15 Tage. Einzeln für sich genommen bin ich bereits erfolgreich geworden, daher wenn ich die Zeiträume einzeln so eingebe, werden diese auch korrekt berechnet. Die Anzeige des gesamten Dienstleistungszeitraumes ist leider unumgänglich.
    Nun ist es aber so, dass ich anhand des gesamten Dienstleistungszeitraums errechnen muss, um wie viele Monatsberechnungen es sich handelt. Hier wäre das Ergebnis wie schon erwähnt "2". In Excel wird mir dies durch ein Auswahlfeld X von 2 angezeigt, wobei ich durch die Auswahl des hier als "X" dargestellten Auswahlmenüs die "1" für den ersten Berechnungsmonat März 2016 und die "2" für den zweiten Berechnungsmonat April 2016 auswählen kann und mir die auf diesen Monat anfallenden Tagein einer weiteren Zelle angezeigt werden.

    Daher 04.03.2016 - 15.04.2016 | 1 von 2 | März 2016 | 25 Tage
    04.03.2016 - 15.04.2016 | 2 von 2 | April 2016 | 15 Tage

    Sowohl die Tage als auch die Angabe von Monat & Jahr in eigenen Feldern sind im Laufe der weiteren Berechnungen enorm wichtig.
    Schon in Excel war für die Berechnung der auf den Monat anfallenden Tage eine recht aufwendige Formel, die sich über 5 Zeilen erstreckte notwendig.
    Bei Autoit stehe ich gerade leider völlig ratlos dar, wie ich das umsetzen soll. Dass ich ein blutiger Autoit-Anfänger bin, macht die Sache nicht leichter, aber es wäre enorm schade wenn ich an dieser Stelle scheitere, wenn doch das gesamte Programm zumindest rein optisch schon steht.

    Für hilfreiche Ratschläge, Kniffe u.Ä. wäre ich sehr dankbar!

  • Hi,

    aus welchem Grund hast du, wenn du dich schon so viel mit Excel beschäftigst, das Ganze nicht per VBA gelöst?

    Schon in Excel war für die Berechnung der auf den Monat anfallenden Tage eine recht aufwendige Formel, die sich über 5 Zeilen erstreckte notwendig.

    Gerade Excel bietet so gut wie unendlich viele Funktionen gerade bei der Datumsberechnung und Auswertung. Viele Formeln, die man sich mit AutoIt mühsam selbst zusammenbasteln muss, sind bereits in Excel integriert oder in einem der vielen Foren verfügbar.


    Nun ist es aber so, dass ich anhand des gesamten Dienstleistungszeitraums errechnen muss, um wie viele Monatsberechnungen es sich handelt. Hier wäre das Ergebnis wie schon erwähnt "2". In Excel wird mir dies durch ein Auswahlfeld X von 2 angezeigt, wobei ich durch die Auswahl des hier als "X" dargestellten Auswahlmenüs die "1" für den ersten Berechnungsmonat März 2016 und die "2" für den zweiten Berechnungsmonat April 2016 auswählen kann und mir die auf diesen Monat anfallenden Tagein einer weiteren Zelle angezeigt werden.

    Wenn ich das richtig verstanden habe, dann ist das nichts weiter als eine Schleife vom Starttag zum Endtag der Dienstleistung.

    Du musst lediglich für jeden Tag die Summe aus Tagen, Monaten, Jahren festlegen.
    Wenn neuer Tag, Tagberechnung = Tagberechnung +1
    Wenn neuer Monat, Monatsberechnung=Monatsberechnung+1 : Tagberechnung merken : Tagberechnung=1
    Wenn neues Jahr, Jahrberechnung=Jahrberechnung+1 : Monat merken : Monatsberechnung=1 :Tagberechnung merken : Tagberechnung = 1

    Du kannst das auch direkt über einen Kalender auf einem extra Blatt laufen lassen. Dort erstellst du den Kalender im beliebigen Zeitraum, trägst in die Start- und Enddaten jeweils ein Flag ein und lässt dir über eine Excel-Formel, die in jede Zelle kopiert wird, die Anzahl Jahre, Monate und Tage berechnen.

    Jedenfalls ist das imho in Excel direkt wesentlich einfacher zu lösen als in AutoIt!

  • Schau Dir das mal in der Hilfe Date user defined functions Reference an. Bei Datumrechnungen hilft oftmals day of the year ->also tag des Jahres. dieser läßt sich über die (differenz zum 1.1.xyz jahr ) +1 errechnen. _date days in month die tage in den monaten - und schon hat man alle Basisdaten um Dein Problem zu lösen

    Gruß

    Peter

    Hinweise auf Suchmaschinen finde ich überflüssig - wer fragt hat es nicht gefunden oder nicht verstanden. Die Antwort gibt sich oftmals schneller als der Hinweis auf Dr. Goggle & Co.

    Ab 19-10-22 ergänzt um:

    Die Welt wird nicht bedroht von den Menschen, die böse sind, sondern von denen, die das Böse zulassen. (Albert Einstein)

  • Erst einmal vielen Dank für deine schnelle Antwort.

    Zitat von Andy

    Du musst lediglich für jeden Tag die Summe aus Tagen, Monaten, Jahren festlegen.
    Wenn neuer Tag, Tagberechnung = Tagberechnung +1
    Wenn neuer Monat, Monatsberechnung=Monatsberechnung+1 : Tagberechnung merken : Tagberechnung=1
    Wenn neues Jahr, Jahrberechnung=Jahrberechnung+1 : Monat merken : Monatsberechnung=1 :Tagberechnung merken : Tagberechnung = 1


    Ich bin mir nicht sicher, ob das mit der Tageberechnung nach Auswahl "X"-Nummer richtig rüber gekommen ist.
    Erst mal versuche ich durch das was du geschrieben hast durchzusteigen, um zu erkennen, ob es das ist was ich meinte (Autoit-Newby) :D

    Ich würde dir ja gerne die Excel-Formel oder ein Arbeitsblatt zur Verfügung stellen, damit du dir ein Bild davon machen kannst, was ich meine. Leider jedoch kann mein uraltes Excel 2003 diese Formeln auf Grund der hochgradigen Verschachtelung nicht anzeigen, im Gegensatz zu der aktuellen Office-Version bei mir im Büro.
    Nach Pfingsten schicke ich es mir zu und wenn du magst, dann kannst du ja mal einen Blick darauf werfen.

    Was die Lösung in VBA angeht, so muss ich gestehen, dass mir das Scripten in Autoit irgendwie eingängiger ist.
    Ich hab VBA in den Berechnungsblättern lediglich genutzt, um bestimmte Werte abzufragen, zu vergleichen und entsprechend Zeilen auszublenden oder Zellen zu befüllen. Das Ausblenden bestimmter Bereiche in der Excel-Version ist deshalb nötig, da am Ende automatisch ein vollständiger Bescheid erstellt wird, der in ausgedruckter Form nie größer als 5 Seiten sein darf, wegen der Kapazitäten unserer vollautomatischen Druckstraße 600 km entfernt.

  • Auch dir vielen Dank, für die prompte Antwort.
    Das klingt ganz nach dem, was ich gesucht habe. Danke für den Tipp!

    Schau Dir das mal in der Hilfe Date user defined functions Reference an. Bei Datumrechnungen hilft oftmals day of the year ->also tag des Jahres. dieser läßt sich über die (differenz zum 1.1.xyz jahr ) +1 errechnen. _date days in month die tage in den monaten - und schon hat man alle Basisdaten um Dein Problem zu lösen

    Gruß

    Peter

    • Offizieller Beitrag

    Hallo,

    Über eingefügte Datepicker wird ein Dienstleistungszeitraum festgelegt, z.B. Beginn der Dienstleistung: 04.03.2016 - Ende der Dienstleistung: 15.04.2015.
    Da die Berechnungen aber monatlich stattfinden, währen das für besagten Dienstleistungszeitraum 2 Teilzeiträume.
    Daher 06.03.2015 - 28.03.2016 = 25 Tage und 01.04.2016 - 15.04.2016 = 15 Tage.

    Wenn der Dienstleistungszeitraum vom 04.03.2016 - 15.04.2016 geht, warum wird dann im März vom 06.03.2016 - 28.03.2016 gerechnet und nicht von 04.03.2016 - 31.03.2016?

  • Nach Pfingsten schicke ich es mir zu und wenn du magst, dann kannst du ja mal einen Blick darauf werfen.

    Ja, das wird das Beste sein.
    Wenn du einige einfache Button bzw. eine GUI in Excel hast, dann brauchst du ggf. auch kein AutoIt.

    Ich nutze AutoIt in Verbindung mit Excel nur noch sehr selten, alleine schon aus Gründen der Wartbarkeit. Was nützt es einem Kollegen, der noch nie mit AutoIt gearbeitet hat, aber dafür fit in VBA ist, wenn er sich im Notfall mit "Fremdprogrammen" auseinandersetzen muss...

  • Hallo,

    Wenn der Dienstleistungszeitraum vom 04.03.2016 - 15.04.2016 geht, warum wird dann im März vom 06.03.2016 - 28.03.2016 gerechnet und nicht von 04.03.2016 - 31.03.2016?

    Entschuldige, du hast völlig recht. Tatsächlich waren natürlich die Zeiträume 06.03.2016 - 31.03.2016 = 26 Tage und 01.04.2016 - 15.04.2016 = 15 Tage als Beispiele angedacht gewesen. Kleiner Vertipper :whistling:

    Zwischenzeitlich hat sich ein neues Problem aufgetan, nach dem ich das Erste vorerst zurückgestellt habe, um wenigstens die GUI fertigzustellen und mich dabei ein wenig mehr mit dieser für mich neuen Script-Sprache beschäftigen.
    Eigentlich wollte ich nur ganz nebenbei zwei Summen, welche in GUICtrlCreateInput()-Feldern händisch eingetragen werden sollen, miteinander zu addieren. Leider geschieht das nur mit Summen die ich direkt im Script hinterlege, als Ausgangswert für meine Beispielfälle. Trage ich aber neue Summen in die Felder, so findet keine erneute Berechnung statt.

    Spoiler anzeigen

    Die hier vorgegebenen Summen werden bei Programmstart wie gesagt brav summiert, spätere Änderungen bleiben jedoch bei erneutem Aufruf der Funktion unberücksichtigt.

    Hach, Excel ist so schön einfach... :whistling:

    • Offizieller Beitrag

    Hallo,

    Entschuldige, du hast völlig recht. Tatsächlich waren natürlich die Zeiträume 06.03.2016 - 31.03.2016 = 26 Tage und 01.04.2016 - 15.04.2016 = 15 Tage als Beispiele angedacht gewesen. Kleiner Vertipper

    Falls das jetzt wieder ein Vertipper war, bei mir wäre es 04.03.2016 - 31.03.2016 = 28 Tage, kannst du vielleicht diesen Code für dich anpassen.

    Bei dem anderen Problem versuch mal

    [autoit]

    GUICtrlRead($Summe6, _GUICtrlEdit_SetText($LeistungNach6, $Summe6))

    [/autoit]

    durch

    [autoit]

    GUICtrlSetData($LeistungNach6, $Summe6)

    [/autoit]

    zu ersetzen. Ansonsten bitte ein lauffähiges Beispiel-Programm posten das den Fehler erzeugt!

  • Erst mal sry, dass ich so spät antworte. Kam die Tage leider nicht dazu.

    Vergiss mal den 04.03.2016, es sollte von Anfang an der 06.03.2016 sein. Ist aber auch nicht wichtig ^^

    Vielen Dank für den Code übrigens, auch wenn er nicht ganz das zu sein scheint, was ich gesucht habe.
    Ich hab es vorerst wie folgt gelöst:


    Ich bin zwar dadurch gezwungen, das Enddatum auf das Monatsende zu setzen, wenn dieses über den betreffenden Monat hinaus geht, aber die Berechnung der Tage funktioniert tadellos.


    Edit:
    Was das allgemeine Rechenproblem anbelangt habe ich es vorerst so gelöst:

    Teile die sich explizit auf das Gesetz beziehen musste ich vorerst durch "#" ersetzen, da dieses noch nicht vollends verabschiedet ist.

    Auch hier funktioniert so weit alles, bis auf die Abfrage in Zeile 20 bzw. 36 :(
    Hier soll verglichen werden, ob das Ergebnis $summe6 größer ist als das Ergebnis des erfolgreich errechneten $hoechstsatzinput.
    Leider wird diese Abfrage scheinbar einfach ignoriert und stattdessen immer das Ergebnis $summe6 in die Inputbox "$LeistungNach6" eingetragen.

    Selbst die vorherige Konvertierung von Kommabeträgen funktioniert nach einigen Anlaufschwierigkeiten problemlos, aber der Vergleich will mir einfach nicht gelingen -.-

    Edit bernd670: Bitte nicht komplette Beiträge zitieren!

    • Offizieller Beitrag

    GUICtrlRead gibt einen String zurück, wenn man Strings vergleicht ist "30" größer als "200". Der Grund ist das Strings zeichenweise verglichen werden und die 3 ja größer ist als die 2. Um die Werte korrekt zu vergleichen musst du sie in eine Zahl umwandeln also einfach Int(GUICtrlRead(...)) benutzen dann sollte es gehen.


    Sollte das nicht die Lösung sein dann bitte einen lauffähigen BeispielCode posten damit man es auch nachvollziehen kann.

    PS: Bitte Doppelposts vermeiden. Einfach den letzten Beitrag editieren, wenn es noch keinen neuen gibt.

  • Funktioniert leider nicht.

    Hier das Ganze mal in einer abgespeckten Version:

    • Offizieller Beitrag

    Bitte nicht immer den kompletten vorherigen Beitrag zitieren, wir wissen auch so um was es geht. Zitiern ist nur für einzelne Textpassagen gedacht!

    So sollte es gehen:

    • Offizieller Beitrag

    Einer InputBox das kaufmännische Euro-Format vorgeben kann man aber nicht, oder?

    Doch das geht, GuiRegisterMsg verwenden mit WM_COMMAND und $EN_CHANGE auswerten - den Inhalt lesen und sofort im erforderlichen Format zurückschreiben.

    • Offizieller Beitrag

    Ich habe mal dein Code etwas bereinigt!

    Die Funktion FormatEuro schreibt die Zahl Formatiert in die Controls.

  • Gibt es eigentlich eine Möglichkeit die Maximalanzahl an Tagen eines Monats aus einem Datepicker auszulesen?

    Das hier war einer meiner Versuche, leider nicht von Erfolg gekrönt
    Funktioniert nur mit dem aktuellen Systemdatum.

    • Offizieller Beitrag

    Du musst das Datum erstmal aus dem Datepicker auslesen und den String entsprechend zerlegen.

    AutoIt
    Func _Datefunc2()
    	$szdate = GUICtrlRead($startdate)
    	$MaxTageMonat = _DateDaysInMonth(StringRight($szdate,4), StringMid($szdate,4,2))
    
    
    	$days82 = 	$diffausgabe
    	GUICtrlSetData($Ergebnis, $days82 & "/" & String($MaxTageMonat))
    EndFunc