Формирование списка задач на главной странице

Переходим к созданию главной страницы Планеро, на которой необходимо автоматически собирать и формировать актуальные задачи на выбранную дату со страниц "Проекты", "Отложенные", "Периодические". Что избавиться от ежедневного анализа соответствующих листов Планеро.

Так как имеется три листа, с которых необходимо делать выборку, то создадим отдельную функцию function obninfo(), дабы не дублировать один и тот же код.

' функция выборки актуальных задач со страниц "Проекты", "Отложенные", Периодическое"
' аргументы функции:
' str - название листа книги с которой необходимо производить выборку
' n - номер строки на главной странице, с которой необходимо производить запись
Function obninfo(str, k, kolz, n)
Set pr = Workbooks("planero.xlsm").Worksheets(str)' ссылка на лист с которого производим выборку
Set gl = Workbooks("planero.xlsm").Worksheets("Главная")' ссылка на лист "Главная"

i = 0' проход по странице Проекты (ищем до какой ячейки заполнены данные)
h = 0' проход вверх для поиска задачи
kolpz = 1

' проходим по листу str до тех пор, пока не встречаем пустую строку как по столбцу В, так и по столбцу С
Do While pr.Range("B3").Offset(i, 0) > 0 Or pr.Range("C3").Offset(i, 0) > 0
' проверяем, если текст в ячейке не зачеркнут и дата выполнения <= выбранной дате и не пустая
If pr.Range("D3").Offset(i, 0).Font.Strikethrough <> True And pr.Range("E3").Offset(i, 0).Value <= gl.Range("H8").Value And pr.Range("E3").Offset(i, 0).Value > 0 Then
' проходим вверх и ищем название задачи для данной подзадачи
h = 0
k2 = k
' если выборка делается с листов "Отложенные" или "Периодичекое" и т.к. подзадач на этих листах не бывает, соответственно выборку подзадачь задачи не делаем. Приравниваем переменную k2 к нулю и соответственно не запускаем цикл Do While k2 <= i
If str = "Отложенные" Or str = "Периодическое" Then k2 = 0
Do While k2 <= i
If pr.Range("B3").Offset(i - h, 0) > 0 Then
' ищем нет ли уже на странице главная такой задачи?
j = 0
da = 0
Do While j < k
If pr.Range("B3").Offset(i - h, 0) = gl.Range("B" & n).Offset(j, 0) Then
da = 1
Exit Do
End If
j = j + 1
Loop
If da = 0 Then
' добавляем задачу
gl.Range("A" & n).Offset(k, 0) = kolz
gl.Range("A" & n).Offset(k, 0).Font.Bold = True
gl.Range("B" & n).Offset(k, 0) = pr.Range("B3").Offset(i - h, 0)
gl.Range("B" & n).Offset(k, 0).Font.Bold = True
With gl.Range("B" & (k + n) & ":D" & (k + n))
.Merge
.HorizontalAlignment = xlLeft
.VerticalAlignment = xlTop
.WrapText = True
.RowHeight = 30
End With
gl.Range("E" & n).Offset(k, 0) = pr.Range("E3").Offset(i - h, 0)
gl.Range("F" & n).Offset(k, 0) = pr.Range("F3").Offset(i - h, 0)
gl.Range("G" & n).Offset(k, 0) = pr.Range("G3").Offset(i - h, 0)
gl.Range("H" & n).Offset(k, 0) = pr.Range("H3").Offset(i - h, 0)

If str = "Отложенные" Or str = "Периодическое" Then
gl.Range("I" & n).Offset(k, 0) = str & "," & i

With gl.Range("J" & n).Offset(k, 0)
.FormulaR1C1 = "Показать"
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.Font.Bold = True
.Borders(xlEdgeLeft).Weight = xlThin
.Borders(xlEdgeTop).Weight = xlThin
.Borders(xlEdgeBottom).Weight = xlThin
.Borders(xlEdgeRight).Weight = xlThin
.Borders(xlInsideVertical).Weight = xlThin
.Borders(xlInsideHorizontal).Weight = xlThin
.Interior.ThemeColor = xlThemeColorAccent1
.Interior.TintAndShade = 0.599993896298105
End With
End If

k = k + 1
kolz = kolz + 1
kolpz = 1
End If
Exit Do
End If
h = h + 1
Loop

' добавляем подзадачу
If pr.Range("D3").Offset(i, 0) > 0 Then
gl.Range("C" & n).Offset(k, 0) = kolpz
gl.Range("D" & n).Offset(k, 0) = pr.Range("D3").Offset(i, 0)
gl.Range("E" & n).Offset(k, 0) = pr.Range("E3").Offset(i, 0)
gl.Range("F" & n).Offset(k, 0) = pr.Range("F3").Offset(i, 0)
gl.Range("G" & n).Offset(k, 0) = pr.Range("G3").Offset(i, 0)
gl.Range("H" & n).Offset(k, 0) = pr.Range("H3").Offset(i, 0)
gl.Range("I" & n).Offset(k, 0) = str & "," & i

With gl.Range("J" & n).Offset(k, 0)
.FormulaR1C1 = "Показать"
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.Font.Bold = True
.Borders(xlEdgeLeft).Weight = xlThin
.Borders(xlEdgeTop).Weight = xlThin
.Borders(xlEdgeBottom).Weight = xlThin
.Borders(xlEdgeRight).Weight = xlThin
.Borders(xlInsideVertical).Weight = xlThin
.Borders(xlInsideHorizontal).Weight = xlThin
.Interior.ThemeColor = xlThemeColorAccent1
.Interior.TintAndShade = 0.599993896298105
End With

kolpz = kolpz + 1
k = k + 1
End If
End If
i = i + 1
Loop

With gl.Range("A" & n & ":H" & (k + n - 1))
.WrapText = True
.VerticalAlignment = xlTop
.Borders(xlEdgeLeft).Weight = xlThin
.Borders(xlEdgeTop).Weight = xlThin
.Borders(xlEdgeBottom).Weight = xlThin
.Borders(xlEdgeRight).Weight = xlThin
.Borders(xlInsideVertical).Weight = xlThin
.Borders(xlInsideHorizontal).Weight = xlThin
End With

gl.Columns("B:B").WrapText = False

gl.Cells(ActiveCell.Row, ActiveCell.Column - 2).Select
End Function

Добавляем кнопку «Обновить» в ячейку «J10» листа «Главная» и в процедуре Private Sub Worksheet_SelectionChange(ByVal Target As Range) реализуем макрос данной кнопки:

' Обновить
If ActiveCell.Column = 10 And Cells(ActiveCell.Row, ActiveCell.Column).Value = "Обновить" And ActiveCell.Row = 10 Then
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
' если диапазон > 0 - удаляем данные в выбранном диапазоне
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)
' записываем общее количество выбранных задач
gl.Range("A" & (n - 3)) = "Итого задач: " & (k - (kolz - b)) & " шт."
End If

Т.е. сначала удаляем ранее записанные данные, а после вызываем функцию obninfo() с передачей соответствующих аргументов. И напоследок записываем общее количество задач, которые необходимо выполнить в выбранную дату.

В заключении напишем макрос перехода к соответствующей задаче или подзадаче по нажатию на кнопку «Показать»:

' Показать
If Cells(ActiveCell.Row, ActiveCell.Column).Value = "Показать" And ActiveCell.Column = 10 Then ' получаем ссылку на лист и номер строки в виде "Отложенные,2"
k = Workbooks("planero.xlsm").Worksheets("Главная").Range("I" & ActiveCell.Row)
' убираем курсор с кнопки "Показать"
Workbooks("planero.xlsm").Worksheets("Главная").Range("A" & ActiveCell.Row).Select
' делаем активным лист, предварительно разделив строку k на две подстроки и взяв первую подстроку в качестве названия листа
Workbooks("planero.xlsm").Worksheets(Split(k, ",")(0)).Select
' выбираем соответствующую строку задачи
Workbooks("planero.xlsm").Worksheets(Split(k, ",")(0)).Cells(Split(k, ",")(1) + 3, 4).Select
End If

На итог получилось реализовать автоматическую выборку задач с листов «Проекты», «Отложенные», «Периодическое». И при изменении даты в ячейке «H2», на главной странице отобразятся соответствующие задачи и подзадачи на выбранную дату. Наглядно это выглядит следующим образом:

Выборка задач для главной страницы
Автоматическое формирование списка задач на главной странице

Следующим шагом реализуем вкладку «Архив», в которую будем автоматически перемещать выполненные задачи с листа «Отложенные».

Актуальная версия Планеро доступна по ссылке.

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

Сергей Поляк
14 сентября 2020 в 04:37
Попробую разобраться, я правда не особо силен в такого рода разработках, но, учиться ведь, никогда не поздно. Главное, что меня привлекает, это последующее удобство в использовании, я тоже люблю планировать свой день и стараюсь формировать задачи с вечера, но использую блокнот, теперь же, будем пробовать такой способ, тут смотрю, если правильно занести, все еще и нагляднее.
© планеро.ru