wijzig taal:

Vaak moet in een applicatie een datum gekozen worden en dan is het heel fraai om hierbij een kalender te tonen die als datumkiezer kan worden gebruikt. Aan de onderzijde van deze pagina kan een Excel-bestand gedownload worden die een hele gebruikersvriendelijke en veelzijdige datumkiezer bevat die eenvoudig toegevoegd kan worden aan eigen applicaties. Deze datumkiezer bevat heel veel configuratie opties en is geschikt voor zowel Office 32 bits als 64 bits.

datum kiezer

Het bestand bevat 3 klassenmodules: clDatePickerControl, clDatePickerForm en iDatePickerForm die feitenlijk het hart van de tool vormen. Daarnaast bevat dit bestand een formulier frmDatePicker dat verder helemaal leeg is en waarbij ook de afmetingen niet van belang zijn. Het vullen van het formulier en het instellen van de afmetingen wordt verder helemaal geregeld door de klassenmodules. Om deze datumkiezer goed te laten werken moet de volgende code toegevoegd worden aan het formulier:

'------------------------------------------------------------------------------------------------------------------------------
' Auteur    : Manfred van den Noort
' Copyright : © 2024-2025 worksheetsvba.com, alle rechten voorbehouden
' Datum     : 2025-04-25
' Versie    : 5.2
' Doel      : DatumKiezer
'------------------------------------------------------------------------------------------------------------------------------

Option Explicit

Private oDatePickerForm As iDatePickerForm, oTargetObject As Object, dSelectedDate As Date, bDateSelectionRequired As Boolean, sDatePickerTitle As String

Public Property Let SelectedDate(dVal As Date)
    dSelectedDate = dVal
End Property

Public Property Get SelectedDate() As Date
    SelectedDate = dSelectedDate
End Property

Public Property Set TargetObject(oObj As Object)
    Set oTargetObject = oObj
End Property

Public Property Let DateSelectionRequired(ByVal bVal As Boolean)
    bDateSelectionRequired = bVal
End Property

Private Sub UserForm_Activate()
    Set oDatePickerForm = New clDatePickerForm
    With oDatePickerForm
        Set .DatePickerForm = Me
        Set .TargetObject = oTargetObject
        .DateSelectionRequired = bDateSelectionRequired
        .DatePickerTitle = sDatePickerTitle
        .DrawDatePicker
    End With
End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    If CloseMode <> 0 Or (CloseMode = 0 And bDateSelectionRequired = False) Then
        oDatePickerForm.TerminateCalendar
        Set oDatePickerForm = Nothing
        Set oTargetObject = Nothing
    Else
        MsgBox "Het is verplicht om een datum te kiezen!", vbInformation, "Afsluiten niet toegestaan"
        Cancel = True
    End If
End Sub

Daarna kan de datumkiezer als volgt aangeroepen worden:

Private Sub btnFillTextboxWithDate_Click()
    Load frmDatePicker
    With frmDatePicker
        Set .TargetObject = TxtBxDate
        .Show
    End With
End Sub

Voor het TargetObject kan op dit moment gekozen worden voor een Range, een TextBox of Label. Na het kiezen van een datum wordt deze vervolgens automatisch in het TargetObject gezet.

Het is ook mogelijk om de geselecteerde datum aan een variabele toe te kennen. Dat kan met de volgende aanroep:

Private Sub btnFillVBAVariableWithDate_Click()
    Dim dSelectedDate As Date
    frmDatePicker.Show
    dSelectedDate = frmDatePicker.SelectedDate
    If dSelectedDate <> 0 Then
        Unload frmDatePicker
    End If
End Sub

Configuratie opties algemeen

De DatumKiezer bevat diverse mogelijkheden om deze naar eigen wens in te richten. Hiervoor zijn diverse 'properties' beschikbaar die toegevoegd kunnen worden aan de code van UserForm_Activate. Het is daarbij van belang dat dit dan wordt toegevoegd direct voor de coderegel met .DrawDatePiacker. In het demo-bestand dat gedownload kan worden is te zien hoe deze opties gebruikt kunnen worden. De Datum Kiezer bevat momenteel de volgende instelmogelijkheden:

FirstDayOfWeek

Elke dag in de week kan gekozen worden die als eerste getoond wordt op de Datum Kiezer. Als dit niet ingesteld is, dan wordt de eerste dag volgens van de systeeminstellingen gebruikt.

ShowNotCurrentMonthDays

Hiermee kan worden ingesteld of bij de huidige maand ook de laatste dagen van de vorige of eerste dagen van de volgende maand uitgegrijsd zichtbaar moeten zijn. Standaard staat de optie op False. Als dagen van een andere maand zichtbaar zijn dan zijn deze ook selecteerbaar.

ShowWeekNumbers

Met deze instelling kan aangegeven worden of weeknummers op de kalender weergegeven moeten worden. Standaard staat deze optie uit. Als ShowWeekNumbers=True dan dan wordt het ISO weeknummer getoond en als FirstDayOfWeek een maandag is. Als FirstDayOfWeek een zondag is, dan wordt het Amerikaanse weeknummer getoond. Bij een andere waarde voor FirstDayOfWeek heeft ShowWeekNumbers geen effect en dan worden geen weeknummers getoond.

ShowColumnTitles

Hiermee kunnen dagaanduidingen boven de kolommen zichtbaar of onzichtbaar gemaakt worden. Standaard zijn kolom titels onzichtbaar.

DifferentlyColoredDays

Met DifferentlyColoredDays kan geconfigureerd worden welke dagen met aan afwijkende blauwe kleur moeten worden weergegeven in plaats van de standaard zwarte kleur. Het instellen van deze eigenschap gaat net iets anders dan bij andere eigenschappen. Als dagen een afwijkende kleur moeten krijgen dan kunnen deze hier opgegeven worden, waarbij bij meerdere dagen deze gescheiden moeten worden door een +teken. Het maakt niet uit in welke volgorde deze dagen opgegeven worden. Om bijvoorbeeld de weekenddagen een afwijkende kleur te geven kan de volgende aanroep gebruikt worden:

DifferentlyColoredDays = dpSaterday + dpSunday

DateFormatString

Met DateFormatString kan ingesteld worden hoe de tekstwaarde van de gekozen waarde weergegeven moet worden in een Label of TextBox. Dit moet een geldige formatstring zijn (bijv. "dd-mm-yyyy"). Standaard is deze string leeg en dan wordt gekozen datum als Date weggeschreven.

Configuratie opties per aanroep

Per aanroep van de kalender kunnen nog de volgende specifieke instellingen worden meegegeven.

DateSelectionRequired

Als DateSelectionRequired op true staat, dan is het kiezen van een datum verplicht en kan de datumkiezer niet afgesloten worden met het afsluitkruis rechtsboven op het formulier of met de ESC-toets. Standaard staat deze eigenschap ingesteld op false.

DatePickerTitle

De titel die op het formulier van de Datum Kiezer getoond moet worden kan ingesteld worden met DatePickerTitle. Standaard is dat de ingestelde caption van het datumkiezer formulier.

Toetsenbordbediening

De Datum Kiezer kan volledig met het toetsenbord bediend worden. De volgende toetsen kunnen daarbij gebruikt worden:

Tab en pijl rechts en links

Met de Tab en linker en rechter pijltjes toetsen kan van naar rechts of naar links genavigeerd worden over alle elementen van de datum kiezer.

PageUp en PageDown

Met PageUp en PageDown kan naar de volgende of vorige maand genavigeerd worden.

Shift + PageUp en PageDown

Met Shift + PageUp en PageDown kan naar het volgende of vorige jaar genavigeerd worden.

Spatiebalk en Enter

Met de spatiebalk of Enter-toets kan de actieve datum geselecteerd worden, waarna het formulier gesloten wordt. Dit is vergelijkbaar met een klik met de muis op een datum. Als de knoppen voor de vorige- of volgende maand de focus hebben kan met de spatiebalk of Enter-toets naar deze maand worden genavigeerd.

Esc

Met de Escape toets kan de Datum Kiezer afgesloten worden zonder een datum te selecteren, tenzij met de eigenschap DateSelectionRequired is ingesteld dat het kiezen van een datum verplicht is.

Demo bestand

Hieronder kan een volledig werkende demo versie van de Datum Kiezer gedownload worden.

Er staan nog meer updates van deze Datum Kiezer op de planning waarbij de gebruikersvriendelijkheid en mogelijkheden van de tool nog verder verbeterd worden, dus check deze pagina met enige regelmaat om te zien of er een nieuwe versie beschikbaar is.

Download de Datum Kiezer demo:
zip-19Datum kiezer 5.2
 

Vragen / suggesties

Hopelijk heeft dit artikel geholpen bij het gebruiken van deze Datum Kiezer. Als er verdere vragen over dit onderwerp zijn of suggesties voor verbetering, plaats dan een reactie hieronder.

arrow_up