Элемент управления пользовательской формы DTPicker (поле с календарем), предназначенный для выбора и ввода даты. Примеры кода VBA Excel с DTPicker.
UserForm.DTPicker – это элемент управления пользовательской формы, представляющий из себя отформатированное текстовое поле с раскрывающимся календарем, клик по выбранной дате в котором записывает ее в текстовое поле.
При вызове календаря пользовательская форма теряет фокус – это видно на изображении. При редактировании даты непосредственно в текстовом поле DTPicker, формат поля позволяет изменять элементы даты (день, месяц, год) по отдельности.
Чтобы перемещаться между элементами даты, необходимо, или выбирать элемент мышью, или нажимать любой знак разделителя («.», «,» или «/») на клавиатуре. А клик по знаку «+» или «-», соответственно, увеличит или уменьшит значение элемента даты на единицу.
Если в элемент «год» ввести однозначное число или двузначное число, не превышающее двузначный остаток текущего года, через пару секунд автоматически добавятся первые две цифры текущего столетия (20). Если вводимое двузначное число превысит двузначный остаток текущего года, автоматически добавятся первые две цифры прошлого столетия (19).
DTPicker – это сокращение от слова DateTimePicker, не являющегося в VBA Excel ключевым словом, как и DatePicker.
Добавление DTPicker на Toolbox
Изначально на панели инструментов Toolbox нет ссылки на элемент управления DTPicker, поэтому ее нужно добавить самостоятельно.
Чтобы добавить DTPicker на панель инструментов Toolbox, кликните по ней правой кнопкой мыши и выберите из контекстного меню ссылку «Additional Controls…»:
В открывшемся окне «Additional Controls» из списка дополнительных элементов управления выберите строку «Microsoft Date and Time Picker Control»:
Нажмите кнопку «OK» и значок элемента управления DTPicker появится на панели инструментов Toolbox:
Свойства поля с календарем
Свойство | Описание |
---|---|
CalendarBackColor | Заливка (фон) календаря без заголовка. |
CalendarForeColor | Цвет шрифта чисел выбранного в календаре месяца. |
CalendarTitleBackColor | Заливка заголовка календаря и фон выбранной даты. |
CalendarTitleForeColor | Цвет шрифта заголовка (месяц и год) и выбранного в календаре числа. |
CalendarTrailingForeColor | Цвет шрифта чисел предыдущего и следующего месяца. |
CheckBox | В значении True отображает встроенный в DTPicker элемент управления CheckBox. По умолчанию – False. |
ControlTipText | Текст всплывающей подсказки при наведении курсора на DTPicker. |
CustomFormat | Пользовательский формат даты и времени. Работает, когда свойству Format присвоено значение dtpCustom (3). |
Day (Month, Year) | Задает или возвращает день (месяц, год). |
DayOfWeek | Задает или возвращает день недели от 1 до 7, отсчет начинается с воскресенья. |
Enabled | Возможность раскрытия календаря, ввода и редактирования даты/времени. True – все перечисленные опции включены, False – выключены (элемент управления становится серым). |
Font | Шрифт отображаемого значения в отформатированном поле элемента управления. |
Format | Формат отображаемого значения в поле элемента управления DTPicker, может принимать следующие значения: dtpCustom (3), dtpLongDate (0), dtpShortDate (1) (по умолчанию) и dtpTime (2). |
Height | Высота элемента управления DTPicker с нераскрытым календарем. |
Hour (Minute, Second) | Задает или возвращает часы (минуты, секунды). |
Left | Расстояние от левого края внутренней границы пользовательской формы до левого края элемента управления. |
MaxDate | Максимальное значение даты, которое может быть выбрано в элементе управления (по умолчанию – 31.12.9999). |
MinDate | Минимальное значение даты, которое может быть выбрано в элементе управления (по умолчанию – 01.01.1601). |
TabIndex | Определяет позицию элемента управления в очереди на получение фокуса при табуляции, вызываемой нажатием клавиш «Tab», «Enter». Отсчет начинается с нуля. |
Top | Расстояние от верхнего края внутренней границы пользовательской формы до верхнего края элемента управления. |
UpDown | Отображает счетчик вместо раскрывающегося календаря. True – отображается SpinButton, False – отображается календарь (по умолчанию). |
Value | Задает или возвращает значение (дата и/или время) элемента управления. |
Visible | Видимость поля с календарем. True – DTPicker отображается на пользовательской форме, False – DTPicker скрыт. |
Width | Ширина элемента управления DTPicker с нераскрытым календарем. |
DTPicker – это сокращение от слова DateTimePicker, не являющегося в VBA Excel ключевым словом, как и DatePicker.
Примеры кода VBA Excel с DTPicker
Программное создание DTPicker
Динамическое создание элемента управления DTPicker с помощью кода VBA Excel на пользовательской форме с любым именем:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
Private Sub UserForm_Initialize() Dim myDTPicker As DTPicker With Me .Height = 100 .Width = 200 ‘Следующая строка создает новый экземпляр DTPicker Set myDTPicker = .Controls.Add(«MSComCtl2.DTPicker», «dtp», True) End With With myDTPicker .Top = 24 .Left = 54 .Height = 18 .Width = 72 .Font.Size = 10 End With Set myDTPicker = Nothing End Sub |
Данный код должен быть размещен в модуле формы. Результат работы кода:
Применение свойства CustomFormat
Чтобы задать элементу управления DTPicker пользовательский формат отображения даты и времени, сначала необходимо присвоить свойству Format значение dtpCustom. Если этого не сделать, то, что бы мы не присвоили свойству CustomFormat, будет применен формат по умолчанию (dtpShortDate) или тот, который присвоен свойству Format.
В данном примере создается пользовательский формат для полей с календарем DTPicker1 и DTPicker2, размещенных на пользовательской форме, и отображаются в них текущие дата и время.
Private Sub UserForm_Initialize() With DTPicker1 .Format = dtpCustom .CustomFormat = «Год: yyyy; месяц: M; день: d» .Value = Now End With With DTPicker2 .Format = dtpCustom .CustomFormat = «Часы: H; минуты: m; секунды: s» .Value = Now End With End Sub |
Результат работы кода:
Таблица специальных символов и строк, задающих пользовательский формат даты и времени (регистр символов имеет значение):
Символы и строки | Описание |
---|---|
d | День месяца из одной или двух цифр. |
dd | День месяца из двух цифр. К числу из одной цифры впереди добавляется ноль. |
ddd | Сокращенное название дня недели из двух символов (Пн, Вт и т.д.). |
dddd | Полное название дня недели. |
h | Час из одной или двух цифр в 12-часовом формате. |
hh | Час из двух цифр в 12-часовом формате. К часу из одной цифры впереди добавляется ноль. |
H | Час из одной или двух цифр в 24-часовом формате. |
HH | Час из двух цифр в 24-часовом формате. К часу из одной цифры впереди добавляется ноль. |
m | Минута из одной или двух цифр. |
mm | Минута из двух цифр. К минуте из одной цифры впереди добавляется ноль. |
M | Месяц из одной или двух цифр. |
MM | Месяц из двух цифр. К месяцу из одной цифры впереди добавляется ноль. |
MMM | Сокращенное название месяца из трех символов. |
MMMM | Полное название месяца. |
s | Секунда из одной или двух цифр. |
ss | Секунда из двух цифр. К секунде из одной цифры впереди добавляется ноль. |
y | Год из одной или двух последних цифр. |
yy | Год из двух последних цифр. |
yyyy | Год из четырех цифр. |
Создание границ интервала дат
Простенький пример, как задать интервал дат с начала месяца до текущего дня с помощью двух элементов управления DTPicker:
Private Sub UserForm_Initialize() DTPicker1.Value = Now DTPicker1.Day = 1 DTPicker2.Value = Now End Sub |
Результат работы кода, запущенного 23.11.2020:
DTPicker – это сокращение от слова DateTimePicker, не являющегося в VBA Excel ключевым словом, как и DatePicker.
A calendar form can be used as an alternative to the date picker.
On a userform example, I used this calendar form to add dates to text boxes. When double-clicked on the textbox, the calendar form is displayed :
Private Sub txtDOTDate_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Call GetCalendar
End Sub
Sub GetCalendar()
dateVariable = CalendarForm.GetDate(DateFontSize:=11, _
BackgroundColor:=RGB(242, 248, 238), _
HeaderColor:=RGB(84, 130, 53), _
HeaderFontColor:=RGB(255, 255, 255), _
SubHeaderColor:=RGB(226, 239, 218), _
SubHeaderFontColor:=RGB(55, 86, 35), _
DateColor:=RGB(242, 248, 238), _
DateFontColor:=RGB(55, 86, 35), _
TrailingMonthFontColor:=RGB(106, 163, 67), _
DateHoverColor:=RGB(198, 224, 180), _
DateSelectedColor:=RGB(169, 208, 142), _
TodayFontColor:=RGB(255, 0, 0))
If dateVariable <> 0 Then frmflightstats.txtDOTDate = dateVariable
End Sub
Source of template
We often use VBA userforms to enter data. These userforms contain
various types of controls such as combo boxes, textboxes, command
buttons etc. Among them textboxes are a commonly used control type in
userforms. So today I am going to explain you a cool trick you can use
in VBA textboxes. This will be very useful when you use text boxes to
input dates. we can enter dates in various formats such as
dd/mm/yyyy, mm/dd/yyyy, mm/dd/yy etc. but there are situations where
we need to tell our user to enter date in only particular format. So
how we can give this message to our users. We can do it simply
like this
When you show the form you can put date format inside the textbox. This can be done by assigning the relevant value to textbox in userform’s initialise event. Below is the code you can use for that.
Private Sub UserForm_Initialize()
txtStart.Value = «DD/MM/YYYY»
End Sub
But it will be a little difficult if user need to delete this value every time he or she want to enter a date. Then your application won’t be user friendly. So the best thing is to find a way to clear the textbox when user click on it. We can do this easily using textbox MouseDown event. Here below is the code you can use for that.
Private Sub txtStart_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
If StrComp(txtStart.Value, «DD/MM/YYYY», vbTextCompare) = 0 Then
txtStart.Value = «»
End If
End Sub
I will explain you why I have used if statement here. Sometimes user can unintentionally click on the textbox after entering the correct date. And sometimes user may need to correct a part of the date if he or she has entered it incorrectly. Because of that, we need to check the current value of the text box before clear it. So that’s why I have used a if statement before clear the value. Then it will clear the value of the textbox only if it find DD/MM/YYYY.
Date Picker Calendar in Excel VBA
Oftentimes, users want to click a button and select a date. This is no different for Excel developers. Check out this ActiveX control by Microsoft that allows users to do just that. It’s a little old school looking, but actually has quite a nice feel to it.
Start by creating a userform and enabling the control by Right-clicking on the Tools menu and click Add additional tools
Now, let’s add this to the userform!
In the downloadable workbook, you’ll see the control was renamed to ‘fCal’. When you double-click the control you’ll see the following code which is the DateClick event of that control:
code snippet
This userform cleverly has two labels to store relevant info on the Userform that summoned it. 1.) The name of the userform that called it and 2.) The name of the control or textbox that needs the date sent to it.
Then, this code above loops through all userforms in your project until it finds one that matches the label for the Userform (lblUF) and the label for the textbox needed (lblCtrlName).
Also, you may need to enable Microsoft Windows Common Controls -2 6.0 (SP6) by using Tools->References and clicking:
s
Stop Wasting Your Time
Experience Ultimate Excel Automation & Learn to “Make Excel Do Your Work For You”
s
Watch Us Make a Calendar In Excel On YouTube:
This website uses cookies to improve your experience. We’ll assume you’re ok with this, but you can opt-out if you wish. Cookie settingsACCEPT
Wait A Second!
Thank you for visiting! Here’s a FREE gift for you!
Enroll In My FREE VBA Crash Course For FREE!
Learn how to write macros from scratch, make buttons and simple procedures to automate tasks.
iba2004 Пользователь Сообщений: 1034 |
Здравствуйте! |
Daulet Пользователь Сообщений: 626 |
Private Sub TextBox_SearchText_Exit(ByVal Cancel As MSForms.ReturnBoolean) If .Value Like «##.##.####» = True And IsDate(.Value) = True Then |
Юрий М Модератор Сообщений: 60588 Контакты см. в профиле |
{quote}{login=iba2004}{date=22.09.2012 07:31}{thema=Заполнение TextBox в UserForm в формате дата}{post}Я понимаю, что проще, наверное, вывести MsgBox…{/post}{/quote}Проще при клике по TextBox вызывать календарь, при помощи которого заполнять TextBox — исключаем ошибки. |
iba2004 Пользователь Сообщений: 1034 |
2 ABC 2 Юрий М |
Юрий М Модератор Сообщений: 60588 Контакты см. в профиле |
Небольшой пример на основе календаря из стандартных элементов (автор календаря Слэн). |
iba2004 Пользователь Сообщений: 1034 |
2 ABC |
iba2004 Пользователь Сообщений: 1034 |
2 Юрий М |
iba2004 Пользователь Сообщений: 1034 |
2 Юрий М |
Юрий М Модератор Сообщений: 60588 Контакты см. в профиле |
Только там нужно будет добавить проверку на тот случай, если пользователь закрыл календарь крестиком. Вот в этом случае выдавать предупреждение. |
iba2004 Пользователь Сообщений: 1034 |
2 Юрий М |
Юрий М Модератор Сообщений: 60588 Контакты см. в профиле |
Если правильно понял вопрос: правый клик по форме — Tab Order и перемещайте контролы в нужной очерёдности. Ещё можно поменять в свойствах каждого контрола его TabIndex, но это дольше. Если нужно принудительно на какой-то операции, то НужныйКонтрол.SetFocus |
iba2004 Пользователь Сообщений: 1034 |
2 Юрий М |
iba2004 Пользователь Сообщений: 1034 |
Вот! Написал симбиоз!!! Ещё раз Спасибо АВС и Юрию. Я использовал помощь обоих. Если кому нужно, не стесняйтесь, берите файл. Но м.б. будут найдены какие-то недостатки. Удачи! |
Daulet Пользователь Сообщений: 626 |
попробуйте так Private Sub UserForm_Activate() |
iba2004 Пользователь Сообщений: 1034 |
2 ABC |
iba2004 Пользователь Сообщений: 1034 |
Ещё раз выклыдываю файл, теперь в архиве. На радостях не обратил внимания, что он на 3 кило тяжелее, оговоренных Правил |
Daulet Пользователь Сообщений: 626 |
когда ТекстБокс пуст, календарь показывает сегодняшний день |
iba2004 Пользователь Сообщений: 1034 |
2 ABC |
Юрий М Модератор Сообщений: 60588 Контакты см. в профиле |
1. Запретить вообще ввод с клавиатуры (раз уж используем календарь). |
iba2004 Пользователь Сообщений: 1034 |
2 Юрий М |
Юрий М Модератор Сообщений: 60588 Контакты см. в профиле |
«Шеф сказал — пусть будет уголовник» (с) |
Guest Гость |
#22 23.09.2012 15:57:25 2 Юрий М |