#excel #vba
Вопрос:
Я собираю панель мониторинга и хотел бы показать, когда состоится следующая запланированная встреча в ячейке B6, на основе другого листа («Планирование и деятельность»). Поскольку в процессе может быть несколько встреч, я использую функцию MIN для возврата ближайшей даты на сегодняшний день (записей до СЕГОДНЯШНЕГО ДНЯ не будет, так что не беспокойтесь об этом).
Если запланированных встреч нет, я хочу, чтобы он возвращал текст «Не запланировано».
Я начал с использования {=MIN(IF(PlanningActivity="Meeting",PlanningDeadline))}
(Деятельность по планированию-столбец A, а строка планирования-столбец B).
Это эффективно делает то, что я хочу, за исключением, конечно, случаев, когда не запланировано никаких встреч. Затем он возвращает 0 для даты или 00 января 1900 года.
Поэтому я подумал, что поместил бы это в другое «ЕСЛИ», по сути, сказав, что если действительно есть какие-либо ячейки с надписью «Встреча», то найдите минимальное значение. Если их нет, то верните «Не запланировано».
Что-то вроде этого: =IF(PlanningActivity="Meeting",MIN(IF(PlanningActivity="Meeting",PlanningDeadline)),"Not Scheduled")
В какой-то момент это сработало. И я не уверен, как/почему, потому что сейчас этого нет.
Я думаю, что в долгосрочной перспективе это будет лучше проходить через vba.
Это то, что я набросал, но я знаю, что это не совсем правильно, и я не знаю, как заставить его вернуться «Не запланировано», если не запланировано никаких встреч.
Sub NextMeeting()
Dim i_Planning_Activity_tbl As Integer, i_next_meeting As Integer
Dim str1 As String
Sheets(“Dashboard”).Select
i_next_meeting = Cells(5,”B”)
Sheets(“Planning amp; Admin”).Select
i_Planning_Activity_tbl = Cells(rows.Count,”B”).End(x1Up).Row
str1 = Sheets(“Planning amp; Admin”).Cells(rows.Count,”A”).Value
If str1 = “Meeting” Then
minDate=Application.Min(Range(“B:B”))
End Sub
Подводя итог, мне нужен этот код для:
- На листе «Планирование и администрирование» Найдите любую ячейку, содержащую «Собрание» в A, а затем верните ближайшую дату из B, указав ответ в B6 на листе «Панель мониторинга».
- Если встречи не запланированы, заполните поле B6 «Не запланировано».
Примеры Данных:
Комментарии:
1. Попробуйте заменить это:
MIN(IF(PlanningActivity="Meeting",PlanningDeadline))
на:IF(PlanningActivity="Meeting",MIN(PlanningActivity,PlanningDeadline), "Not Scheduled")
2. Привет, Мацей, спасибо за предложение. Я попробовал это сейчас, и он постоянно возвращает «Не запланировано», даже когда запланированы встречи.
3. Можете ли вы поделиться образцами данных? Было бы проще помочь вам…
4. Предложение: В отдельном модуле кода определите
NextMeeting(range)
как функцию с диапазоном, содержащим ваш список встреч в качестве параметра. Запрограммируйте логику для работы с диапазоном, чтобы найти ближайшую встречу с датой-или нет — и возвращает либо дату, либо текст, в зависимости от того. Затем вызовите эту функцию в ячейку B6 панели мониторинга с соответствующим диапазоном в разделе Планирование и администрирование в качестве параметра. Я думаю, что это сделало бы вашу логику немного более простой и позволило бы избежать жесткого кодирования диапазонов.
Ответ №1:
Вы можете использовать формулу массива для такого требования:
=IF(MIN(IF($A$2:$A$7="Meeting",$B$2:$B$7,""))=0,"Not Scheduled", MIN(IF($A$2:$A$7="Meeting",$B$2:$B$7,"")))
Вам нужно принять эту формулу, используя клавиши: SHFT
ENTER
.
Как видите, результат правильный.
Примечание: я использую польскую версию MS Office, поэтому я должен использовать стандартную запись даты ISO ( yyyy-MM-dd
).
Подробнее на: Рекомендации и примеры формул массива
Комментарии:
1. Это помогает вернуть ближайшую дату, когда организуются встречи. Однако, когда собраний нет, он возвращается в 00 января 1900 года, а не «Не по расписанию».
2. Бинго. Спасибо.
Ответ №2:
Лучший способ решить вашу проблему-просто использовать функцию MINIFS (). Нет необходимости использовать VBA для чего-то, что можно легко сделать с помощью готовых функций на самом рабочем листе.
Предполагая, что данные хранятся в таблице под названием «Планирование активности» на любом листе той же книги, а критерии активности «Соответствуют», как показано на следующем рисунке:
Затем используйте следующее уравнение на листе панели мониторинга:
=ЕСЛИ(МИНИФЫ(Активность планирования[Дата],Активность планирования[Активность планирования],»Встреча»)=0, «Не запланировано», МИНИФЫ(Активность планирования[Дата],Активность планирования[Активность планирования],»Встреча»))
Это сработает как заклинание.
Ответ №3:
Вот функция на основе VBA, которая вернет самое раннее собрание из списка. Единственным параметром является таблица из 2 столбцов, в которой содержится ваш список действий (который может быть именованным диапазоном).
Вызовите эту функцию в ячейке B6 панели =NextMeeting(...)
мониторинга, ссылаясь на таблицу действий. Вы можете использовать эту функцию в любом месте электронной таблицы.
Option Explicit
Const NO_MEETINGS = 500000
Function NextMeeting(rMeetings)
NextMeeting = "Not Scheduled"
Dim irow As Integer
Dim NextMeetingDate As Date
NextMeetingDate = NO_MEETINGS
For irow = 1 To rMeetings.Rows.Count
With rMeetings.Rows(irow)
If LCase(.Cells(1, 1).Value) = "meeting" Then
If .Cells(1, 2).Value < NextMeetingDate Then
NextMeetingDate = .Cells(1, 2)
End If
End If
End With
Next irow
If NextMeetingDate < NO_MEETINGS Then
NextMeeting = NextMeetingDate
End If
End Function