Последняя непустая ячейка в столбце - PullRequest
105 голосов
/ 26 марта 2011

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

Ответы [ 23 ]

121 голосов
/ 05 марта 2014

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

=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)

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

enter image description here

72 голосов
/ 26 марта 2011

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

Необходимо ввести массив , что означает, что вы нажимаете Ctrl-Shft-Enter после того, как наберете или вставите его. Ниже приведен столбец A:

=INDEX(A:A,MAX((A:A<>"")*(ROW(A:A))))
24 голосов
/ 27 марта 2011

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

16 голосов
/ 01 ноября 2013

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

Вот оно:

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

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

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

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

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

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

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

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

12 голосов
/ 12 мая 2016

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

  • 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 имеет самые низкие издержки и является энергонезависимым, поэтому, если вы работаете с большим количеством данных, это лучше всего использовать.

10 голосов
/ 27 марта 2011

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

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

Помните, что Excel 2003 не может применить формулу массива ко всему столбцу. Это дает #NUM!; непредсказуемые результаты могут произойти! (РЕДАКТИРОВАТЬ : Конфликт информации от Microsoft: то же самое может или может не соответствовать в Excel 2007; проблема может была исправлена ​​в 2010. )

Именно поэтому я применяю формулу массива к диапазону A1:A65535 и назначаю специальную обработку последней ячейке, которая в Excel 2003 равна A65536. Не могу просто сказать 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)).

7 голосов
/ 20 ноября 2013

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

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

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

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

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

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

4 голосов
/ 26 сентября 2018

, если вы ищете в столбце (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 голосов
/ 15 сентября 2014

=INDEX(A:A, COUNTA(A:A), 1) взято из здесь

2 голосов
/ 15 апреля 2015

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

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

...