Почему поиск двух минимальных значений — частая задача в Excel
Работа с числовыми данными в Microsoft Excel часто требует анализа экстремальных значений — не только самого маленького, но и второго по величине. Например, при обработке результатов тестирования может понадобиться выделить двух аутсайдеров, а в финансовом отчёте — две наименьшие статьи расходов. Стандартная функция МИН возвращает только одно значение, что создаёт иллюзию ограниченности инструментов. На деле же в Excel существует как минимум 5 способов решить эту задачу — от элементарных формул до автоматизированных макросов.
Важно понимать, что подходы отличаются не только сложностью, но и гибкостью. Одни методы подойдут для статических данных, другие — для динамически обновляемых таблиц с тысячами строк. В этой статье мы разберём все варианты, включая малоизвестные функции НАИМЕНЬШИЙ и ИНДЕКС-ПОИСКПОЗ, а также покажем, как обойти типичные ошибки при работе с дубликатами или пустыми ячейками. Спойлер: самый надёжный способ для больших массивов данных — комбинация функций массива, но она требует знания синтаксиса формул CSE (вводимых через Ctrl+Shift+Enter).
Способ 1: Функция НАИМЕНЬШИЙ — самый простой вариант
Если вам нужно быстро найти два минимальных значения без углублённых знаний Excel, функция НАИМЕНЬШИЙ (англ. SMALL) станет идеальным решением. Она возвращает k-е наименьшее значение в диапазоне, где k — это порядковый номер (1 для минимума, 2 для второго минимума и т.д.). Синтаксис прост:
=НАИМЕНЬШИЙ(диапазон; k)
Пример: чтобы найти второе минимальное значение в столбце A1:A100, используйте:
=НАИМЕНЬШИЙ(A1:A100; 2)
- ✅ Плюсы: не требует дополнительных вычислений, работает во всех версиях Excel (начиная с 2007).
- ⚠️ Ограничения: если в диапазоне есть повторяющиеся минимальные значения, функция вернёт дубликат (например, дважды 5, если это минимальное значение встречается дважды).
- 📌 Совет: для визуального контроля используйте
Условное форматированиес правилом "Первые 2 значения" → "Самые маленькие".
⚠️ Внимание: ФункцияНАИМЕНЬШИЙигнорирует пустые ячейки и текстовые значения, но если в диапазоне есть ошибки (например,#ДЕЛ/0!), она вернёт ошибку. Чтобы этого избежать, оберните её вЕСЛИОШИБКА:
=ЕСЛИОШИБКА(НАИМЕНЬШИЙ(A1:A100; 2); "Нет данных")
Способ 2: Комбинация МИН + ЕСЛИ для динамических диапазонов
Когда данные обновляются часто или нужно учитывать дополнительные условия (например, игнорировать нулевые значения), приходит на помощь формула массива. Этот метод сложнее, но гибче: он позволяет найти второе минимальное значение с учётом фильтров. Базовая структура:
=МИН(ЕСЛИ(диапазон<>МИН(диапазон); диапазон))
Чтобы формула заработала, её нужно ввести как формулу массива:
- Введите формулу в ячейку.
- Нажмите
Ctrl+Shift+Enter(в Excel 365 простоEnter).
Пример для диапазона B2:B50 с игнорированием нулей:
=МИН(ЕСЛИ((B2:B50<>0)*(B2:B50<>МИН(B2:B50)); B2:B50))
Убедитесь, что в диапазоне нет текстовых значений|
Проверьте наличие дубликатов минимального значения|
Используйте Ctrl+Shift+Enter в Excel 2010-2019|
В Excel 365 формула работает без специального ввода
-->
| Сценарий | Формула | Примечание |
|---|---|---|
| Простое второе минимум | =МИН(ЕСЛИ(B2:B50<>МИН(B2:B50); B2:B50)) |
Требует CSE-ввода |
| Игнорировать нули | =МИН(ЕСЛИ((B2:B50<>0)*(B2:B50<>МИН(B2:B50)); B2:B50)) |
Подходит для финансовых данных |
| С условием (например, категория "A") | =МИН(ЕСЛИ((A2:A50="A")*(B2:B50<>МИН(ЕСЛИ(A2:A50="A"; B2:B50))); B2:B50)) |
Двойной CSE-ввод |
Способ 3: Функции ИНДЕКС и ПОИСКПОЗ для поиска позиций
Если вам мало самих значений и нужны их адреса в таблице (например, чтобы подсветить строки или извлечь связанные данные), используйте связку ИНДЕКС + ПОИСКПОЗ. Этот метод возвращает не только значения, но и их положение в массиве.
Алгоритм действий:
- Найдите первое минимальное значение:
=МИН(B2:B50). - Найдите его позицию:
=ПОИСКПОЗ(МИН(B2:B50); B2:B50; 0). - Исключите первую позицию и найдите второе значение:
=ИНДЕКС(B2:B50; НАИМЕНЬШИЙ(ЕСЛИ(B2:B50<>МИН(B2:B50); СТРОКА(B2:B50)-1); 1))
Критичный нюанс: если в данных есть дубликаты минимального значения, этот метод вернёт позицию первого встреченного дубликата второго минимума. Чтобы получить все позиции, потребуется макрос (см. Способ 5).
Способ 4: Power Query для обработки больших данных
Когда речь идёт о таблицах с десятками тысяч строк, стандартные формулы Excel начинают "тормозить". Здесь на помощь приходит инструмент Power Query (доступен в Excel 2016+ и 365). Он позволяет сортировать данные и извлекать топовые значения без формул.
Пошаговая инструкция:
- Выделите диапазон данных и перейдите на вкладку
Данные→Из таблицы/диапазона. - В открывшемся редакторе Power Query отсортируйте столбец по возрастанию.
- Щёлкните правой кнопкой по заголовку столбца →
Дублировать столбец. - В новом столбце оставьте только первые 2 строки (удалите остальные через
Удалить строки→Удалить альтернативные строки). - Нажмите
Закрыть и загрузить— результат появится на новом листе.
Преимущество этого метода — мгновенная обработка даже миллиона строк. Кроме того, Power Query сохраняет шаги преобразования, поэтому при обновлении исходных данных результат пересчитается автоматически.
⚠️ Внимание: Power Query создаёт связанную таблицу, которая обновляется при изменении данных. Если вам нужен статический результат, скопируйте его на другой лист черезСпециальная вставка→Значения.
Как ускорить Power Query для очень больших файлов?
Используйте параметр "Загрузить в модель данных" вместо создания таблицы на листе. Это снизит нагрузку на оперативную память и ускорит обработку в 3-5 раз.
Способ 5: VBA-макрос для автоматизации и сложных условий
Если вам нужно регулярно искать два минимальных значения в разных диапазонах или с дополнительными условиями (например, игнорировать скрытые строки), напишите простой макрос. Он сэкономит время при повторяющихся задачах.
Пример кода для поиска двух минимумов в выделенном диапазоне:
Sub FindTwoMinValues()
Dim rng As Range
Dim arr() As Variant
Dim i As Long, min1 As Double, min2 As Double
' Проверяем, выделен ли диапазон
On Error Resume Next
Set rng = Selection
On Error GoTo 0
If rng Is Nothing Then Exit Sub
' Преобразуем диапазон в массив для быстрой обработки
arr = rng.Value
min1 = arr(1, 1)
min2 = arr(1, 1)
' Ищем два минимальных значения
For i = 1 To UBound(arr, 1)
If arr(i, 1) < min1 Then
min2 = min1
min1 = arr(i, 1)
ElseIf arr(i, 1) < min2 And arr(i, 1) <> min1 Then
min2 = arr(i, 1)
End If
Next i
' Выводим результат
MsgBox "Первое минимальное: " & min1 & vbCrLf & _
"Второе минимальное: " & min2, vbInformation, "Результаты поиска"
End Sub
Чтобы использовать макрос:
- Нажмите
Alt+F11, чтобы открыть редактор VBA. - Вставьте код в новый модуль (
Insert→Module). - Выделите диапазон на листе и запустите макрос через
Alt+F8.
Продвинутый вариант: модифицируйте код, чтобы он возвращал не только значения, но и адреса ячеек или связанные данные из других столбцов. Например, для поиска имени студента с двумя худшими оценками:
' Добавить в конец цикла:
If arr(i, 1) = min1 Or arr(i, 1) = min2 Then
Debug.Print "Значение: " & arr(i, 1) & ", Студент: " & arr(i, 2)
End If
Типичные ошибки и как их избежать
Даже опытные пользователи Excel сталкиваются с проблемами при поиске двух минимальных значений. Вот самые распространённые ловушки и способы их обхода:
- 🔄 Дубликаты минимума: Если минимальное значение встречается несколько раз, функция
НАИМЕНЬШИЙвернёт его же дляk=2. Решение: используйте формулу массива с условиемСЧЁТЕСЛИ:=МИН(ЕСЛИ(СЧЁТЕСЛИ($B$2:B2; B2:B50)<2; B2:B50)) - ❌ Пустые ячейки: Функции
МИН/НАИМЕНЬШИЙигнорируют пустоты, но если в диапазоне только одна заполненная ячейка,НАИМЕНЬШИЙ(диапазон; 2)вернёт ошибку. Решение: добавьте проверку:=ЕСЛИ(СЧЁТ(B2:B50)>=2; НАИМЕНЬШИЙ(B2:B50; 2); "Недостаточно данных") - 📉 Скрытые строки: Стандартные функции учитывают скрытые строки. Чтобы их игнорировать, используйте VBA или фильтр перед применением формул.
Ещё одна частая проблема — некорректная сортировка при использовании НАИМЕНЬШИЙ с текстовыми данными. Excel сортирует текст по алфавиту ("10" идёт перед "2"), поэтому для числовых значений всегда проверяйте формат ячеек (Числовой, а не Текстовый).
FAQ: Ответы на частые вопросы
Можно ли найти два минимальных значения в Google Sheets?
Да, в Google Таблицах работает та же функция =SMALL(диапазон; 2) (аналог НАИМЕНЬШИЙ). Для формул массива используйте =ARRAYFORMULA вместо Ctrl+Shift+Enter:
=ARRAYFORMULA(MIN(IF(B2:B50<>MIN(B2:B50); B2:B50)))
Как найти два максимальных значения?
Замените НАИМЕНЬШИЙ на НАИБОЛЬШИЙ (англ. LARGE):
=НАИБОЛЬШИЙ(A1:A100; 1) ' первое максимальное
=НАИБОЛЬШИЙ(A1:A100; 2) ' второе максимальное
Почему формула массива возвращает #ЗНАЧ?
Ошибка #ЗНАЧ! возникает, если:
- Вы забыли нажать
Ctrl+Shift+Enter(для Excel 2010-2019). - В диапазоне есть текстовые значения (используйте
ЕЧИСЛОдля фильтрации). - Диапазоны в формуле разного размера (например,
B2:B50vsC2:C49).
Как найти два минимальных значения с учётом критериев (например, по категории)?
Используйте комбинацию НАИМЕНЬШИЙ + ЕСЛИ с несколькими условиями:
=НАИМЕНЬШИЙ(ЕСЛИ((A2:A50="Категория1")*(B2:B50<>0); B2:B50); 2)
Для Excel 365 подойдёт более простая формула с ФИЛЬТР:
=НАИМЕНЬШИЙ(ФИЛЬТР(B2:B50; (A2:A50="Категория1")*(B2:B50<>0)); 2)
Можно ли найти два минимальных значения в сводной таблице?
Сводные таблицы не поддерживают прямые формулы, но вы можете:
- Отсортировать данные по возрастанию.
- Добавить столбец с рангом (функция
РАНГ). - Отфильтровать первые 2 строки по рангу.
Или используйте Power Query (см. Способ 4).