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.
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.
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.
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.
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.
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.
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)
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.
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.
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.
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.
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.
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.
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. 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.
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 – 2942-mal heruntergeladen – 188,42 kBDownload “VBA Kalendermodul (7-Zip-Archiv)”
VBA-Kalendermodul-1.0.2.2.7z – 764-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!
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
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
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.
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
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
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
Perfekt! Vielen Dank Sebastian, funktioniert alles!
Man spürt mit was für einem Elan und Energie du hinter deinen Projekten stehst!
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
Hallo Armin,
schau im VBA-Editor mal im Menüreiter „Extras“ unter „Verweise“ ob da irgendein Verweis als „NICHT VORHANDEN“ angezeigt wird. Eine Hilfe dazu findest du vielleicht in folgendem Microsoft Dokument:
https://docs.microsoft.com/de-de/office/vba/language/reference/user-interface-help/can-t-find-project-or-library
Viele Grüße
Sebastian
Hallo Sebastian, ein tolles Tool hast du da entwickelt. Kann dein Date picker auch mehrere Tage auswählen?
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
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.
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
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
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
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
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
Hallo Basti,
der Datepicker ist genial. Gibt es eine Möglichkeit das man das Jahr vor dem Start festlegen kann?
Viele Grüße
Ralf
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
Hallo Basti,
ich habe leider keine angepasste Version von dir bekommen. Kannst du mir bitte diese nochmal schicken.
Viele Grüße
Ralf
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
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
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
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
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
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
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
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
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