DatePicker

xlsb - bestand
AddIn bestand
Word bestand
     DatePicker

1   Datum in Excel werkblad

1.1   Optie in 'cel'menu
1.2   Datepicker: werking
1.3   DatePicker: elementen

2   Datum in Userform

2.1   DatePicker en controls
2.2   Datepicker: werking
2.3   Datepicker: elementen

3   Voorbeeldbestanden

DatePicker

MS heeft met ingang van Excel 2010 de 'DatePicker' uit VBA verwijderd.
Velen blijken die toch wel handig te vinden.

Hier zal ik een alternatief presenteren voor 2 situaties:
- de invoer van een datum in een werkblad van Excel
- de invoer van een datum in een veld in een VBA-Userform

1. Datum in Excel werkblad

1.1 Optie in 'cel'menu

In het voorbeeld voegt de code, wanneer het bestand geopend wordt, een optie toe aan het menu van de rechtermuisknop in een geselecteerde cel.
De optie heet: DatePicker.
Private Sub Workbook_Open()
With Application.CommandBars("Cell")
If .FindControl(1, , "Datepicker") Is Nothing Then
With .Controls.Add(1, , "Datepicker", , True)
.Tag = "Datepicker"
.Caption = "DatePicker"
.OnAction = "Z_Sheet1.M_snb"
End With
End If
End With
End Sub
Je kunt die optie verwijderen zodra je het bestand sluit:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
With Application.CommandBars("Cell")
If Not .FindControl(1, , "Datepicker") Is Nothing Then .Controls("Datepicker").Delete
End With
End Sub
Als je dat niet doet blijft de optie net zolang bestaan als je Excel geopend houdt.
Alle andere bestanden die je in Excel opent kunnen dan van deze optie in het 'cel'menu gebruik maken, ook al is het bestand met de DatePicker gesloten.
Pas als Excel als toepassing wordt gesloten komt de optie automatisch te vervallen.

1.2 Datepicker: werking

In de Datepicker kun je met een spinbutton een gewenste maand (eerder of later dan de huidige) selekteren.
Bij openen toont de DatePicker de huidige maand.
In de kopbalk staat het jaar en de naam van de maand.
De Datepicker toont 6 weken, waarbinnen de gekozen maand valt.
De huidige datum is rood gemarkeerd.
De eerste kolom toont het ISO-weeknummer.
Alleen de dagen van de gekozen maand kunnen worden geselecteerd: deze hebben een vet en groter lettertype dan de data in de voorafgaande en volgende maand.
Wanneer je met de muis over een van de dagen van de maand gaat, licht die blauw op. Zo weet je precies welke dag je muis markeert.
Met de linkermuisklik klik je op de gewenste datum. Die verschijnt dan in de actieve/geselecteerde cel.

1.3 Datepicker: elementen

Userform: UF_01

De Datepicker is gemaakt in een Userform met de naam UF_01.
Het Userform bevat:
- frame F_01 met alle DatePicker controls
- frame F_02 met alle 30 labels voor weekdagen
- frame F_03 met alle 12 labels voor weekenddagen
- 6 labels voor ISO weeknummers: w_0 .. w_6
- 7 labels voor weekdag-aanduidingen: L_50 .. L_56
- 1 label voor jaar- en maandaanduiding: L_60
- 1 spinbutton om per maand vooruit en terug te scrollen: S_month

Userformcode

Het Userform bevat 3 macro's:
- Initialize:
om de Userform-elementen aan de klassemodule C_cal te koppelen
Dim titels() As New C_cal

Private Sub UserForm_Initialize()
ReDim titels(41)

For j = 0 To UBound(titels)
If j < 7 Then Me("L_5" & j).Caption = Left(Format(j + 2, "ddd"), 1)

Set titels(j).v_titel = Me("L_" & Format(j, "00"))
Next

s_month_Change
End Sub
- Activate:
om het Userform bij de geselecteerde cel van het werkblad te positioneren
Private Sub UserForm_Activate()
Top = ActiveCell.Top + 72
Left = ActiveCell.Offset(, 1).Left + 12
End Sub
- S_month_Change:
om de gegevens in het userform aan te passen aan de gegevens van de gekozen maand.
* weergave jaar en naam van de maand
* weeknummer
* data in voorafgaande maand
* data in volgende maand
* weekdagen in de maand
* weekenddagen in de maand
* markering huidige datum
Sub s_month_Change()
X = DateSerial(Year(Date), Month(Date) + s_month.Value, 1)
L_60.Caption = Format(X, " yyyy" & vbTab & Space(6) & "mmmm")

For j = 0 To UBound(titels)
If j < 6 Then Me("w_" & j).Caption = DatePart("ww", X + 7 * j - Weekday(X + 7 * j, 2) + 4, 2, 2)

With titels(j).v_titel
Y = X - Weekday(X, 2) + Val(Right(.Name, 2)) + 1
.Caption = Day(Y)
.Enabled = Month(X) = Month(Y)
.Font.Size = 7 - .Enabled
.Font.Bold = .Enabled
.BackStyle = 0
.BackColor = vbCyan
If Format(Y, "yyyymmdd") = Format(Date, "yyyymmdd") Then
.BackColor = vbRed
.BackStyle = 1
End If
End With
Next
End Sub

Classmodule: C_cal

De klassemodule bevat 2 macro's:

- MouseMove
markering van een datum in de DatePicker als de muis erover heen gaat.
De naam van het element wordt opgeslagen in de Tag-eigenschap van het Userform.
Private Sub v_titel_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
With v_titel
Set UF = .Parent.Parent.Parent
If UF.Tag <> "" Then UF.Controls(UF.Tag).BackStyle = 0

If .BackColor <> vbRed And .Font.Size = 8 Then
.BackStyle = 1
UF.Tag = .Name
End If
End With
End Sub
- Click
plaatsing van de datum vanuit de DatePicker in de aktieve/geselecteerde cel
Private Sub v_titel_Click()
With v_titel
Set UF = .Parent.Parent.Parent
d00 = DateSerial(Year(Date), Month(Date) + UF.s_month.Value, .Caption)
End With

Select Case UF.Name
Case "UF_01"
ActiveCell = d00
UF.Hide
Case "UF_02"
UF.Controls(UF.F_01.Tag).Caption = d00
UF.F_01.Visible = False
End Select
End Sub

2. Datum in Userform

2.1 DatePicker en controls

Het Userform 'UF_02' illustreert een DatePicker/kalender in een Userform.
Userform 'UF_02' wordt getoond door de ActiveX-knop in het eerste werkblad.
De DatePicker bevindt zich in een onzichtbaar Frame 'F_01'.
Dat verschijnt zo gauw de gebruiker een van de controls aanklikt waarin een datum moet komen.
In het voorbeeldbestand staan 2 controls: 1 voor een aankomst- en 1 voor een vertrekdatum.
Het aantal datuminvoercontrols in een Userform is in principe onbeperkt.
De 'Click'-gebeurteniscode van de control toont het Frame 'F_01' met de DatePicker
Private Sub L_90_Click()
M_date L_90
End Sub
Deze gebeurteniscode roept een gezamenlijke macro M_date aan en geeft de naam 'L_90' van de control als argument door.

De macro M_date:
- maakt het Frame 'F_01' zichtbaar
- plaatst het Frame 'F_01' bij de aanroepende control

Sub M_date(it)
With F_01
.Top = it.Top - 30
.Left = it.Left + it.Width + 12
.Tag = it.Name
.Visible = True
End With
End Sub

2.2 Datepicker: werking

Zie hiervoor 1.2 Datepicker: werking

2.3 Datepicker: elementen

Er zijn 2 verschillen met de elementen van het Userform 'UF_01':
Userform 'UF_02' bevat geen Activate gebeurtenisprocedure.
In Userform 'UF_02 gaat het nl. om de positie van Frame 'F_01' ten opzichte van de aanroepende control.

De '_Click' macro in de Klassemodule is aangepast omdat het resultaat van de Datepicker in de aanroepende control terecht moet komen.
Bij Case "F_02" staat hoe de aanroepende control gevuld moet worden.
Case "UF_02"
UF.Controls(UF.F_01.Tag).Caption = d00
UF.F_01.Visible = False
Zie voor het overige: 1.3 Datepicker: elementen


3 Voorbeeldbestanden

Excel .xlsb bestand: DatePicker.xlsb

Dit bestand bevat alle hierboven beschreven code en funktionaliteiten.
Een .xlsb bestand is compacter dan een .xlsm bestand, maar qua functionaliteit identiek.
Als het bestand wordt geopend zijn de DatePicker-opties in werkblad en Userform beschikbaar.

Excel AddIn .xlam bestand: DatePicker.xlam

Het AddIn-bestand kan opgeslagen worden in de speciale Excel AddIn folder.
Te vinden met:
MsgBox Application.UserLibraryPath
Met de optie AddIns in het tabblad 'Developer/Ontwikkelaar' kan de installatie van de AddIn aangevinkt worden.
Excel laadt deze AddIn iedere keer als Excel wordt gestart.
Dan zijn de DatePicker-opties in werkblad en Userform beschikbaar voor alle geopende Excelbestanden.
De Datepicker voor het werkblad staat als optie in het rechtermuismenu van de aktieve cel.
De DatepPicker voor het Userform kun je starten met
Sub M_snb()
Application.Run "__VBA_datepicker.xlam!Z_sheet1.CommandButton1_Click"
End Sub

Word .docm bestand: DatePicker.docm

Het Wordbestand maakt van dezelfde DatePicker gebruik als de Excelbestanden.
Alleen de DatePicker voor een Userform is aanwezig.
Start het Userform met de knop in de tabel.
De resultaten van de DatePicker worden via documentvariabelen in het document gezet.