Excel: Проблема с использованием MIN в IF — В поисках решения vba

#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