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 gestalten, 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 Kalenders

 

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 des angelegten Buttons 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

 

Ab Version 1.0.2.2 vom 11.05.2022 kann dem OpenKalenderForm() ein optionaler dritter Parameter übergeben werden, mit welchen die Überschrift des Kalenderfensters geändert werden kann. Der Aufruf der Methode zum Öffnen des Kalenderfensters sieht dann wie folgt aus

  

Private Sub CommandButton1_Click()
    
    'Ab Version 1.0.2.2 mögliche Angabe der Fensterbezeichnung    
    'Kalender öffnen (aktuelles Formular und gewünschte Textbox übergeben)
    Call OpenKalenderForm(Aufruf_mit, "TextBox1", "Text für Textbox 1")

End Sub

 

Hinweis: Durch die Verwendung eines optionalen Parameters bleiben bereits erstellte Aufrufe anhand des vorherigen Schemas mit den zwei Übergabeparametern weiterhin ihre Funktionalität und müsse nicht angepasst werden!  

 

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!  
  • FensterBezeichnung: (ab Version 1.0.2.2)
    • Die optionale Angabe der Bezeichnung (Überschrift) des Kalenderfensters!

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. 

 

Änderungen und Erweiterungen des Funktionsumfangs (letzte Änderung 11.05.2022)

Version 1.0.2.2

  • Möglichkeit der optionalen Angabe einer Bezeichnung für die Überschrift des Kalenderfensters 

Version 1.0.2.1

  • Bugfix der Wochentagerkennung des ersten Tages im Monat.
    (Dankeschön an Christian für das Suchen und Mitteilen der Bug-Position) 

Version 1.0.2.0

  • Performanceverbesserung durch Code-Optimierung by Wolfgang
  • „Zell-Status-Erkennung“ um das versehentliche Überschreiben von bestimmten Zellen (mit Formel belegt, gesperrt, etc.) zu vermeiden. 
  • Vergrößern des auswählbaren Jahreszeitraumes auf -99 bis +100 Jahre 
  • 3. Button innerhalb der Beispieldatei, mittels welchem der Kalender mit Bezug auf die aktuell markierte Zelle geöffnet wird.

Version 1.0.1.0

  • 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

Version 1.0.1.1

  • das aktuelle und das gewählte Datum werden unterschiedlich farbig markiert 
  • Aufruf des Kalenders über einen Eintrag im Kontextmenü (Rechtsklick auf beliebige Tabellenzelle)
    • das gewählte Datum wird in die Zelle auf welcher der Rechtsklick erfolgte eingetragen
  •  direktes Setzen des Datums über einen Eintrag im Kontextmenü (Rechtsklick auf beliebige Tabellenzelle)
    • das aktuelle Datum wird sofort in die Zelle eingetragen
  • ein Button zum Setzen des aktuellen Datums wurde dem Kalender hinzugefügt

Version 1.0.1.2

  • Starten aller Features ohne Eintrag in Workbook_Open() Methode umgesetzt
    •  lediglich ein Neustart nach dem Importieren der Dateien muss noch durchgeführt werden
  • Kontextmenü für den direkten Aufruf ders Kalenders wurde auf Tabellen erweitert
  • Formatierung der Zielzelle wird beim Setzen des Datums beibehalten
  • Samstage und Sonntage werden farblich abgesetzt dargestellt 

Version 1.0.2.0

– Performanceverbesserung durch Codeoptimierung (danke an Wolfgang)
– Zell-Statuserkennung um versehentliches Überschreiben von gesperrten oder mit Formeln belegten Zellen zu vermeiden
– Nutzerinformation muss das Überschreiben vorab durch ein Dialogfenster bestätigen
– (ebenfalls danke an Wolfgang)
– Erweitern des Jahreszeitraumes auf – 99 Jahre bis + 100 Jahre des aktuellen Kalenderjahres
– Einfügen eines 3. Buttons, mittels welchem der Kalender mit Bezug auf die aktuell markierte Zelle geöffnet wird

 

Aufruf  mit Zellenbezug anstatt Textboxeintrag (ab Version 1.0.1.0)

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. Der Übergabewert muss vom Typ String, also zum Beispiel „Tabelle1“, übergeben werden! 
  • SheetCell:
    • die Zielzelle innerhalb des Tabellenblattes ebenfalls als String. Die Spaltenangabe erfolgt hier in der in Excel verwendeten Buchstabennotation, also zum Beispiel als „A8“ oder „C17“!

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)

 

Buttons innerhalb der Beispieldatei

Innerhalb der Datei „Kalenderbeispiel.xlsx“ befinden sich 3 Buttons, mit welchen unterschiedliche Aktionen ausgeführt werden können. Diese dienen der Veranschaulichung der Funktionsweise und können bei Bedarf in andere Projekte übernommen werden.

 

Button 1 (Beispiel Formular)
– Öffnet ein Formular, in welchem der Kalender mit Bezug auf eine Textbox geöffnet werden kann.

Button 2 (Eintrag in festgelegte Zelle)
– Setzt das Datum innerhalb einer festgelegten Zelle im angegebenen Tabellenblatt.

Button 3 (Eintrag in ausgewählte Zelle)
– Setzt das Datum innerhalb der aktuell markierten Zelle des aktiven Tabellenblattes.

 

'Aufruf Button 1 (Formularbeispiel)
Sub Form_open()
    'Das Beispielformular "Aufruf_mit" anzeigen
    Aufruf_mit.Show
End Sub

'Aufruf Button 2 (Zellenbeispiel mit fester Adressierung)
Sub Kalender_open()
    'Kalender öffnen (gewünschten Blattnamen und Ziel-Zelle übergeben)
    Call OpenKalenderSheet("Tabelle1", "F4")
End Sub

'Aufruf Button 3 (Zellenbeispiel mit Adressierung der aktuell ausgewählten Zelle)
Sub Kalender_open_selected_Cell()
    'Kalender öffnen (aktuell gewählten Blattnamen und markierte Zelle übergeben)
    Call OpenKalenderSheet(ActiveSheet.Name, ActiveCell.Address)
End Sub

 

Weitere Features des Basti Kalenders.
(Zum Anzeigen einfach per Klick auf die Überschrift ausklappen)

 

Ändern der Kalenderüberschrift ab Version 1.0.2.2

Ab Version 1.0.2.2 kann die Überschrift des Kalenderfensters optional geändert werden. Somit kann zum Beispiel bei mehreren Buttons / Textfeldern innerhalb eines Formulars die Zugehörigkeit des Kalenders zum jeweiligen Element besser sichtbar gemacht werden.

Hierfür übergibt man, wie bereits weiter oben erwähnt, den gewünschten Text der Fensterüberschrift als dritten Parameter der OpenKalenderForm() Methode. Beim anschließenden Öffnen des Kalenderfensters wird dieser dann in der Fensterbeschreibung angezeigt. Wird kein dritten Parameter übergeben, so wird die Standardfensterbezeichnung eingeblendet. Dies hat den Vorteil, dass bereits erstellte Kalenderaufrufe aus vorherigen Versionen des „Basti Kalender“ weiterhin funktionieren.

Der Aufruf der beiden Schaltflächen schaut damit wie folgt aus.

 

Private Sub CommandButton1_Click()
        
    'Kalender öffnen (aktuelles Formular und gewünschte Textbox übergeben)
    Call OpenKalenderForm(Aufruf_mit, "TextBox1", "Text für Textbox 1")

End Sub

Private Sub CommandButton2_Click()

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


End Sub

 

Klickt man nun auf die 1. Schaltfläche, so öffnet sich der Kalender mit dem Text „Text für Textbox 1“ als Bezeichnung, respektive Überschrift.

 

Screenshot des VBA Basti Kalender mit per Parameter geänderter Überschrift

Datumsschnellauswahl über das Kontextmenü

 

Eine weitere Erweiterung ist die Möglichkeit, den Kalender über einen Eintrag im Kontextmenü aufrufen zu können. Dieses öffnet man per Rechtsklick auf eine beliebige Stelle innerhalb des Tabellenblattes. Im ausgeklappten Kontextmenü findet man anschließend die beiden Menüpunkte „Basti – Kalender öffnen“ und „heutiges Datum setzen“, wobei der erste Eintrag das Kalenderfenster öffnet, während der zweite Eintrag das aktuelle Datum ohne Kalenderanzeige setzt. Der Eintrag des ausgewählten Datums erfolgt bei beiden Varianten in die Zelle, auf welche der Rechtsklick getätigt wurde.

 

Screenshot der Auswahlmöglichkeiten im Kontextmenü

Zusätzliche Erweiterungen in Version 1.0.1.1

 

Mit Version 1.0.1.1 wurden des Weiteren Änderungen eingeführt, für welche keine speziellen Anpassungen nötig sind. So wird nun das aktuelle Datum (rot) und das evtl. bereits gesetzte Datum (grün) innerhalb des Kalenders farblich unterschiedlich dargestellt. Außerdem installierte ich, ähnlich wie beim „Microsoft Date and Time Picker“ unterhalb des Kalenders einen Knopf, mit welchem das aktuelle Datum sofort gesetzt werden kann.

  

Screenshot des VBA Basti Kalenders ab Version 1.0.1.1

 

Diese Änderungen werden mit dem Updaten oder Installieren der Version 1.0.1.1 automatisch verfügbar und benötigen keine Änderung an evtl. bereits bestehenden Kalenderaufrufen.

Nur für Version 1.0.1.1 benötigter Eintrag in der workbook_open() Methode

Um die Funktion nutzen zu können, müssen allerdings die beiden Einträge dem Kontextmenü beim Öffnen des Workbooks hinzugefügt werden. Dies geschieht durch das Anlegen der „workbook_open()“ Methode innerhalb der aktuellen Arbeitsmappe. Diese findet man unter dem Namen „DieseArbeitsmappe“ innerhalb des „Microsoft Excel Objekte“-Ordners. 

 

Screenshot „DieseArbeitsmappe“ inkl. der „workbook_open()“ Methode

 

Die anzulegende „workbook_open()“ Methode enthält hierbei lediglich einen Aufruf. Sollte die Methode im Dokument bereits vorhanden sein, so muss diese lediglich um den Aufruf „Call Kalendermodul.KontextMenuAdd“ erweitert werden. Nachfolgend noch einmal die komplette Methode als Code.

 

Sub workbook_open()
    
    'anlegen der Kontextmenueinträge
    Call Kalendermodul.KontextMenuAdd
        
End Sub

 

Hinweis: Der Eintrag in der workbook_open() Methode gilt ausschließlich für Version 1.0.1.1 und wurde ab Version 1.0.1.2 durch eine Autostart-Methode ersetzt. 

zusätzliche Erweiterungen in Version 1.0.1.2

Die wichtigste Neuerung ab Version 1.0.1.2 ist das Wegfallen des in Version 1.0.1.1 benötigten Eintrages in der workbook_open() Methode. Das Kalendermodul und das Formular funktionieren nun auch ohne diesen Eintrag. Lediglich ein erneutes Öffnen der Excel-Datei muss nun nach dem Importieren der Komponenten noch durchgeführt werden.

Außerdem änderte ich das Einfügen des Datums insofern ab, dass nun die Ausgangsformatierung (Ausrichtung) der Zelle, in welche das Datum eingefügt werden soll, beibehalten wird. Um den Vorgang besser zu veranschaulichen, habe ich in das Beispieldokument eine Tabelle integriert, an der man dies gut erkennen und auch selbst ausprobieren kann.

 

Screenshot der Testdatei mit neuer Tabelle und beibehaltener Formatierung (Ausrichtung) nach dem Einfügen des Datums

 

An dieser Tabelle kann man ebenfalls den nachgerüsteten Zugriff über das Kontextmenü für integrierte Tabellen (Danke für den Hinweis Maroris) testen.

 

Aktuelles Layout des Basti Kalenders

Ab Version 1.0.1.2 habe ich den Vorschlag, die Samstage und Sonntage zur besseren Orientierung leicht unterschiedlich zu gestalten ebenfalls mit umgesetzt. Diese werden jetzt in dezenten Grautönen dargestellt.

  

Screenshot des Basti-Kalenders mit farblicher Abhebung der Samstage und Sonntage

        

Vorgehensweise zum Update auf Version 1.0.2.2 (2022)

Wer bereits eine ältere Version des „Basti Kalender“ 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 Kalender“ 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 nach dem Speichern und einem erneuten Öffnen der Datei 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.2.2.zip – 2733-mal heruntergeladen – 188,42 kB

Download “VBA Kalendermodul (7-Zip-Archiv)”

VBA-Kalendermodul-1.0.2.2.7z – 713-mal heruntergeladen – 173,25 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!

 

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

  • April 16, 2021 um 6:49 am Uhr
    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 Uhr
      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
  • April 26, 2021 um 7:35 am Uhr
    Permalink

    Hallo Sebastian,
    freut mich, dass meine Änderungsvorschläge so schnell angekommen sind und von dir auch umgesetzt wurden.

    Um das Programm noch besser zu machen hätte ich noch zwei Vorschläge.
    1. in der Kalenderansicht sollte der heutige Tag eine andere Farbe haben, als der Tag, der bereits in der Zelle steht. Steht in der Zelle z.B. 8.4. und heute ist der 26.4., dann dürften beide Tage mit unterschiedlichen Farben aufleuchten. Dies hilft wie ich finde sehr gut bei der Orientierung.

    2. Bei einem ähnlichen Projekt, auf welches ich hier aber nicht verweisen möchte, fand ich die Zugänglichkeit des Kalenders sehr gut. Per Rechtsklick auf die gewünschte Zelle erschien das Kontextmenü. Dieses war um einen Eintrag „Kalender“ ergänzt. Somit konnte man intuitiv den Kalender starten. Selbstverständlich ginge das auch über einen Button in der Schnellstartleiste mit zugewiesenem Makro. Per Kontextmenü sind aber die Maus-Wege etwas kürzer und die Bedienung wird dadurch auch logischer.
    Wenn du dies in den Makr0s ergänzen könntest, wäre das eine sehr schöne Erweiterung für deinen Kalender. Die Performance deiner Version ist nämlich wesentlich besser. Der Kalender erscheint ohne große Verzögerung.

    Würde mich freuen.
    Gruß Maroris.

    Antwort
  • April 27, 2021 um 7:48 am Uhr
    Permalink

    Hallo Maroris,
    Wow, die Möglichkeit das Kontextmenü per VBA zu erweitern war mir noch gar nicht bekannt. Das werde ich in Zukunft sicherlich des Öfteren nutzen. Die Umsetzung hierfür war noch nicht einmal allzu schwierig, weshalb ich gleich einen zweiten Eintrag für das Setzen des aktuellen Datums mit integriert habe. Das einzige was mich an der Umsetzung ein wenig stört ist, dass man um diese Funktion auch nutzen zu können, nun zusätzlich einen Eintrag in der „workbook_open()“ Methode anlegen muss. Mit der erweiterten Anleitung von oben sollte das aber auch kein Problem sein und vielleicht fällt mir ja noch eine bessere Lösung dazu ein.

    Ich habe außerdem, so wie beim „Vorbild“ von Microsoft, einen Button für das aktuelle Datum ins Kalenderform integriert. So kann man nun unabhängig vom angezeigten Monat immer schnell das aktuelle Datum setzen. Um alle Neuerungen nutzen zu können, müsstest du allerdings nochmals den Updatevorgang, wie oben beschrieben, mit den aktuellen Dateien von Version 1.0.1.1 durchführen und die besagte „workbook_open()“ Methode anlegen. Falls diese bei dir schon vorhanden sein sollte, müsstest du diese dann um den oben genannten Aufruf „Call Kalendermodul.KontextMenuAdd“ erweitern.
    So dann, viel Spaß damit! Über ein Feedback, wie du die Änderungen findest, würde ich mich freuen.

    Viele Grüße
    Sebastian

    Antwort
  • Mai 12, 2021 um 8:17 am Uhr
    Permalink

    Hallo Sebastian,
    nun habe ich endlich Zeit gefunden, dir Rückmeldung zu geben. Ich freue mich wirklich sehr darüber, dass du meine Vorschläge umgesetzt hast.
    Die Integration in ein bestehendes Projekt verlief problemlos.
    Etwas schade ist, dass das VBA Kalendermodul nur in Projekten funktioniert, in welchen man in der „workbook_open()“ Methode den Call Aufruf eingebunden hat. Vielleicht ist es auch möglich, in einer Excel-Vorlage zu integrieren (STARTXL) Verzeichnis, so dass die Methode bei jedem Excel-Start geladen wird. Dann wäre dein Kalender-Modul quasi in jeder Excel-Mappe aktiv, ohne dass jede Arbeitsmappe eine Anpassung der obigen Methode benötigt.

    Hilfreich ist der Button Aktuelles Datum einfügen. Sehr gut!

    Die Verwendung des Kontextmenüs funktioniert außerhalb von Tabellen. Innerhalb von Tabellen werden nach Rechtsklick deine Kontextmenü-Einträge nicht geladen. Hast du hierfür eine Lösung? Vielleicht hilft das hier: http://www.office-loesung.de/ftopic451689_0_0_asc.php

    Gibt es einen Grund, warum die eingefügten Daten linksbündig sind? Gebe ich von Hand ein Datum in eine leere Zelle ein, wird automatisch das Datenformat von Standard auf Datum geändert und das Datum wird rechtsbündig formatiert. Verwende ich hingegen das Kalendermodul zur Eingabe eines Datums, erscheint das Datum linksbündig.

    In manchen Kalendern werden die Tage Samstag und Sonntag in einer dezent anderen Farbe als die Wochentage ausgefüllt. Dies kann eine schnelle Orientierung ermöglichen. Ist aber sicherlich Geschmackssache 🙂

    Ich freue mich über jede Verbesserung. Danke für den Dialog !

    Viele Grüße
    Maroris

    Antwort
  • Mai 14, 2021 um 9:47 am Uhr
    Permalink

    Hallo Maroris,

    ich habe die workbook_open() Methode durch einen Autostart-Aufruf innerhalb des Kalendermoduls ersetzt. Damit ist ein Eintrag in diese nicht mehr nötig und das alleinige Importieren der beiden Komponenten (Kalendermodul & Formular) reicht jetzt wieder aus. Das Kontextmenü wird nun auch auf Tabellen angewendet (Danke für den Hinweis & Link) und Samstage und Sonntage, wie oben zu sehen, mit leichten Grautönen hinterlegt.

    Die Ausrichtung des Datums innerhalb der Zelle habe ich nun so umgesetzt, dass die vorherige Formatierung der Zelle einfach beibehalten wird. Ist die Zelle oder Spalte komplett rechtsbündig ausgerichtet, so wird das Datum ebenfalls rechtsbündig ausgerichtet. Somit ist man da flexibel und nicht auf eine Einstellung festgelegt. Zum Updatevorgang brauch ich dir ja glaube ich nichts mehr sagen (das Entfernen des workbook_open() Eintrages nicht vergessen)…

    Viele Grüße
    Sebastian

    Antwort
  • Mai 18, 2021 um 3:42 pm Uhr
    Permalink

    Perfekt! Vielen Dank Sebastian, funktioniert alles!
    Man spürt mit was für einem Elan und Energie du hinter deinen Projekten stehst!

    Antwort
  • Oktober 15, 2021 um 5:00 pm Uhr
    Permalink

    Hallo Sebastian
    danke für Bereitstellung deines Kalenders.
    Leider bekomme ich es nicht hin, diesen Kalender auf meine vorhandene Userform (umfangreiches Kassenbuch) zu
    zu importieren. Also der Import klappt schon, aber beim Ausprobieren bekomme ich eine Fehlermeldung :bei
    „Date“ und „Format“ erscheint „Projekt oder Bibliothek nicht gefunden.
    Ich könnte Dir auch mal die kpl. Exceldatei schicken.
    Viele Grüße aus Sachsen
    Armin

    Antwort
  • Februar 10, 2022 um 4:57 am Uhr
    Permalink

    Hallo Sebastian, ein tolles Tool hast du da entwickelt. Kann dein Date picker auch mehrere Tage auswählen?

    Antwort
    • Februar 10, 2022 um 6:55 pm Uhr
      Permalink

      Hallo Eike,
      vielen Dank für den Zuspruch zum Kalender. Aktuell kann man nur einen einzigen Tag auswählen, da dies für meine Zwecke immer gereicht hat. Eine Umsetzung zur Auswahl mehrerer Tage oder eines Zeitraumes an Tagen wäre aber durchaus machbar. Falls du so etwas brauchen solltest, könnte ich dies sicherlich nachträglich einfügen.

      Viele Grüße
      Sebastian

      Antwort
  • März 16, 2022 um 11:25 am Uhr
    Permalink

    Hallo,
    ich habe leider ein Problem mit dieser Erweiterung, bereits beim Start es Beispiels bekomme ich einen Laufzeitfehler mit der Meldung „Das angegebene Objekt konnte nicht gefunden werden“. Nach dem Klick auf „Debuggen“ stehe ich in der Zeile „Kalender.Controls(„CommandButton“ & Start).Caption = „1““. Bitte um Hilfe.

    Antwort
    • März 17, 2022 um 7:22 pm Uhr
      Permalink

      Hallo Chris,
      das ist ungewöhnlich, normalerweise läuft der Kalender recht problemlos. Gerade das Kalenderbeispiel sollte eigentlich auf Anhieb funktionieren. Ich habe versucht die Fehlermeldung zu reproduzieren, doch selbst das Löschen des ersten Buttons oder des kompletten Kalenderformulars führte nicht zum beschriebenen Fehler.
      Das der Fehler durch eine bestimmte Excelversion verursacht wird, lässt sich natürlich nie zu 100% ausschließen. Wenn du mir da ein paar weitere Informationen zukommen lassen könntest (Excelversion, Windowsversion, etc… ), dann könnte ich vielleicht den Fehler näher eingrenzen und eine Lösung dafür erarbeiten. Die Infos kannst du mir gern an info@langer-sebastian.de senden. Sorry, dass ich vorerst nicht mehr für dich tun kann…

      Beste Grüße
      Sebastian

      Antwort
  • April 7, 2022 um 1:10 am Uhr
    Permalink

    Hallo Sebastian,

    ich glaube die Archive sind kaputt. So meint es zumindest Winrar, egal bei welcher Version. Es kommen zwar die Dateien mit der richtigen Kilobytegröße an, aber sie lassen sich nicht ohne Fehler entpacken.
    Viren-Scanner wurde auch kurzfristig deaktiviert, hat aber nicht geholfen.

    Grüße Gernot

    Antwort
    • April 7, 2022 um 5:36 am Uhr
      Permalink

      Hallo Gernot,

      vielen Dank für den Hinweis. Ich habe letztens die Dateien per FTP-Programm nochmals geupdated, doch anscheinend scheint WordPress das nicht zu mögen. Nun habe ich die selben Dateien nochmals per WordPress-GUI hochgeladen und das scheint das Problem behoben zu haben. Ich schick dir die Dateien noch per E-Mail, es wäre trotzdem super, wenn du den Download nochmal ausprobieren könntest.

      Viele Grüße
      Sebastian

      Antwort
  • Mai 10, 2022 um 7:08 am Uhr
    Permalink

    Hallo Sebastian,

    einen tollen Kalender hast du hier entwickelt.
    Einen Erweiterungsvorschlag hätte ich: wenn es auf einem Userform mehrere Buttons für den Kalenderaufruf gibt, wäre es sinnvoll mit dem Aufruf eine Bezeichnung als dritten Argument mitzugeben – dies könnte die Caption oder für einen Label sein.
    So kann der User erkennen bei welcher Eingabe er sich befindet.

    Grüße, Kurt

    Antwort
    • Mai 11, 2022 um 11:36 am Uhr
      Permalink

      Hallo Kurt,

      vielen Dank für das nette Feedback.
      Das mit der Bezeichnung ist eine sehr gute Idee, welche ich soeben mit Version 1.0.2.2 umgesetzt habe.
      Mir war wichtig, dass alle bereits erstellten Kalenderaufrufe ihre Funktionalität behalten und nicht nachträglich angepasst / überarbeitet werden müssen. Dazu habe ich die Angabe der Bezeichnung als optionalen Parameter hinzugefügt.
      Falls du die Änderung nicht schon selbst gemacht hast, kannst du die aktuelle Version ab sofort downloaden.

      Viele Grüße
      Sebastian

      Antwort
  • Juni 6, 2022 um 2:38 pm Uhr
    Permalink

    Hallo Basti,
    der Datepicker ist genial. Gibt es eine Möglichkeit das man das Jahr vor dem Start festlegen kann?

    Viele Grüße
    Ralf

    Antwort
    • Juni 6, 2022 um 9:13 pm Uhr
      Permalink

      Hallo Ralph,

      vielen Dank für dein nettes Feedback.
      Ich habe dir eine angepasste Version erstellt und an deine Mailadresse gesendet.
      Über ein Feedback zum umgesetzten Feature würde ich mich sehr freuen.

      Viele Grüße
      Basti

      Antwort
      • Juni 24, 2022 um 6:34 am Uhr
        Permalink

        Hallo Basti,

        ich habe leider keine angepasste Version von dir bekommen. Kannst du mir bitte diese nochmal schicken.

        Viele Grüße
        Ralf

        Antwort
        • Juni 24, 2022 um 10:01 am Uhr
          Permalink

          Hallo Ralph,
          ich habe dir die Datei noch einmal zugesendet. Vielleicht landet es aufgrund des angehängten Zip-Archives ja im Spam-Ordner!?
          Falls du trotzdem nichts bekommen haben solltest, kann es auch sein, dass deine hinterlegte E-Mailadresse nicht passt. Ist das der Fall, dann sende mir am besten an info@langer-sebastian.de eine Mail, dann schicke ich dir das Zip-Archiv auf diese Adresse zurück.
          Viele Grüße
          Basti

          Antwort
  • Juni 24, 2022 um 10:00 am Uhr
    Permalink

    Hallo Basti,

    ich habe die Datei von dir im Spam-Ordner gefunden. Genau so wie von dir beschrieben klappt es nun mit der Vorgabe des Jahres.
    Perfekt und vielen Dank.

    Viele Grüße
    Ralf

    Antwort
  • Juli 8, 2022 um 3:22 pm Uhr
    Permalink

    Hallo Basti,

    wenn man mit der rechten Maustaste das „Basti-Menü“ benutzt um den Datepicker aufzurufen, kann man dabei auch das gewünschte Jahr vorgeben?

    Viele Grüße
    Ralf

    Antwort
    • Juli 9, 2022 um 1:35 pm Uhr
      Permalink

      Hallo Ralph,

      ich habe dir eine Mail geschickt und hoffe, dass ich dein benötigtes Feature richtig interpretiert und passend umgesetzt habe. Falls nicht, einfach nochmal melden! Bitte check auch wieder den SPAM-Ordner, falls meine Mail wieder da gelandet sein sollte! 🙂

      Viele Grüße
      Sebastian

      Antwort
  • Oktober 4, 2022 um 1:34 pm Uhr
    Permalink

    Hallo Basti,

    tolles Kalendertool.

    Vielleicht kann man das Klassenorientiert machen. Ich hab das einmal ausprobiert das geht auf den ersten Blick ganz gut.
    Folgendes ist dazu erforderlich.
    Einfach ein Klassenmodul mit dem Namen clsKalender den Projekt hinzufügen.

    Klassenmodul clsKalender:
    ——————————————————————————————————————–
    Option Explicit

    Public WithEvents KalenderButton As MSForms.CommandButton

    Property Set ctrlbutton(Button As MSForms.Control)

    Set KalenderButton = Button

    End Property

    Private Sub KalenderButton_click()

    Kalender.doAction (Format(KalenderButton.Caption, „00“) & „.“ & Format(Kalender.Monat.ListIndex + 1, „00“) & „.“ & Kalender.Jahr.Text)

    End Sub
    —————————————————————————————————————-

    In UserFrom muß dann folgendes hinzugefügt werden.
    In der Ojektansicht habe ich die Commandbuttons in einen Frame mit dem Namen ‚Kalenderframe‘ gelegt.
    Den Callback UserForm_QueryClose habe ich nur dazugefügt, falls man die Userform über das Schliessen im Dialogetitel schliesst.
    Damit der eventuell aufrufende Dialog nicht mitgeschlossen wird.

    UserForm Kalender:
    —————————————————————————————————————-
    Option Explicit

    Public colKalender As Collection

    Private Sub UserForm_Initialize()

    Dim Kalender As clsKalender
    Dim ctrl As MSForms.Control

    Set colKalender = New Collection
    For Each ctrl In Kalenderframe.Controls
    If TypeName(ctrl) = „CommandButton“ Then
    Set Kalender = New clsKalender
    Set Kalender.ctrlbutton = ctrl
    colKalender.Add Kalender
    End If
    Next ctrl
    Set Kalender = Nothing

    End Sub

    Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)

    Cancel = 1
    Kalender.Hide

    End Sub

    Private Sub UserForm_Terminate()

    Set colKalender = Nothing

    End Sub
    —————————————————————————————————————

    Die ganzen CommandButton_Click(), kannst du dann rausschmeißen.

    Das verbessert selbstverständlich nicht wirklich etwas. Und ich habe auch nicht getestet ob das alle Anforderungen gerecht wird.
    Aber dein Code wird schlanker und besser.

    Nur so eine Idee.

    Gute Arbeit. Vielen Dank!

    Gruß Ulrich

    Antwort
    • Oktober 4, 2022 um 4:13 pm Uhr
      Permalink

      Servus Ulrich,

      vielen Dank, dass mit der Klasse ist eine gute Idee!
      Wenn ich das nächste Mal größere Umbauten am Kalender mache, versuch ich das mit umzusetzen.
      Die vielen CommandButton_Click() Events haben mich damals schon gestört. Leider habe ich zu der Zeit keine Methode gefunden das als Funktion umzusetzen und wenn’s erst einmal „verbrochen“ ist, dann bleibt’s oft einfach so.
      Gut das man da bisher nichts groß anpassen musste, bei mehr als 30 Events hätte ich mich dafür wieder selbst gehasst :-D!

      Viele Grüße
      Sebastian

      Antwort
      • Oktober 4, 2022 um 7:40 pm Uhr
        Permalink

        Hallo Basti,

        ich kenne das.
        Alleine entwickelt man meistens ziemlich aus dem Stehgreif .
        Ist ja auch nicht allzu wichtig. Hauptsache der Code funktioniert und nichts stürzt ab.
        Es gibt manchmal richtige Code-Fetischisten, die bauen aus Allem eine Klasse, auch wenn die dann nur einmal ohne Ableitung, Vererbung oder sonstwas benutzt wird. In VBA jetzt nicht unbedingt, da geht ja in der Richtung meines Wissens sowieso nicht viel,
        aber in anderen Programmiersprachen schon.

        Falls du das Projekt nochmal überarbeiten solltest, wäre eine Kalenderwoche, zumindest optional , nicht schlecht.
        Wie auch immer, ich kann das gut gebrauchen und es funktioniert problemlos.

        Viele Grüße
        Ulrich

        Antwort
  • Februar 25, 2023 um 11:05 pm Uhr
    Permalink

    Hallo Basti
    Kann man den Kalender auch so anpassen, das er ab den Start-Tag bis zum End-Tag nur den Tag in einem Monat in einer Zeile einträgt.
    Und sie dann evtl. Farblich verbindet, für einen Urlaubsplan.

    Gruß
    Thorsten

    Antwort
    • Februar 27, 2023 um 2:33 pm Uhr
      Permalink

      Hallo Thorsten,
      das sollte möglich sein, jedoch müsste man dafür eine neue Funktion implementieren, welche genau das zur Verfügung stellt. Der Source-Code ist offen zugänglich, da könntest du die Funktion einbauen und mit den bereits vorhandenen Funktionen den Kalender steuern. Das farbliche Hinterlegen ist sicherlich der schwierigste Teil…
      Grüße
      Sebastian

      Antwort

Schreibe einen Kommentar

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