Последняя непустая ячейка в столбце

112

Кто-нибудь знает формулу для поиска значения последней непустой ячейки в столбце в Microsoft Excel?

Michaels
источник
Я бы посмотрел на VBA для этого.
Дэвид Хеффернан

Ответы:

76

Это работает как с текстом, так и с числами и не заботится о том, есть ли пустые ячейки, то есть возвращает последнюю непустую ячейку.

Он должен быть введен в массив , то есть вы нажимаете Ctrl-Shift-Enter после того, как наберете или вставите его. Ниже приведен столбец A:

=INDEX(A:A,MAX((A:A<>"")*(ROW(A:A))))
Дуг Глэнси
источник
@ Jean-François, извините, я признал это в комментарии вчера вечером, но по ошибке поместил его в исходный пост. Он работает в XL 2007 и 2010. Спасибо.
Дуг Глэнси
У меня не работает в Excel 2007. Я вставил точную формулу. У меня есть столбец (A), где значения равны = ROW () вплоть до 127, а формула возвращает «1»
DontFretBrett
2
@DontFretBrett, обязательно введите его как формулу массива с помощью Ctrl-Shift-Enter, как указано в ответе.
Дуг Глэнси
@DougGlancy терпит неудачу с моей стороны. Спасибо!
DontFretBrett 07
1
Важное различие состоит в том, что этот возвращает ссылку на ячейку (так что его можно передать, например, CELL()или OFFSET()), тогда как тот, который получил больше голосов, возвращает значение, не сообщая вам, где оно находится.
GSerg
128

Использование следующей простой формулы намного быстрее

=LOOKUP(2,1/(A:A<>""),A:A)

Для Excel 2003:

=LOOKUP(2,1/(A1:A65535<>""),A1:A65535)

Это дает вам следующие преимущества:

  • это не формула массива
  • это не летучая формула

Объяснение:

  • (A:A<>"") возвращает массив {TRUE,TRUE,..,FALSE,..}
  • 1/(A:A<>"")изменяет этот массив на {1,1,..,#DIV/0!,..}.
  • Поскольку LOOKUPожидает отсортированный массив в порядке возрастания и учитывая, что, если LOOKUPфункция не может найти точное совпадение, она выбирает наибольшее значение в lookup_range(в нашем случае {1,1,..,#DIV/0!,..}), которое меньше или равно значению (в нашем случае 2), формула находит последнее 1в массиве и возвращает соответствующее значение из result_range(третий параметр - A:A).

Также небольшое примечание - приведенная выше формула не учитывает ячейки с ошибками (вы можете увидеть это, только если последняя непустая ячейка имеет ошибку). Если вы хотите учесть их, используйте:

=LOOKUP(2,1/(NOT(ISBLANK(A:A))),A:A)

изображение ниже показывает разницу:

введите описание изображения здесь

Дмитрий Павлов
источник
спасибо за объяснение и красивую картинку. Однако некоторые вопросы остаются открытыми: 1. В документации LOOKUPуказано, что последний аргумент result_vectorявляется необязательным. Однако если я его пропущу, я получу очень странный результат, которого не понимаю.
Honza Zidek
2. В документации говорится: «Если LOOKUPфункция не может найти lookup_value, функция соответствует наибольшему значению lookup_vector, которое меньше или равно lookup_value.». Если я использую =LOOKUP(2,A:A<>"",A:A)без генерации #DIV/0!ошибки 1/..., кажется, что она возвращает какое-то значение в середине вектор. Я не нашел, какова точная функциональность в этом случае.
Honza Zidek
1
Очень красивое объяснение. Недавно сэкономив несколько минут на вычислениях, переместив формулы из формул массива в версии без массива, я всегда готов к логике, которая работает без использования формул массива.
tobriand
1
@Enissay, да, этот вернет номер строки, =LOOKUP(2,1/(A:A<>""),ROW(A:A))но добавление ROWфункции добавит эффект "волатильности" - формула будет пересчитываться каждый раз, когда любая ячейка в wroksheet изменяется
Дмитрий Павлив
1
Привет всем. Спасибо, что разместили это. Просто любопытно, я нашел те же самые формулы и почти такую ​​же формулировку на exceljet.net/formula/get-value-of-last-non-empty-cell . Это тоже ты или кто-то другой? Очевидной связи нет.
Соломон Рутцки
24

Вот еще вариант: =OFFSET($A$1;COUNTA(A:A)-1;0)

Патрик Онорез
источник
9
Это не сработает, если есть ячейки с нечисловыми значениями (используйте COUNTAвместо COUNT). Не говоря уже о пустых ячейках.
Жан-Франсуа Корбетт,
3
Это должно быть вверху. это просто и не полагается на непонятные детали необычных функций.
Tmdean
9
Он не должен быть наверху, потому что это неверно, если в результатах есть пустые пробелы.
Myrddin Emrys
17

Вдохновленный великим руководством, данным ответом Дуга Глэнси, я придумал способ сделать то же самое без необходимости в формуле массива. Не спрашивайте меня, почему, но я стараюсь избегать использования формул массива, если это вообще возможно (не по какой-либо конкретной причине, это просто мой стиль).

Вот:

=SUMPRODUCT(MAX(($A:$A<>"")*(ROW(A:A))))

Для поиска последней непустой строки с использованием столбца A в качестве ссылочного столбца

=SUMPRODUCT(MAX(($1:$1<>"")*(COLUMN(1:1))))

Для поиска последнего непустого столбца с использованием строки 1 в качестве ссылочной строки

Это может быть дополнительно использовано в сочетании с функцией индекса для эффективного определения динамических именованных диапазонов, но это отдельная тема для другого поста, поскольку это не связано с непосредственным вопросом, рассматриваемым здесь.

Я протестировал вышеуказанные методы с Excel 2010 как «изначально», так и в «Режиме совместимости» (для более старых версий Excel), и они работают. Опять же, с ними вам не нужно делать какие-либо Ctrl + Shift + Enter. Используя способ работы sumproduct в Excel, мы можем избавиться от необходимости выполнять операции с массивами, но мы делаем это без формулы массива. Я надеюсь, что кто-то сможет оценить красоту, простоту и элегантность этих предлагаемых решений по дополнительным продуктам так же, как и я. Тем не менее, я не подтверждаю эффективность памяти вышеуказанных решений. Просто они просты, красиво выглядят, помогают по назначению и достаточно гибки, чтобы их можно было использовать для других целей :)

Надеюсь это поможет!

Всего наилучшего!

Сантьяго
источник
1
Относительно того, почему используются формулы без массива, см. Этот ответ ниже .
sancho.s ReinstateMonicaCellio
17

Я знаю, что это старый вопрос, но я не удовлетворен предоставленными ответами.

  • LOOKUP, VLOOKUP и HLOOKUP имеют проблемы с производительностью и никогда не должны использоваться.

  • Функции массива имеют много накладных расходов и могут также иметь проблемы с производительностью, поэтому их следует использовать только в крайнем случае.

  • COUNT и COUNTA сталкиваются с проблемами, если данные не являются непрерывно непустыми, т.е. у вас есть пробелы, а затем данные снова в рассматриваемом диапазоне

  • INDIRECT является нестабильным, поэтому его следует использовать только в крайнем случае.

  • СМЕЩЕНИЕ нестабильно, поэтому его следует использовать только в крайнем случае.

  • любые ссылки на последнюю строку или столбец (например, 65536-я строка в Excel 2003) не являются надежными и приводят к дополнительным накладным расходам

Это то, что я использую

  • когда тип данных смешанный: =max(MATCH(1E+306,[RANGE],1),MATCH("*",[RANGE],-1))

  • когда известно, что данные содержат только числа: =MATCH(1E+306,[RANGE],1)

  • когда известно, что данные содержат только текст: =MATCH("*",[RANGE],-1)

MATCH имеет наименьшие накладные расходы и энергонезависим, поэтому, если вы работаете с большим количеством данных, это лучше всего использовать.

W5ALIVE
источник
Это хороший ответ (+1), но все же есть некоторые лазейки, которые этот метод может упустить. Например, если есть ячейки с логическими значениями ( TRUE/ FALSE), они останутся незамеченными. Несмотря на то, что этот ответ не является пуленепробиваемым, я все же считаю, что он меньше всего влияет на производительность.
ImaginaryHuman072889
2
Match возвращает индекс, а не значение ячейки. Вы можете использовать функцию индекса, чтобы получить значение. Кроме того, вам, вероятно, следует указать что-то о том, что должно быть [ДИАПАЗОН]. Я выделил весь столбец, используя «N: N». Вот пример, который сработал для меня: =INDEX(N:N,MATCH(1E+306,N:N,1))
swimfar
10

Это работает в Excel 2003 (и позже с небольшими изменениями, см. Ниже). Нажмите Ctrl + Shift + Enter (не только Enter), чтобы ввести это как формулу массива.

=IF(ISBLANK(A65536),INDEX(A1:A65535,MAX((A1:A65535<>"")*(ROW(A1:A65535)))),A65536)

Имейте в виду, что Excel 2003 не может применить формулу массива ко всему столбцу. Это дает #NUM!; возможны непредсказуемые результаты! (EDIT : Противоречивая информация от Microsoft: Та же мая или не может быть правдой о Excel 2007, проблема может быть зафиксирована в 2010 году )

Вот почему я применяю формулу массива к диапазону A1:A65535и уделяю особое внимание последней ячейке, которая находится A65536в Excel 2003. Не могу просто сказать A:Aили даже, A1:A65536как последняя автоматически возвращается к A:A.

Если вы абсолютно уверены A65536, что поле пусто, то можете пропустить эту IFчасть:

=INDEX(A1:A65535,MAX((A1:A65535<>"")*(ROW(A1:A65535))))

Обратите внимание, что если вы используете Excel 2007 или 2010, номер последней строки - 1048576, а не 65536, поэтому измените указанное выше значение.

Если в середине ваших данных нет пустых ячеек, я бы просто использовал более простую формулу =INDEX(A:A,COUNTA(A:A)).

Жан-Франсуа Корбетт
источник
Для ROW вместо столбца у меня это сработало=INDEX(19:19,COUNTA(19:19))
Серж Саган
8

Альтернативное решение без формул массива, возможно, более надежное, чем решение в предыдущем ответе с (подсказкой) решение без формул массива , является

=INDEX(A:A,INDEX(MAX(($A:$A<>"")*(ROW(A:A))),0))

См. Этот ответ в качестве примера. Престижность Брэду и Барри Гудини , которые помогли решить этот вопрос .

Возможные причины предпочтения формулы без массива приведены в:

  1. Официальная страница Microsoft (ищите «Недостатки использования формул массива»).
    Формулы массива могут показаться волшебными, но у них есть и недостатки:

    • Иногда вы можете забыть нажать CTRL + SHIFT + ENTER. Не забывайте нажимать эту комбинацию клавиш всякий раз, когда вы вводите или редактируете формулу массива.
    • Другие пользователи могут не понимать ваши формулы. Формулы массива относительно недокументированы, поэтому, если другим людям нужно изменить ваши книги, вам следует либо избегать формул массива, либо убедиться, что эти пользователи понимают, как их изменять.
    • В зависимости от скорости обработки и объема памяти вашего компьютера формулы большого массива могут замедлить вычисления.
  2. Ересь формулы массива .

sancho.s ReinstateMonicaCellio
источник
Я не могу заставить это работать с столбцом D. Я заменил все Aвхождения на D. Что я делаю не так?
Marc.2377,
5

если вы выполняете поиск в столбце (A), используйте:

=INDIRECT("A" & SUMPRODUCT(MAX((A:A<>"")*(ROW(A:A)))))

если ваш диапазон A1: A10, вы можете использовать:

=INDIRECT("A" & SUMPRODUCT(MAX(($A$1:$A10<>"")*(ROW($A$1:$A10)))))

в этой формуле:

SUMPRODUCT(MAX(($A$1:$A10<>"")*(ROW($A$1:$A10))))

возвращает последний непустой номер строки, а косвенный () возвращает значение ячейки.

Шариф Лотфи
источник
2

=MATCH("*";A1:A10;-1) для текстовых данных

=MATCH(0;A1:A10;-1) для числовых данных

Лихарви
источник
При предоставлении фрагментов кода в ответах используйте блоки кода.
β.εηοιτ.βε
Я думаю, что эти формулы дадут нам первую непустую ячейку, а не последнюю непустую ячейку.
Baodad
2

Я пробовал все энергонезависимые версии, но ни одна из приведенных выше версий не сработала .. excel 2003 / 2007update. Конечно, это можно сделать в Excel 2003. Не в виде массива или стандартной формулы. Я получаю либо пустое сообщение, либо ошибку #value. Поэтому я прибегаю к летучим методам .. Это сработало ..

= ПРОСМОТР (2,1 / (T4: T369 <> ""), T4: T369)

@Julian Kroné .. Использование ";" вместо "," НЕ работает! Я думаю, вы используете Libre Office, а не MS excel? LOOKUP настолько раздражающе изменчив, что я использую его только в крайнем случае

удаленный
источник
0

Поместите этот код в модуль VBA. Сохранить. В разделе «Функции» найдите эту функцию.

Function LastNonBlankCell(Range As Excel.Range) As Variant
    Application.Volatile
    LastNonBlankCell = Range.End(xlDown).Value
End Function
Mac vd Wsthuizen
источник
2
Это не обязательно ПОСЛЕДНЯЯ пустая ячейка, это просто СЛЕДУЮЩАЯ пустая ячейка, начинающаяся сверху.
Portland Runner
Вопрос в формуле, а не в VBA
Патрик Хонорез
0

для текстовых данных:

EQUIV("";A1:A10;-1)

для числовых данных:

EQUIV(0;A1:A10;-1)

Это даст вам относительный индекс последней непустой ячейки в выбранном диапазоне (здесь A1: A10).

Если вы хотите получить значение, обращайтесь к нему через КОСВЕННО после создания - текстуально - абсолютной ссылки на ячейку, например:

INDIRECT("A" & (nb_line_where_your_data_start + EQUIV(...) - 1))
Адель
источник
0

У меня тоже была такая же проблема. Эта формула также работает одинаково хорошо: -

=INDIRECT(CONCATENATE("$G$",(14+(COUNTA($G$14:$G$65535)-1))))

14 - это номер первой строки в строках, которые вы хотите подсчитать.

Хронический когтистый зуб

Хронический когтистый зуб
источник
0

Я использовал HLOOKUP

A1есть свидание; A2:A8есть прогнозы, сделанные в разное время, мне нужны самые свежие

=Hlookup(a1,a1:a8,count(a2:a8)+1)

При этом используется стандартная формула hlookup с поисковым массивом, определяемым количеством записей.

Крис
источник
0

Если вы знаете, что между ними не будет пустых ячеек, это самый быстрый способ.

=INDIRECT("O"&(COUNT(O:O,"<>""")))

Он просто считает непустые ячейки и обращается к соответствующей ячейке.

Его также можно использовать для определенного диапазона.

=INDIRECT("O"&(COUNT(O4:O34,"<>""")+3))

Это возвращает последнюю непустую ячейку в диапазоне O4: O34.

Тассос Маллис
источник
0

Для Microsoft Office 2013

«Предпоследняя» непустой строки:

=OFFSET(Sheet5!$C$1,COUNTA(Sheet5!$C:$C)-2,0)

«Последняя» непустая строка:

=OFFSET(Sheet5!$C$1,COUNTA(Sheet5!$C:$C)-1,0)
Апродан
источник
0

Эта формула работала со мной для офиса 2010:

= ПРОСМОТР (2; 1 / (A1: A100 <> ""); A1: A100)

A1: первая ячейка A100: ссылка на последнюю ячейку при сравнении

Wahed
источник
0

Я думаю, что ответ W5ALIVE наиболее близок к тому, что я использую для поиска последней строки данных в столбце. Предполагая, что я ищу последнюю строку с данными в столбце A, я бы использовал следующее для более общего поиска:

=MAX(IFERROR(MATCH("*",A:A,-1),0),IFERROR(MATCH(9.99999999999999E+307,A:A,1),0))

Первое ПОИСКПОЗ найдет последнюю текстовую ячейку, а второе ПОИСКПОЗ - последнюю числовую ячейку. Функция ЕСЛИОШИБКА возвращает ноль, если первое совпадение находит все числовые ячейки или второе совпадение находит все текстовые ячейки.

По сути, это небольшая вариация смешанного решения W5ALIVE для текста и чисел.

При тестировании времени это было значительно быстрее, чем эквивалентные варианты LOOKUP.

Чтобы вернуть фактическое значение этой последней ячейки, я предпочитаю использовать косвенные ссылки на ячейки следующим образом:

=INDIRECT("A"&MAX(IFERROR(MATCH("*",A:A,-1),0),IFERROR(MATCH(9.99999999999999E+307,A:A,1),0)))

Метод, предлагаемый sancho.s, возможно, более чистый вариант, но я бы изменил часть, которая находит номер строки, на это:

=INDEX(MAX((A:A<>"")*(ROW(A:A))),1)

единственная разница в том, что ", 1" возвращает первое значение, а ", 0" возвращает весь массив значений (все, кроме одного, не нужны). Я по-прежнему предпочитаю адресовать ячейку к функции индекса, другими словами, возвращая значение ячейки с помощью:

=INDIRECT("A"&INDEX(MAX((A:A<>"")*(ROW(A:A))),1))

Отличная ветка!

FocusWiz
источник
0

Если вы не боитесь использовать массивы, то вот очень простая формула для решения проблемы:

= СУММ (ЕСЛИ (A: A <> ""; 1,0))

Вы должны нажать CTRL + SHIFT + ENTER, потому что это формула массива.

Bits_of_guy
источник
-1

Простой, который работает для меня:

=F7-INDEX(A:A,COUNT(A:A))
Немо
источник
-1

Хорошо, у меня была та же проблема, что и у спрашивающего, и я попробовал оба основных ответа. Но получаются только ошибки формулы. Оказалось, что мне нужно было поменять "," на ";" чтобы формулы работали. Я использую XL 2007.

Пример:

=LOOKUP(2;1/(A:A<>"");A:A)

или

=INDEX(A:A;MAX((A:A<>"")*(ROW(A:A))))
Джулиан Кроне
источник
-3

Для отслеживания версий (добавление буквы v в начало числа) я обнаружил, что это хорошо работает в Xcelsius (SAP Dashboards)

="v"&MAX(A2:A500)
Мистер Б.
источник
1
Кажется недостаточно общим, поскольку он основан на строго возрастающем порядке.
Натан Тагги,