VBA Excel [Всі версії] - Календарний контроль

VBA Excel [Всі версії] - Календарний контроль

Вступ

Керування календарем VBA змінилося між Excel 2003 і Excel 2010. Старі версії мають елемент керування, який називається " Календар ", а для нових версій його називають контролем " DT Picker ". Проблеми сумісності можуть виникнути під час використання:
  • робочі книги з керуванням Calendar на нових версіях Excel
  • книги з DT Picker на попередній версії Excel.

Інша проблема полягає у використанні версії Microsoft Office. Деякі корпоративні конфігурації не дозволяють отримати доступ до елемента керування DT Picker. Щоб усунути це, я пропоную створити власний календарний календар, використовуючи Userform.

Форма користувача

Форма користувача буде містити:
  • 29 і 31 кнопки керування для "днів".
  • Етикетка "Вибір місяця".
  • 2 кнопки ("") для переміщення між місяцями.
  • Поточний місяць і рік відображатимуться в розділі "Підпис" (назва) форми користувача.
  • Всі елементи керування в цій UserForm будуть створені динамічно.

Починаємо

Відкрийте свій редактор VBA, створіть новий UserForm і змініть його властивість Name на "Calendrier".

Скопіюйте наведений нижче код у модуль UserForm:

 Параметр Явний Приватний підсектор UserForm_Initialize () Dim Obj як елемент керування Dim i як ціле, міс як ціле, annee як ціле число Dim Cl як Classe1 'Création Заміна l'ABEL Set Collect = Нова колекція Set Obj = Me.Controls.Add ("forms") .Label.1 ") З Obj .Name =" LbChoixMois ".Object.Caption =" Вибір: ".Left = 5.Top = 5. Ширина = 70 .Height = 10 Закінчити за допомогою" BOUTONS "Встановити Obj = Me. Controls.Add ("forms.CommandButton.1") З Obj .Name = "MoisPrec" .Object.Caption = "" .Left = 95 .Top = 1. Ширина = 20 .Height = 20 Закінчити з набором Cl = Нова класифікація1 Встановіть Cl.Bouton = Obj Collect.Add Cl 'Création введіть Jours de la semaine Для i = 1 до 7 Встановіть Obj = Me.Controls.Add ("forms.Label.1") З Obj .Name = "Jour" & i .Object.Caption = UCase (ліворуч (формат (DateSerial (2014, 9, i), "dddd"), 1)) .Лева = 20 * (i - 1) + 5 .Вгору = 25. Ширина = 20. = 10 Завершити з наступними i 'création boutons "jours" Mois = Місяць (дата) MoisEnCours = Mois Annee = Рік (Дата) AnneeEnCours = Annee СтворенняБутониПодорожі Mois, Annee Якщо ліворуч (формат (дата, "dd"), 1) = "0", тоді Me.Controls ("Bouton" & Format (дата, "d")). SetFocus Else Me.Controls ("Bouton" & Format (дата SetFocus End Sub 

Створіть кнопки

Кількість днів змінюється від одного місяця до іншого, тому ми створюватимемо їх динамічно. Для цього потрібна процедура:
  • Видаліть старі кнопки
  • Створюйте нові кнопки на основі місяця і року.

Створіть модуль (Вставити> Модуль) і скопіюйте нижній код:

 Опція Явна Публічна з подіями Bouton як MSForms.CommandButton Приватна підгрупа Bouton_Click () Вибір справи Bouton.Name Випадок "MoisPrec" MoisEnCours = MoisEnCours - 1 Якщо MoisEnCours = 0, то MoisEnCours = 12 AnneeEnCours = AnneeEnCours - 1 Якщо AnneeEnCours = 1899 Тоді MoisEnCours = 1 AnneeEnCours = 1900 MsgBox "Перший рік: 1900" Кінець, якщо закінчиться Якщо "MoisSuiv" MoisEnCours = MoisEnCours + 1 Якщо MoisEnCours = 13, то MoisEnCours = 1 AnneeEnCours = AnneeEnCours + 1 Кінець, якщо закінчити Вибір СтворенняБунтиЗапрошення 

Модулі класу

Нам потрібно створити модуль класу для роботи командних кнопок.

Для переміщення між місяцями:

 Опція Явна Публічна з подіями Btn As MSForms.CommandButton 'Виконайте пошук за допомогою клавіші "журнал" Приватний підпис Btn_Click () Dim maDate As Date maDate = CDate (Btn.Caption & "/" & Calendrier.Tag) "Активувати ефективний доступ до даних" "Вибрати дату вибору в ящику і файле:" ActiveCell.Value = maDate "Вивантажити підпис календаря MsgBox додати кінцеву версію" bouton par la souris Приватний підряд Btn_MouseMove (кнопка ByVal як ціле, ByVal Shift As Integer, ByVal X як єдиний, ByVal Y як єдиний) Dim maDate As Date maDate = CDate (Btn.Caption & "/" & Calendrier.Tag) EstJourFerie (maDate) Або Paques (Рік (maDate)) = maDate Тоді Btn.ControlTipText = QuelFerie (maDate) End Sub 

Модуль класу для днів

 Опція Явна Публічна з подіями Btn As MSForms.CommandButton 'Виконайте пошук за допомогою клавіші "журнал" Приватний підпис Btn_Click () Dim maDate As Date maDate = CDate (Btn.Caption & "/" & Calendrier.Tag) "Активувати ефективний доступ до даних" "Вибрати дату вибору в ящику і файле:" ActiveCell.Value = maDate "Вивантажити підпис календаря MsgBox додати кінцеву версію" bouton par la souris Приватний підряд Btn_MouseMove (кнопка ByVal як ціле, ByVal Shift As Integer, ByVal X як єдиний, ByVal Y як єдиний) Dim maDate As Date maDate = CDate (Btn.Caption & "/" & Calendrier.Tag) EstJourFerie (maDate) Або Paques (Рік (maDate)) = maDate Тоді Btn.ControlTipText = QuelFerie (maDate) End Sub 

Управління державними святами

У стандартному модулі, створеному раніше, ми додамо три функції для ідентифікації свят.

Функція, яка повертає свято як рядок

 "Fonction qui retourne le jour férié en" "Рядок" "утиліту пуску для інформаційних булерів у довільній функції Публічна функція QuelFerie (Jour As Date) як рядок Dim maDate As Date Dim a As Integer, m As Integer, j As Integer maDate = Paques (Рік (Jour)) Якщо Jour = maDate Потім QuelFerie = "Dimanche de Pâques": Вихід з функції Якщо Jour = CDate (maDate + 1) Тоді QuelFerie = "Lundi de Pâques": Вихід з функції Якщо Jour = CDate (maDate + 50) Потім QuelFerie = "Lundi de Pentecôte": Вихід з функції Якщо Jour = CDate (maDate + 39) Тоді QuelFerie = "Jeudi de l'ascension": Функція виходу a = Рік (Jour): m = Місяць (Jour): j = День (Jour) Вибір справи m * 100 + j Справа 101 QuelFerie = "1er Janvier": Вихід з випадку з функцією 501 QuelFerie = "1er Mai": Вихід з функції Case 508 QuelFerie = "8 травня": Вихід з функції 714 QuelFerie = " 14 Juillet ": Вихід з функції 815 QuelFerie =" 15 Août ": Вихід з функції 1101 QuelFerie =" 1er Novembre ": Вихід з функції 1111 QuelFerie =" 11 листопада ": Вихід з функції 1225 QuelFerie =" Noël ": Вихід з функції End End Select End 

Функція, яка ідентифікує державні свята

 'SOURCES:' //blog.developpez.com/philben/p11458/vba-access/sagit-il-dun-jour-ferie Загальнодоступна функція EstJourFerie (ByVal laDate As Date, необов'язковий ByVal EstPentecoteFerie як Boolean = True) як логічний 'Détermine ви можете переглядати цей аргумент, якщо ви не хочете: (101) 1: 1 - 1 травня - 501 = 1 вересня - 508 = 8 травня - 714 = 14 липня '815 = 15 жовтня - 1101 = 1 листопада - 1111 = 11 листопада - 1225 = 25 березня 'dPa = Lundi de Pâques - dAs = Юади де л'Аскенс - dPe = Lundi de Pentecôte' Remarque: Le lundi de Pentecôte не є членом Церкви (EstPentecoteFerie = False dans ce cas) 'Philben - v1.0 - 2012 - Безкоштовно використовувати статичні Annee як ціле, dPa як дата, dAs як дата, dPe як дата, bPe як булеві Dim a як ціле, m як ціле, j як ціле a = рік (laDate) : m = Місяць (laDate): j = День (laDate) Виберіть Випадок m * 100 + j Випадок 101, 501, 508, 714, 815, 1101, 1111, 1225 EstJourFerie = True Case 323 До 614 '323: Дата міні Lundi de Pâques - 614: Dat e maxi Lundi de Pentecôte Якщо Annee Або EstPentecoteFerie bPe Тоді Annee = a: dPa = Paques (a) + 1: dAs = dPa + 38 bPe = EstPentecoteFerie: Якщо bPe Тоді dPe = dPa + 49 Ще dPe = # 1/1 / 100 # Кінець Якщо вибрано Case DateSerial (a, m, j): Справа dPa, dAs, dPe: EstJourFerie = True: End Select End End 
Попередня Стаття Наступна Стаття

Кращі Поради