Reisebüro – Saisondaten splitten
In einem Forum wurde um einen Lösungsansatz nachgefragt, wie aus einer gegebenen Reisezeit die Tage der Vor- und der Hauptsaison berechnet werden könnten. Da ähnliche kalendarische Zuordnungen öfter einmal gefragt sind, habe ich dieses konkrete Beispiel verwendet und eine Muster-Datei erstellt.
Zugegeben, das Ganze lässt sich auch ohne VBA lösen. Die Formel dazu ist schön lang und nicht wirklich transparent, wenn Sie nicht tief in der Excel- und Formelmaterie drin stecken. Das gilt zwar auch, wenn Sie noch nie im Leben eine Zeile einer beliebigen Programmiersprache geschrieben haben, aber oft findet sich jemand, der kleine Änderungen am Code vornehmen kann. Denn wir programmieren bewusst so, dass ein hohes Maß an Übersichtlichkeit gegeben ist. Selbst dann, wenn der Code dadurch länger wird und vielleicht einige hundertstel Sekunden länger braucht.
Nachtrag aus dem Spätsommer 2021: Eine gute Möglichkeit ist auch der Einsatz von Power Query (sofern möglich). Dabei kann auf VBA verichtet werden.
Die Aufgabe
Es soll eine Tabelle erstellt werden, wo für einen einzutragenden Zeitbereich und einer Region berechnet wird, wie viele Tage der Reisezeit in die Neben- und/oder die Hauptsaison fallen. Es ist durchaus denkbar, dass die Anreise in die eine und die Abreise in die andere Saison fällt. Gezählt werden immer die Übernachtungen, was prinzipiell immer ein Tag weniger ist als die gesamte Reisezeit. Die Uhrzeit der Ankunft ist nicht relevant, es gilt immer der Tag, welcher als Anreise gebucht wurde.
Die Realisierung
Grundsätzlich muss erst einmal eine Datenbasis geschaffen werden, wo für die verschiedenen Regionen die Zeiten der Vor- und der Hauptsaison erfasst sind. Die Anzahl der Wechsel ist beliebig und wird durch das Programm selbst erfasst. Es ist aber darauf zu achten, dass jeder denkbare Zeitraum einer Reise in dem entsprechenden Tabellenbereich erfasst wird. In der Muster-Datei sieht das so aus:
Sie erkennen, dass für jede Region vier Intervalle erfasst sind, zeilenweise jeweils Beginn und Ende der Neben- und Hauptsaison. Die kalendarischen Daten müssen natürlich ohne Lücken vorliegen. Der Einfachheit halber sind hier Kurzzeiträume für beispielsweise Feiertage nicht extra aufgeführt, könnten aber problemlos im zeitlich passenden Rahmen eingefügt werden. Jede Region kann auch unterschiedlich viele Zeilen aufweisen, das wird seitens des Makros alleine erkannt. Es ist möglich, auch beispielsweise eine Nachsaison zu integrieren, dazu muss aber der Code angepasst werden. Die Regionen können Sie benennen, wie Sie möchten. Bei der Berechnung muss dann nur der entsprechende Name verwendet werden.
Zur Berechnung gibt es einen gesonderten Eingabebereich und eine Schaltfläche. Im Muster sieht das so aus:
Der User trägt Start, Ende und die Region ein und klickt dann auf die Schaltfläche Berechnen. Umgehend wird durch das Makro in J2:K2 das Ergebnis für die Tage der Neben- und der Hauptsaison eingetragen. Das war’s dann auch schon.
Die Muster-Tabelle
Damit Sie auch etwas experimentieren und das Ganze nachvollziehen können, laden Sie sich hier die Mustertabelle herunter. Dort ist auch der VBA-Code integriert. Denken Sie bitte daran, dass Sie in Excel-Versionen normalerweise die Makros extra „erlauben” müssen, Hinweise dazu finden Sie hier im Blog. Ansehen und ändern können Sie sich die Programmzeilen des in dieser Mappe verwendeten Codes über AltF11.
Damit nicht versehentliche Änderungen vorgenommen werden können, die dann zum Verlust der Funktionalität führen, sollten Sie alle Zellen, die eine Formel enthalten, gegen Eingaben und Veränderungen sperren. Welche Zellen das sind, können Sie recht einfach feststellen: F5 und es erscheint dieses Fenster:
Jetzt auf Inhalte… Klicken und Sie sehen das:
Wählen Sie hier die Formeln (bereits geschehen) und dann OK. Sofort werden alle Zellen, welche eine Formel enthalten, markiert:
Dass J2:K2 nicht markiert sind ist korrekt, denn dort steht ja keine Formel drin sondern der berechnete Wert wird durch das Makro eingetragen. Sie sollten erkennen, was die Formeln bewirken und warum beispielsweise in Spalte A nicht jede Zelle eine Formel enthält.
Der VBA-Code
Der hier vorliegende Code ist nur die Basis dessen, was unbedingt erforderlich ist. Für eine sinnvolle und auch dauerhafte Stabilität sollten unbedingt noch Routinen eingebaut werden, die Fehleingaben durch die Benutzer abfangen. So könnte ein User statt eines (gültigen) Datums in G2 oder H2 irgend etwas anderes eintragen, Beginn und Ende der Reise vertauschen oder eine Region, die gar nicht in der Tabelle existiert hinein schreiben. Das wird auch für Gelegenheits-VBA-Programmierer möglich sein. In dieser (kostenlosen) Version ist das nicht enthalten, kann aber gerne durch unseren Sponsor GMG erstellt werden. Weitere Anpassungen zur Erhöhung des Komforts wie beispielsweise automatische Erfassung und Auswahl der Region in einem Kombinationsfeld (DropDown) oder andere Erweiterungen sind möglich.
Hinweis: Es ist nicht erwünscht (erlaubt), dass derartige Erweiterungen des hier verwendeten Codes öffentlich in Foren verbreitet werden. Das würde ein Verstoß gegen das Urheberrecht bedeuten. Beachten Sie hier die Kommentar-Hinweise im Kopf des Codes. Gegen Forenhilfe auf privater Basis ist nichts einzuwenden.
Der Programm-Code ist bewusst nur knapp kommentiert. Ein mit VBA erfahrener User wird den Ablauf verstehen, denn es wurde auch auf kryptische Elemente verzichtet, die vielleicht einige hundertstel Sekunden an Zeitgewinn bringen würden aber dafür die Transparenz enorm beeinträchtigten. Weitere Erklärungen des Codes sind Schulungen und Seminaren vorbehalten, wo dieses Beispiel Verwendung finden wird. Selbstredend können Sie auch eine telefonische oder schriftliche Beratung zu diesem oder einem erweiterten Programmcode erhalten.
Sollte das Programm wider Erwarten in einer älteren Excel-Version nicht laufen, dann bitten wir um Nachricht. Es ist so gut wie ausgeschlossen, dass dieses Programm ohne Anpassungen in Tabellenkalkulationsprogrammen anderer Hersteller läuft.
Hat Ihnen der Beitrag gefallen?
Erleichtert dieser Beitrag Ihre Arbeit?
Dann würde ich mich über einen Beitrag Ihrerseits z.B. 2,00 € freuen … (← Klick mich!)