Как вывести последнее значение из диапазона в Excel: от простых формул до VBA

Почему стандартные функции Excel не всегда работают с последними данными

Вы когда-нибудь сталкивались с ситуацией, когда нужно было автоматически извлечь последнее ненулевое значение из столбца или строки в Excel, но стандартные функции вроде МАКС() или ИНДЕКС() выдавали неверный результат? Проблема в том, что Excel не имеет встроенной функции "ПОСЛЕДНИЙ_ЭЛЕМЕНТ", а классические подходы часто ломаются на динамических данных или пропусках.

Например, если у вас есть столбец с продажами по дням, где последние ячейки пустые (потому что месяц ещё не закончился), функция =ИНДЕКС(A:A;СЧЁТЗ(A:A)) вернёт ошибку или ноль. А формула =МАКС(A:A) найдёт максимальное значение, но не последнее. Эта статья разберёт 5 надёжных методов, включая решения для Excel 365, Excel 2019 и более ранних версий, а также варианты с Power Query и VBA для автоматизации.

Мы рассмотрим:

  • 🔹 Формулы массива для статических и динамических диапазонов
  • 🔹 Функции ИНДЕКС + ПОИСКПОЗ с обработкой ошибок
  • 🔹 Power Query для больших наборов данных
  • 🔹 VBA-макрос для пользователей, работающих с автоматизацией
  • 🔹 Новые функции Excel 365 (ПОСЛЕДНИЙ, ФИЛЬТР)

📊 Какую версию Excel вы используете?
Excel 365 (или 2021)
Excel 2019
Excel 2016
Excel 2013 или старше
Не знаю

Метод 1: Классическая формула с ИНДЕКС и ПОИСКПОЗ (работает во всех версиях)

Этот способ подходит для Excel 2007–2019 и не требует знания массивов. Идея проста: найти позицию последней ненулевой ячейки и вернуть её значение. Формула выглядит так:

=ИНДЕКС(диапазон; ПОИСКПОЗ(2; 1/(диапазон<>"")*(СТРОКА(диапазон)-МИН(СТРОКА(диапазон))+1)))

Разберём на примере. Допустим, у вас данные в столбце A2:A100. Формула примет вид:

=ИНДЕКС(A2:A100; ПОИСКПОЗ(2; 1/(A2:A100<>"")*(СТРОКА(A2:A100)-СТРОКА(A2)+1)))

Как это работает:

  1. Часть A2:A100<>"" проверяет, какие ячейки не пустые (возвращает ИСТИНА/ЛОЖЬ).
  2. 1/(... преобразует ИСТИНА в 1, а ЛОЖЬ — в ошибку #ДЕЛ/0!.
  3. СТРОКА(A2:A100)-СТРОКА(A2)+1 нумерует строки диапазона с 1.
  4. ПОИСКПОЗ(2; ...) ищет позицию последней "1" в массиве (так как 2 больше всех единиц).

⚠️ Внимание: Формулу нужно вводить как формулу массива в старых версиях Excel (до 2019). Для этого после ввода нажмите Ctrl+Shift+Enter. В Excel 365 это не требуется.

Выделите ячейку для результата|

Убедитесь, что в диапазоне нет скрытых символов (пробелов, неразрывных пробелов)|

Для динамических диапазонов используйте Таблицу Excel или именованные диапазоны|

Проверьте, нет ли в данных текстовых значений, которые могут быть восприняты как пустые ячейки-->

Метод 2: Формулы массива для динамических данных (Excel 365 и 2019)

В современных версиях Excel появились динамические массивы, которые упрощают работу с последними значениями. Например, можно использовать комбинацию ФИЛЬТР + ИНДЕКС:

=ИНДЕКС(ФИЛЬТР(A2:A100; A2:A100<>""); СЧЁТЗ(ФИЛЬТР(A2:A100; A2:A100<>"")))

Эта формула:

  1. Фильтрует диапазон A2:A100, оставляя только непустые ячейки.
  2. Считает количество ненулевых ячеек с помощью СЧЁТЗ.
  3. Возвращает последнее значение по его позиции в отфильтрованном массиве.

Для Excel 365 есть ещё более короткий вариант с функцией ПОСЛЕДНИЙ (если она доступна в вашей локализации):

=ПОСЛЕДНИЙ(ФИЛЬТР(A2:A100; A2:A100<>""))

Если вам нужно последнее числовое значение (игнорируя текст), используйте:

=ИНДЕКС(ФИЛЬТР(A2:A100; (A2:A100<>"")(ЕЧИСЛО(A2:A100))); СЧЁТЗ(ФИЛЬТР(A2:A100; (A2:A100<>"")(ЕЧИСЛО(A2:A100)))))

Метод 3: Power Query для больших наборов данных

Если вы работаете с тысячами строк или нужно извлечь последние значения по нескольким критериям (например, последнюю продажу для каждого менеджера), Power Query станет лучшим решением. Вот пошаговая инструкция:

  1. Выделите ваш диапазон и перейдите на вкладку Данные → Получить данные → Из таблицы/диапазона.
  2. В открывшемся редакторе Power Query выделите столбец, по которому нужно найти последнее значение.
  3. Перейдите на вкладку Преобразование → Фильтр → Удалить пустые.
  4. Отсортируйте данные по убыванию (если нужно последнее по дате — сортируйте по столбцу с датами).
  5. Вернитесь в Excel через Главная → Закрыть и загрузить.

Для извлечения последнего значения по группе (например, последняя запись для каждого клиента):

  1. Выделите столбец с группировкой (например, "Клиент").
  2. Перейдите на вкладку Преобразование → Группировка.
  3. В настройках группировки выберите операцию Все строки.
  4. Добавьте пользовательский столбец с формулой =Table.Last([Все строки])[Ваш_столбец].
Сценарий Решение в Power Query Пример кода (M)
Последняя ненулевая ячейка в столбце Фильтр + сортировка Table.SelectRows(Source, each [Column1] <> null){List.Count(Table.SelectRows(Source, each [Column1] <> null))-1}
Последнее значение по дате Сортировка по убыванию даты Table.Sort(Source,{{"Date", Order.Descending}}){0}
Последняя запись для каждой группы Группировка + Table.Last Table.Group(Source, {"GroupColumn"}, {{"LastValue", each Table.Last(_)[[ValueColumn]], type any}})
⚠️ Внимание: При работе с Power Query убедитесь, что ваши данные не содержат скрытых символов (например, неразрывных пробелов CHAR(160)). Используйте замену Text.Clean или Text.Trim для очистки.

Метод 4: VBA-макрос для автоматизации

Если вам нужно регулярно извлекать последние значения (например, в отчётах), стоит написать простой макрос. Ниже приведён код, который находит последнюю ненулевую ячейку в указанном диапазоне и выводит её значение в выбранную ячейку:

Function LastNonEmptyValue(rng As Range) As Variant

Dim cell As Range

Dim lastRow As Long

lastRow = rng.Rows.Count + rng.Row - 1

For i = lastRow To rng.Row Step -1

If Not IsEmpty(rng.Cells(i - rng.Row + 1, 1)) And _

Trim(rng.Cells(i - rng.Row + 1, 1).Value) <> "" Then

LastNonEmptyValue = rng.Cells(i - rng.Row + 1, 1).Value

Exit Function

End If

Next i

LastNonEmptyValue = "Нет данных"

End Function

Как использовать:

  1. Нажмите Alt+F11, чтобы открыть редактор VBA.
  2. Вставьте код в новый модуль (Insert → Module).
  3. Теперь в Excel можно использовать функцию как обычную формулу: =LastNonEmptyValue(A2:A100).

Для извлечения последнего значения по нескольким критериям (например, последняя дата для конкретного продукта) модифицируйте код:

Function LastValueByCriteria(rng As Range, criteriaRange As Range, criteria As Variant) As Variant

Dim cell As Range

Dim lastRow As Long

lastRow = rng.Rows.Count + rng.Row - 1

For i = lastRow To rng.Row Step -1

If Not IsEmpty(rng.Cells(i - rng.Row + 1, 1)) And _

criteriaRange.Cells(i - rng.Row + 1, 1).Value = criteria Then

LastValueByCriteria = rng.Cells(i - rng.Row + 1, 1).Value

Exit Function

End If

Next i

LastValueByCriteria = "Нет данных"

End Function

Пример использования: =LastValueByCriteria(B2:B100; A2:A100; "Продукт1") — вернёт последнее значение из столбца B, где в столбце A указан "Продукт1".

Как ускорить работу макроса для больших диапазонов?

Используйте Application.ScreenUpdating = False в начале кода и True в конце, чтобы отключить обновление экрана.

Замените цикл For на работу с массивом:

Dim arr As Variant: arr = rng.Value — это ускорит обработку в 10–100 раз для диапазонов более 10 000 строк.

Добавьте обработку ошибок с помощью On Error Resume Next, если данные могут содержать неожиданные форматы.

Метод 5: Новые функции Excel 365 (ПОСЛЕДНИЙ, ВЗЯТЬ)

В Excel 365 и Excel 2021 появились функции, которые радикально упрощают задачу:

  • 🔹 ПОСЛЕДНИЙ(диапазон) — возвращает последнее значение в диапазоне, игнорируя пустые ячейки.
  • 🔹 ВЗЯТЬ(диапазон; -1) — берёт последний элемент массива.
  • 🔹 ФИЛЬТР(диапазон; диапазон<>"") — создаёт динамический массив без пустых ячеек.

Примеры использования:

=ПОСЛЕДНИЙ(ФИЛЬТР(A2:A100; A2:A100<>""))  ' Последнее ненулевое значение

=ВЗЯТЬ(СОРТИРОВКА(A2:B100; 2; -1); 1) ' Последняя строка по второму столбцу (например, по дате)

=ИНДЕКС(ФИЛЬТР(A2:B100; (A2:A100="Критерий")(B2:B100<>"")); СЧЁТЗ(ФИЛЬТР(B2:B100; (A2:A100="Критерий")(B2:B100<>""))); 2)

' Последнее значение во втором столбце для строк, где первый столбец = "Критерий"

Преимущества новых функций:

  • 🔹 Динамические массивы: результат автоматически обновляется при изменении данных.
  • 🔹 Без ошибок: не требуют нажатия Ctrl+Shift+Enter.
  • 🔹 Гибкость: можно комбинировать с СОРТИРОВКА, УНИК, ПОИСК.

⚠️ Внимание: Функция ПОСЛЕДНИЙ может быть недоступна в некоторых локализациях Excel 365. В этом случае используйте =ВЗЯТЬ(ФИЛЬТР(диапазон; диапазон<>""); -1).

Сравнение методов: какой выбрать?

Выбор метода зависит от версии Excel, объёма данных и задачи. Ниже таблица поможет определиться:

Метод Версии Excel Плюсы Минусы Лучше для
ИНДЕКС+ПОИСКПОЗ 2007–2019 Работает везде, не требует VBA Сложно читать, нужно Ctrl+Shift+Enter в старых версиях Маленькие диапазоны, разовые задачи
Формулы массива (ФИЛЬТР+ИНДЕКС) 365, 2021, 2019 Короткий синтаксис, динамические массивы Не работает в Excel 2016 и старше Средние диапазоны, динамические данные
Power Query 2016–365 Обрабатывает миллионы строк, группировка Требует изучения интерфейса Большие данные, регулярные отчёты
VBA Все версии Максимальная гибкость, автоматизация Требует знания кода, безопасности макросов Повторяющиеся задачи, сложная логика
Новые функции (ПОСЛЕДНИЙ, ВЗЯТЬ) 365, 2021 Простота, динамичность Недоступно в старых версиях Быстрые решения для современных версий

Если вы работаете в Excel 365, приоритетно используйте функции ПОСЛЕДНИЙ или ВЗЯТЬ — они самые надёжные и лаконичные. Для старых версий оптимален ИНДЕКС+ПОИСКПОЗ или Power Query (если данных много).

FAQ: Частые вопросы и ошибки

❓ Формула возвращает #ЧИСЛО! или #ЗНАЧ!. В чём проблема?

Ошибка #ЧИСЛО! обычно означает, что в диапазоне нет ненулевых значений. Добавьте обработку ошибок с помощью ЕСЛИОШИБКА:

=ЕСЛИОШИБКА(ИНДЕКС(A2:A100; ПОИСКПОЗ(2; 1/(A2:A100<>"")*(СТРОКА(A2:A100)-СТРОКА(A2)+1))); "Нет данных")

Ошибка #ЗНАЧ! может возникать, если диапазон содержит ошибки (например, #ДЕЛ/0!). Используйте ЕОШИБКА для фильтрации: ФИЛЬТР(A2:A100; (A2:A100<>"")*(НЕ(ЕОШИБКА(A2:A100)))).

❓ Как извлечь последнее значение по дате?

Если у вас есть столбец с датами (B2:B100) и столбец со значениями (A2:A100), используйте:

=ИНДЕКС(A2:A100; ПОИСКПОЗ(МАКС(B2:B100); B2:B100; 0))

Для Excel 365 подойдёт более короткий вариант:

=ВЗЯТЬ(СОРТИРОВКА(A2:B100; 2; -1); 1; 1)
❓ Можно ли получить последнее значение в строке (а не в столбце)?

Да, логика та же, но используйте СТОЛБЕЦ вместо СТРОКА. Пример для строки 2:

=ИНДЕКС(2:2; ПОИСКПОЗ(2; 1/(2:2<>"")*(СТОЛБЕЦ(2:2)-СТОЛБЕЦ(B2)+1)))

В Excel 365 проще: =ПОСЛЕДНИЙ(ФИЛЬТР(2:2; 2:2<>"")).

❓ Почему формула не обновляется при добавлении новых данных?

Если вы используете статические диапазоны (например, A2:A100), формула не увидит данные за пределами A100. Решения:

  • 🔹 Замените A2:A100 на A:A (весь столбец).
  • 🔹 Преобразуйте диапазон в Таблицу Excel (Ctrl+T), тогда диапазоны будут расширяться автоматически.
  • 🔹 Используйте ДВССЫЛ("A2:A" & СЧЁТЗ(A:A)) для динамического диапазона.

❓ Как извлечь последнее значение из отфильтрованного списка?

Если данные отфильтрованы (например, через автофильтр), стандартные формулы не учтут скрытые строки. Испольйте Подитог или Power Query:

=ИНДЕКС(диапазон; ПОДИТОГ(103; диапазон_критериев) - СТРОКА(первая_ячейка) + 1)

Либо в Power Query примените фильтр перед извлечением последнего значения.