Suggesties |
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 |
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 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")
End SubIf .FindControl(1, , "Datepicker") Is Nothing Then
End WithWith .Controls.Add(1, , "Datepicker", , True)
End If.Tag = "Datepicker"
End With.Caption = "DatePicker" .OnAction = "Z_Sheet1.M_snb" Private Sub Workbook_BeforeClose(Cancel As Boolean)
With Application.CommandBars("Cell")
End SubIf Not .FindControl(1, , "Datepicker") Is Nothing Then .Controls("Datepicker").Delete
End WithAlle 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. 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. Userform: UF_01De 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)
End SubFor j = 0 To UBound(titels) If j < 7 Then Me("L_5" & j).Caption = Left(Format(j + 2, "ddd"), 1)
NextSet titels(j).v_titel = Me("L_" & Format(j, "00")) s_month_Change om het Userform bij de geselecteerde cel van het werkblad te positioneren
Private Sub UserForm_Activate()
Top = ActiveCell.Top + 72
End SubLeft = ActiveCell.Offset(, 1).Left + 12 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)
End SubL_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)
NextWith titels(j).v_titel Y = X - Weekday(X, 2) + Val(Right(.Name, 2)) + 1
End With.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
End If.BackStyle = 1 Classmodule: C_calDe 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
End SubSet UF = .Parent.Parent.Parent
End WithIf UF.Tag <> "" Then UF.Controls(UF.Tag).BackStyle = 0 If .BackColor <> vbRed And .Font.Size = 8 Then .BackStyle = 1
End IfUF.Tag = .Name plaatsing van de datum vanuit de DatePicker in de aktieve/geselecteerde cel
Private Sub v_titel_Click()
With v_titel
End SubSet UF = .Parent.Parent.Parent
End Withd00 = DateSerial(Year(Date), Month(Date) + UF.s_month.Value, .Caption) Select Case UF.Name Case "UF_01" ActiveCell = d00
Case "UF_02"UF.Hide UF.Controls(UF.F_01.Tag).Caption = d00
End SelectUF.F_01.Visible = False 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 SubDe 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
End Sub.Top = it.Top - 30
End With.Left = it.Left + it.Width + 12 .Tag = it.Name .Visible = True 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 Excel .xlsb bestand: DatePicker.xlsbDit 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.xlamHet AddIn-bestand kan opgeslagen worden in de speciale Excel AddIn folder.Te vinden met: MsgBox Application.UserLibraryPath 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 SubWord .docm bestand: DatePicker.docmHet 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. |