Выбор даты формирования задач на календаре

Раз пошла речь про автоматизацию рутинных действий, обратим внимание на выбор даты «задачи по состоянию на» на главной странице. Сейчас необходимую дату приходится вписывать вручную, заходя в формулу «=СЕГОДНЯ()» плюсуя необходимое количество дней, либо полностью писать дату в ручную, тем самым удаляя формулу «=СЕГОДНЯ()». Соответственно при открытии Планеро на следующий день - нужно заново править дату. При этом хочется наглядности, графически видеть выходные и будни. В общем, сейчас выбор даты сделан неудобно.

Для удобства необходимо реализовать следующее:

Итоговый вариант будет выглядеть следующим образом:

Отобразить актуальные задачи по состоянию на выбранную дату
Выбор даты отображения задач на главной странице

А теперь по порядку. Начнем с создания пользовательской формы, на которой разместим: календарь, кнопки перелистывания дат (влево, вправо), кнопку текущей даты и кнопку закрыть (отмены выбора даты).

форма выбора даты
Пользовательская форма выбора даты «задачи по состоянию на»

Как и в статье «Работа с выполненными задачами на листе периодическое» используя функцию calendar, выведем дни месяца на пользовательскую форму, чтобы получить следующее:

форма выбора даты с календарем
Отображение календаря на пользовательской форме

Теперь добавим на главной странице в шестой сроке текущую дату.

А при нажатии на ячейку «H8» реализуем появление формы выбора даты, добавив следующий код в процедуру Private Sub Worksheet_SelectionChange(ByVal Target As Range) на главной странице.

' Задачи по состоянию на
If ActiveCell.Row = 8 And ActiveCell.Column = 8 Then
' отобразить форму
UserForm5.Show
' убрать курсор с даты
Workbooks("planero.xlsm").Worksheets("Главная").Range("A10").Select
End If

На календаре оранжевым цветом подсвечивается текущая дата, но для удобства восприятия информации также подсветим зеленым цветом дату «задачи по состоянию на», которая может отличаться от текущей. С этой целью немного доработаем функцию calendar, находящуюся в Module1, поместим в следующий код:

' определяем координаты изменяемой даты
If formN.Name = "UserForm1" Or formN.Name = "UserForm5" Then
If Format(Cells(ActiveCell.Row, ActiveCell.Column), "dd mm yyyy") = Format(den & "." & Month(data) & "." & Year(data), "dd mm yyyy") Then
i3 = i
j3 = j
End If
End If

' выделяем ранее выбранную дату
If (formN.Name = "UserForm1" Or formN.Name = "UserForm5") And i3 > 0 And j3 > 0 Then
With formN.Controls(mylabel & "_" & i3 & "_" & j3)
.BackColor = RGB(204, 255, 204)
.BorderColor = RGB(150, 150, 150)
.ForeColor = RGB(0, 0, 0)
End With
End If

Данный код получает дату из активной ячейки, т.е. H8 на главной странице, т.к. именно она вызвала инициализацию пользовательской формы и сравнивает с датой формируемого календаря. При совпадении, находит координаты даты и подсвечивает зеленым. В общем, результат будет следующим:

Дата 25.10.2020, сегодня, на календаре имеет оранжевый цвет. А дата 29.10.2020, «задачи по состоянию на», светло зеленый.

Теперь реализуем возможность выбора необходимой даты на календаре, для этого в форму добавим функцию Set_On_Off, которая будет записывать выбранную дату в ячейку H8:

' функция выбора даты на календаре
Function Set_On_Off(mylabel, i2 As Integer, j2 As Integer, n As Byte)
' если пользователь нажимает нажимает дату не имеющую числа - выходим из функции
If UserForm5.Controls(mylabel & "_" & i2 & "_" & j2).Caption <> True Or UserForm5.Controls(mylabel & "_" & i2 & "_" & j2).Caption <= 0 Then Exit Function

' убираем выделение со всех дат, т.е. числа делаем белыми
For i = 1 To 6
For j = 1 To 7
With UserForm5.Controls("p_" & i & "_" & j)
.BackColor = RGB(255, 255, 255)
.BorderColor = RGB(255, 255, 255)
.ForeColor = RGB(0, 0, 0)
End With
With UserForm5.Controls("t_" & i & "_" & j)
.BackColor = RGB(255, 255, 255)
.BorderColor = RGB(255, 255, 255)
.ForeColor = RGB(0, 0, 0)
End With>
With UserForm5.Controls("n_" & i & "_" & j)
.BackColor = RGB(255, 255, 255)
.BorderColor = RGB(255, 255, 255)
.ForeColor = RGB(0, 0, 0)
End With
Next j
Next i

' Выделить выбранную дату зелем
With UserForm5.Controls(mylabel & "_" & i2 & "_" & j2)
.BackColor = RGB(204, 255, 204)
.BorderColor = RGB(150, 150, 150)
.ForeColor = RGB(0, 0, 0)
End With

' записываем выбранную дату в ячейку H8
Workbooks("planero.xlsm").Worksheets("Главная").Range("H8") = CDate(Format(UserForm5.Controls(mylabel & "_" & i2 & "_" & j2).Caption & " " & UserForm5.Controls(mylabel & "Month").Caption, "dd.mm.yyyy"))

' скрываем форму выбора даты
Unload UserForm5
End Function

После напишем процедуры для ранее добавленных на пользовательскую форму кнопок.

Кнопка «Закрыть» - просто закрывает форму:

' кнопка закрыть
Private Sub CommandButton5_Click()
' скрываем форму
Unload UserForm5
End Sub

Кнопка «Текущая дата» - добавляем в ячейку H8 функцию «=СЕГОДНЯ()» для отображения актуальной даты при следующем открытии Планеро.

' кнопка "текущая дата"
Private Sub CommandButton4_Click()
' копируем функцию "=СЕГОДНЯ()" из ячейки H6 в ячейку H8
With Workbooks("planero.xlsm").Worksheets("Главная")
.Range("H6").Copy
.Range("H8").Select
ActiveSheet.Paste
End With
' убираем выделение ячейки H6
Application.CutCopyMode = False
' скрываем форму
Unload UserForm5
b = Module1.ob_zad_gl()
End Sub

Кнопка «>» - перелистывает календарь на три месяца вперед.

' кнопка ">" - перелистнуть календарь на три месяца вперед
Private Sub CommandButton1_Click()
skmes = skmes + 3
aMonth = Array("Январь", "Февраль", "Март", "Апрель", "Май", "Июнь", "Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь", "Декабрь")
Dim tekMonth As Byte
data = DateAdd("m", skmes, Date)
tekMonth = Month(data)
UserForm5.pMonth.Caption = aMonth(tekMonth - 1) & " " & Year(data)
If tekMonth = 12 Then UserForm5.tMonth.Caption = aMonth(0) & " " & Year(DateAdd("yyyy", 1, data))
If tekMonth < 12 Then UserForm5.tMonth.Caption = aMonth(tekMonth) & " " & Year(data)
If tekMonth = 11 Then UserForm5.nMonth.Caption = aMonth(0) & " " & Year(DateAdd("yyyy", 1, data))
If tekMonth < 11 Then UserForm5.nMonth.Caption = aMonth(tekMonth + 1) & " " & Year(data)

oneDada = DateAdd("d", (-Day(data) + 1), data)
If Date = data Then
Call Module1.calendar(UserForm5, "p", oneDada, 1)
Else
Call Module1.calendar(UserForm5, "p", oneDada, 0)
End If
Call Module1.calendar(UserForm5, "t", DateAdd("m", 1, oneDada), 0)
Call Module1.calendar(UserForm5, "n", DateAdd("m", 2, oneDada), 0)
End Sub

Для кнопки «<», перелистывание календаря на три месяца назад, макрос аналогичный за исключением переменно skmes = skmes - 3

И заключительным аккордом необходимо реализовать автоматическое формирование актуальных задач по состоянию на выбранную дату. Для этого в module1 создадим функцию ob_zad_gl, которую будем вызывать при изменении даты (т.е. в процедурах Set_On_Off и CommandButton4_Click), а также при нажатии кнопки «Обновить» (процедура Worksheet_SelectionChange(ByVal Target As Range) кнопка) на главной странице.

' запуск функции обновления данных на главной странице
Function ob_zad_gl()
Workbooks("planero.xlsm").Worksheets("Главная").Range("A9") = "Подождите... Выполняю поиск задач по состоянию на " & Workbooks("planero.xlsm").Worksheets("Главная").Range("H8")

k = 0
n = 12
kolz = 1
' удаляем ранее добавленные задачи и подзадачи
Set gl = Workbooks("planero.xlsm").Worksheets("Главная")
i = 0
Do While gl.Range("B" & n).Offset(i, 0) > 0 Or gl.Range("C" & n).Offset(i, 0) > 0
i = i + 1
Loop
If i > 0 Then gl.Rows(n & ":" & (i + n - 1)).Delete Shift:=xlUp

br = obninfo("Отложенные", k, kolz, n)
br = obninfo("Периодическое", k, kolz, n)
b = kolz
br = obninfo("Проекты", k, kolz, n)
Workbooks("planero.xlsm").Worksheets("Главная").Range("A9") = "Итого задач: " & (k - (kolz - b)) & " шт."
End Function

Ну и для пущей красоты применим условное форматирование со светло-красной заливкой к ячейке A9, если она содержит текст «Подождите».

Актуальную версию Планеро, в том числе с вышеописанными возможностями, можно скачать тут.

Поделись с друзьями:
Комментарии 2

© планеро.ru