Basti Kalender – Der Ersatz für den Microsoft Date and Time Picker

Warum ein eigener Kalender

Ich musste beim Erstellen vieler meiner VBA* Anwendungen dem Nutzer die Möglichkeit geben das aktuelle Datum oder auch ein bestimmtes Bearbeitungs- oder Zieldatum eingeben zu können. Um die Eingabe etwas komfortabler zu gestallten, nutzte ich dafür bis 2018 in allen Formularen den „Microsoft Date and Timer Picker“, welchen man durch die Auswahl von „Extras“ –> „Zusätzliche Steuerelemente“ den Steuerelementen der VBA* Toolbox hinzufügen konnte. Diese tolle Erweiterung öffnet beim Klicken auf die Dropdown Box einen „Mini Kalender“, mit welchem man durch Monate und Jahre navigieren kann. Beim Klicken auf einen bestimmten Tag wird dann das ausgewählte Datum in die Dropdown Box übernommen, wo es vom VBA*-Code ausgewertet werden kann.

 

Screenshot des Microsoft Date and Time Pickers

 

Leider machte dieses nützliche Tool nach der Umstellung auf Windows10 und Office 2016 (jeweils 64-bit) Probleme. Beim Öffnen der mit dem „Microsoft Date and Timer Picker“ ausgestatteten Dokumente kam es zu einer Fehlermeldung. Excel meldete, dass die Datei „MSCOMCT2.OCX“ nicht gefunden werden konnte und der „Microsoft Date and Timer Picker“ konnte nicht mehr genutzt werden. Die Datei sollte laut Pfadangabe eigentlich im Office Installationsverzeichnis, oder unter „C:\Windows\SysWOW64“ zu finden sein, was aber nicht der Fall war. Ich schrieb mittels VBS einen Patch welcher diese Datei nachinstalliert und diese auch am System registriert. Leider war zum Ausführen des Patches eine Anmeldung als Administrator nötig, was an vielen Rechnern aus Sicherheitsgründen natürlich nicht der Fall war.

Um nicht mit einem unserer Systemadministratoren jeden Rechner, auf dem eine meiner Listen genutzt wird, mühsam aufsuchen zu müssen, blieb mir nur Eines übrig. Ich musste eine Möglichkeit finden, wie ich die Funktionalität des „Microsoft Date and Timer Pickers“ ohne die Verwendung der „MSCOMCT2.OCX“ weiterhin nutzen kann. Aus diesem Grund erstellte ich den „Basti Kalender“, welcher hierfür lediglich die VBA* Grundelemente nutzt.      

 

Screenshot des VBA Basti Kalender

 

Funktion

Beim Erstellen achtete ich von Anfang an darauf, dass es möglich ist den Kalender ohne großen Aufwand in mehreren VBA*-Projekten nachrüsten zu können. Dazu erstellte ich ein Formular namens „Kalender“, welche die Oberfläche des Kalenders (siehe Screenshot oben) enthält und 1 Modul namens „Kalendermodul“ in welchem sich die Programm-Logik hinter dem Kalender befindet.

 

Einbinden in ein bestehendes VBA-Projekt    

Um den Kalender in ein bestehendes VBA Projekt einbinden zu können, importiert man die beiden Dateien „Kalender.frm“ und „Kalendermodul.bas“. Dazu führt man einen Rechtsklick auf den VBA*-Projektexplorer aus und wählt im Menü den Menüpunkt „Datei importieren“ aus. Im anschließenden Dialogfenster wählt man schließlich die beiden Dateien aus (Hinweis: Der Import muss getrennt voneinander erfolgen!) und klickt zum Bestätigen auf OK.

 

Importieren der beiden Dateien „Kalender.frm“ und „Kalendermodul.bas“ ins aktuelle VBA-Projekt

 

Anschließend fügt man in das Formular, in welchem der Kalender verwendet werden soll einen Button und falls noch nicht vorhanden eine TextBox ein. In diese TextBox wird später das Datum, welches im Kalender ausgewählt wurde, eingetragen.    

 

Screenshot Button und TextBox für Datumsauswahl

 

Nun muss der Kalender beim Klicken auf den Button noch gefüllt und aufgerufen werden. Dazu trägt man im Klick-Event für den Kalender einfach den folgenden Aufruf der Methode „OpenKalenderForm(FormName, FormTextBox)“ ein.

  

Private Sub CommandButton1_Click()

    'Kalender öffnen (aktuelles Formular und gewünschte Textbox übergeben)
    Call OpenKalenderForm(Aufruf_mit, "TextBox1")

End Sub

 

Die Methode OpenKalenderForm erwartet beim Aufruf die folgenden beiden Parameter, welche für die korrekte Zuordnung des Kalenders zum jeweiligen Formular und der darauf angelegten TextBox nötig sind.

  • FormName:
    • der Name des aktuellen Formulars als Element vom Typ Object, weshalb hier keine Anführungszeichen benötigt werden! Das Formular trägt im gezeigten Beispiel den Name Aufruf_mit!  
  • FormTextBox:
    • der Name der Textbox welche später das Datum anzeigen soll als Element vom Typ string, weshalb hier Anführungszeichen benötigt werden! Die TextBox trägt im gezeigten Beispiel den Name TextBox1!  

Diese Vorgehensweise hat den Vorteil, dass mehrere Kalender-Buttons mit unterschiedlichen TextBox-Zielen in ein und dasselbe Formular eingefügt werden können, wie man am folgenden Beispiel mit 2 TextBoxen und 2 Kalender Buttons erkennen kann.

 

Screenshot der Verwendung von 2 TextBoxen inkl. 2 Kalender Buttons in einem Formular

 

Der Aufruf des Kalenders unterscheidet sich dabei lediglich am an zweiter Stelle übergebenen FormTextBox-Parameter der OpenKalenderForm-Methode. 

 

Private Sub CommandButton1_Click()

    'Kalender öffnen (aktuelles Formular und gewünschte Textbox übergeben)
    Call OpenKalenderForm(Aufruf_mit, "TextBox1")

End Sub

Private Sub CommandButton2_Click()

    'Kalender öffnen (aktuelles Formular und gewünschte Textbox übergeben)
    Call OpenKalenderForm(Aufruf_mit, "TextBox2")

End Sub

 

Diese recht einfache Möglichkeit der Kalenderintegration hat mir, nach der Fertigstellung, die Überarbeitung der Listen einfach gemacht! Den neu eingefügten TextBoxen für das Datum habe ich den gleichen Namen wie dem an gleicher Stelle zuvor gelöschten DateTimePicker vergeben. Das hat den großen Vorteil, dass an Makros, welche vorher das Datum des DateTimePickers weiterverabeitet haben, keine Änderungen vorgenommen werden müssen. Die Bezeichnung des für das Öffnen des Kalenderformular zusätzlich hinzugefügten Buttons spielt beim Umbau keine Rolle, da es sich um ein vorher noch nicht vorhandenes Element handelt, was lediglich das Anzeigen des Kalenders steuert. Hier hat man jetzt sogar die Möglichkeit, durch das Deaktivieren des Buttons die Nutzung des Kalenders zu sperren. 

 

Erweiterung des Funktionsumfangs – Version 1.0.1.0 (04/2021)

  • direkter Kalenderaufruf via Makro mit dem Ziel des Datumwertes auf eine beliebige Zelle eines Blattes
  • Markierung des ausgewählten Datums innerhalb des Kalenders – falls kein Datum gesetzt, wird das aktuelle Datum markiert

Nach Maroris Anfrage aus dem Kommentarbereich, ob es eventuell möglich wäre den Kalender dahingehend zu erweitern, dass dieser zusätzlich direkt über ein Makro gestartet werden kann und anschließend der gewählte Datumswert nicht in eine Textbox, sondern in eine Tabellenzelle eingetragen wird, erweiterte ich den Kalender um diese Funktion. Damit bereits angelegte Kalenderaufrufe ihre Gültigkeit behalten und nicht nachträglich überarbeitet werden müssen, entschied ich mich dazu für den Aufruf einen weiteren Befehl zu integrieren. Möchte man die neue Funktion nutzen, so ruft man nach dem Anlegen eines neuen Makros den Befehl 

 

Call OpenKalenderSheet(SheetName, SheetCell)

 

innerhalb der angelegten Sub-Anweisung auf. Dieser Aufruf erwartet ebenso wie der oben genannte Aufruf für die Methode OpenKalenderForm, die Übergabe von zwei Parametern.

  • SheetName:
    • der Name des Ziel-Tabellenblattes in welchem sich die Zelle mit / für das Datum befindet  und SheetCell die Zielzelle innerhalb dieses Blattes enthalten muss. 
  • SheetCell:
    • die Zielzelle innerhalb des Tabellenblattes

Zur besseren Erklärung habe ich die Beispieldatei um einen Button erweitert, welcher beim klicken folgende Sub-Anweisung (Makro) aufruft und ausführt.

 

Sub Kalender_open()
    'Kalender öffnen (gewünschten Blattname und Ziel-Zelle übergeben)
    Call OpenKalenderSheet("Tabelle1", "A8")
End Sub

 

Klickt man also auf den Button, so öffnet sich direkt der Kalender und das im Tabellenblatt „Tabelle1“ in Zelle „A8“ eingetragene Datum, sofern vorhanden, wird im Kalender markiert. Ist noch kein Datum in der Zelle vorhanden, so wird der heutige Tag markiert. Klickt man nun auf einen belliebigen Tag im Kalender, so wird das Datum in der angegebenen Zelle aktualisiert und der Kalender automatisch geschlossen.

 

Screenshot des aktualisierten Basti Kalenders mit dem Aufruf über OpenKalenderSheet(SheetName, SheetCell)

 

Die neu umgesetzte visuelle Markierung des ausgewählten Datums funktioniert nicht nur für den direkten Aufruf via Makro, sondern auch mit den bereits vorhandenen Formularaufrufen. Um die neuen Funktionen in bereits bestehenden Listen mit Kalenderversion 1.0 nutzen zu können, muss diese wie folgend beschreiben geupdated werden.

 

Vorgehensweise zum Update von Version 1.0 (2018) auf Version 1.0.1.0 (2021)

Wer bereits die alte Version des Basti Kalenders nutzt und gern auf die Version mit den neuen Funktionen umsteigen möchte, geht am besten wie folgt vor.

  • die hier als Download bereitgestellten Dateien herunterladen
  • das Projekt, in welchem der Basti Kalender bereits verwendet wird laden und den VBA-Editor öffnen
  • unter Formulare dein Eintrag „Kalender“ suchen und diesen mit Rechtsklick und der Auswahl von „Entfernen von Kalender…“ entfernen. Die Frage „Möchten Sie Kalender vor dem Entfernen exportieren?“ kann mit Nein beantwortet werden. 
  • unter Module dein Eintrag „Kalendermodul“ suchen und ebenfalls mit Rechtsklick und der Auswahl von „Entfernen von Kalendermodul…“ entfernen. Die Frage „Möchten Sie Kalendermodul vor dem Entfernen exportieren?“ kann ebenfalls mit Nein beantwortet werden. 
  • Jetzt können die beiden Dateien „Kalender.frm“ und „Kalendermodul.bas“, welche sich im in Schritt 1 heruntergeladenen Archiv des Basti Kalenders befinden, in das aktuelle Projekt einfügt werden. Die Vorgehensweise dazu kann, falls nötig, im Absatz „Einbinden in ein bestehendes VBA-Projekt“ noch einmal nachgelesen werden.  

Jetzt befinden sich die aktualisierten Dateien im aktuellen Projekt und die neuen Funktionen sind verfügbar. Damit ist der Updatevorgang abgeschlossen.

 

Fazit

Seit dem Erstellen habe ich den Kalender nicht wirklich weiterentwickelt (stimmt nicht mehr ganz), da er seine Aufgabe zuverlässig erfüllt und die von mir genutzten Funktionen des „Microsoft Date and Timer Picker“ in keinerlei Hinsicht unterlegen sind. Der Fakt, dass dies ganz ohne die Nutzung von nachzuinstallierenden Plug-Ins oder Active-X Steuerelementen funktioniert machen den Basti Kalender dabei noch wartungsfrei und problemlos auf nicht-Administratoren Anmeldungen nutzbar.

 

Download Basti Kalender Projekt

Für meine Freunde und alle Interessierten biete ich hier das Basti Kalender Projekt zum Download an. Da es mit den *.ZIP Dateien evtl. zu Problemen beim Download kommen kann (ZIP-Archive werden in einigen Web-Browsern als potentielle Bedrohung erkannt und der Download blockiert), stelle ich die Datei sowohl als *.ZIP, als auch als *.7z zur Verfügung. Für die letztere Datei benötigt man das kostenlose Kompressionsprogramm 7-Zip* was hier* heruntergeladen werden kann. (https://www.7-zip.de/).   

 

Download “VBA Kalendermodul (Zip-Archiv)” VBA-Kalendermodul-1.0.1.0.zip – 29-mal heruntergeladen – 148 kB

Download “VBA Kalendermodul (7-Zip-Archiv)” VBA-Kalendermodul-1.0.1.0.7z – 7-mal heruntergeladen – 135 kB

 

Debugging:

Trotz größter Sorgfalt und mehrfachem Testen kommt es immer wieder vor, dass sich in Software Bugs oder Fehler einschleichen, welche beim Erstellen übersehen, oder einfach nicht gefunden werden. Wenn jemand so einen Fehler finden sollte, oder sonstige Anregungen, Ideen oder Verbesserungen zum Programm hat, dann wäre es schön wenn dies einfach im Kommentarbereich kommuniziert wird. So kann ich die Änderungen in das nächste Versions-Update einfach mit einfließen lassen. 

 

Haftungsausschluss:

Die hier veröffentlichte Software wurde auf mehreren Systemen fehlerfrei getestet. Dennoch kann für evtl. Beschädigungen, Instabilitäten oder sonstige Beeinträchtigungen, welche unmittelbar durch die Installation, Nutzung, oder in sonstiger Weise in Zusammenhang stehend mit der hier zum Download angebotenen Software auftreten keinerlei Haftung übernommen werden. Der Download, die Installation und Nutzung geschehen auf eigenes Risiko! Bei Problemen wenden sie sich bitte an info@langer-sebastian.de!

 

2 Gedanken zu „Basti Kalender – Der Ersatz für den Microsoft Date and Time Picker

  • April 16, 2021 um 6:49 am
    Permalink

    Hallo Basti,
    sehr tolles Toll, was du dir ausgedacht hast. Die Flexibilität und Unabhängigkeit ist spitze! Installation verlief problemlos.

    Kurze Frage:
    wär es auch denkbar den Kalender über ein Makro zu starten und den Datumswert nicht in ein Textfeld eines Formulas sondern direkt in eine Tabellen-Zelle einzutragen?

    Eine hilfreiche Erweiterung wäre die farbliche Hervorhebung des heutigen Datums. Würdest du die umsetzen wollen oder ist das Projekt für dich beendet?

    Gruß Maroris

    Antwort
    • April 17, 2021 um 11:17 pm
      Permalink

      Hallo Maroris,
      sehr toll, es freut mich, dass dir der Kalender ebenso gute Dienste leistet wie mir. Die beiden von dir genannten Funktionen finde ich wirklich sinnvoll und nützlich, weshalb ich den Kalender überarbeitet und diese mit eingebaut habe. Dabei habe ich versucht darauf zu achten, dass die einfache Nutzbarkeit des Kalenders nicht großartig verkompliziert wird und an bereits bestehenden „Einbauten“ nicht überarbeitet werden muss. Eine Anleitung zu den neuen Funktionen habe ich oben unter dem Abschnitt „Erweiterung des Funktionsumfangs – Version 1.0.1.0 (04/2021)“ eingefügt. Über ein Feedback zur Nutzung und zum Updatevorgang (ich hoffe es ist einigermaßen verständlich) würde ich mich freuen. Dann schon mal viel Spaß damit…

      Viele Grüße
      Sebastian

      Antwort

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.