Ответы:
Это работает как с текстом, так и с числами и не заботится о том, есть ли пустые ячейки, то есть возвращает последнюю непустую ячейку.
Он должен быть введен в массив , то есть вы нажимаете Ctrl-Shift-Enter после того, как наберете или вставите его. Ниже приведен столбец A:
=INDEX(A:A,MAX((A:A<>"")*(ROW(A:A))))
CELL()
или OFFSET()
), тогда как тот, который получил больше голосов, возвращает значение, не сообщая вам, где оно находится.
Использование следующей простой формулы намного быстрее
=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)
изображение ниже показывает разницу:
LOOKUP
указано, что последний аргумент result_vector
является необязательным. Однако если я его пропущу, я получу очень странный результат, которого не понимаю.
LOOKUP
функция не может найти lookup_value
, функция соответствует наибольшему значению lookup_vector
, которое меньше или равно lookup_value.
». Если я использую =LOOKUP(2,A:A<>"",A:A)
без генерации #DIV/0!
ошибки 1/...
, кажется, что она возвращает какое-то значение в середине вектор. Я не нашел, какова точная функциональность в этом случае.
=LOOKUP(2,1/(A:A<>""),ROW(A:A))
но добавление ROW
функции добавит эффект "волатильности" - формула будет пересчитываться каждый раз, когда любая ячейка в wroksheet изменяется
Вот еще вариант: =OFFSET($A$1;COUNTA(A:A)-1;0)
COUNTA
вместо COUNT
). Не говоря уже о пустых ячейках.
Вдохновленный великим руководством, данным ответом Дуга Глэнси, я придумал способ сделать то же самое без необходимости в формуле массива. Не спрашивайте меня, почему, но я стараюсь избегать использования формул массива, если это вообще возможно (не по какой-либо конкретной причине, это просто мой стиль).
Вот:
=SUMPRODUCT(MAX(($A:$A<>"")*(ROW(A:A))))
Для поиска последней непустой строки с использованием столбца A в качестве ссылочного столбца
=SUMPRODUCT(MAX(($1:$1<>"")*(COLUMN(1:1))))
Для поиска последнего непустого столбца с использованием строки 1 в качестве ссылочной строки
Это может быть дополнительно использовано в сочетании с функцией индекса для эффективного определения динамических именованных диапазонов, но это отдельная тема для другого поста, поскольку это не связано с непосредственным вопросом, рассматриваемым здесь.
Я протестировал вышеуказанные методы с Excel 2010 как «изначально», так и в «Режиме совместимости» (для более старых версий Excel), и они работают. Опять же, с ними вам не нужно делать какие-либо Ctrl + Shift + Enter. Используя способ работы sumproduct в Excel, мы можем избавиться от необходимости выполнять операции с массивами, но мы делаем это без формулы массива. Я надеюсь, что кто-то сможет оценить красоту, простоту и элегантность этих предлагаемых решений по дополнительным продуктам так же, как и я. Тем не менее, я не подтверждаю эффективность памяти вышеуказанных решений. Просто они просты, красиво выглядят, помогают по назначению и достаточно гибки, чтобы их можно было использовать для других целей :)
Надеюсь это поможет!
Всего наилучшего!
Я знаю, что это старый вопрос, но я не удовлетворен предоставленными ответами.
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 имеет наименьшие накладные расходы и энергонезависим, поэтому, если вы работаете с большим количеством данных, это лучше всего использовать.
TRUE
/ FALSE
), они останутся незамеченными. Несмотря на то, что этот ответ не является пуленепробиваемым, я все же считаю, что он меньше всего влияет на производительность.
=INDEX(N:N,MATCH(1E+306,N:N,1))
Это работает в 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))
.
=INDEX(19:19,COUNTA(19:19))
Альтернативное решение без формул массива, возможно, более надежное, чем решение в предыдущем ответе с (подсказкой) решение без формул массива , является
=INDEX(A:A,INDEX(MAX(($A:$A<>"")*(ROW(A:A))),0))
См. Этот ответ в качестве примера. Престижность Брэду и Барри Гудини , которые помогли решить этот вопрос .
Возможные причины предпочтения формулы без массива приведены в:
Официальная страница Microsoft (ищите «Недостатки использования формул массива»).
Формулы массива могут показаться волшебными, но у них есть и недостатки:
A
вхождения на D
. Что я делаю не так?
если вы выполняете поиск в столбце (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))))
возвращает последний непустой номер строки, а косвенный () возвращает значение ячейки.
=INDEX(A:A, COUNTA(A:A), 1)
взято отсюда
=MATCH("*";A1:A10;-1)
для текстовых данных
=MATCH(0;A1:A10;-1)
для числовых данных
Я пробовал все энергонезависимые версии, но ни одна из приведенных выше версий не сработала .. excel 2003 / 2007update. Конечно, это можно сделать в Excel 2003. Не в виде массива или стандартной формулы. Я получаю либо пустое сообщение, либо ошибку #value. Поэтому я прибегаю к летучим методам .. Это сработало ..
= ПРОСМОТР (2,1 / (T4: T369 <> ""), T4: T369)
@Julian Kroné .. Использование ";" вместо "," НЕ работает! Я думаю, вы используете Libre Office, а не MS excel? LOOKUP настолько раздражающе изменчив, что я использую его только в крайнем случае
Поместите этот код в модуль VBA. Сохранить. В разделе «Функции» найдите эту функцию.
Function LastNonBlankCell(Range As Excel.Range) As Variant
Application.Volatile
LastNonBlankCell = Range.End(xlDown).Value
End Function
для текстовых данных:
EQUIV("";A1:A10;-1)
для числовых данных:
EQUIV(0;A1:A10;-1)
Это даст вам относительный индекс последней непустой ячейки в выбранном диапазоне (здесь A1: A10).
Если вы хотите получить значение, обращайтесь к нему через КОСВЕННО после создания - текстуально - абсолютной ссылки на ячейку, например:
INDIRECT("A" & (nb_line_where_your_data_start + EQUIV(...) - 1))
У меня тоже была такая же проблема. Эта формула также работает одинаково хорошо: -
=INDIRECT(CONCATENATE("$G$",(14+(COUNTA($G$14:$G$65535)-1))))
14 - это номер первой строки в строках, которые вы хотите подсчитать.
Хронический когтистый зуб
Если вы знаете, что между ними не будет пустых ячеек, это самый быстрый способ.
=INDIRECT("O"&(COUNT(O:O,"<>""")))
Он просто считает непустые ячейки и обращается к соответствующей ячейке.
Его также можно использовать для определенного диапазона.
=INDIRECT("O"&(COUNT(O4:O34,"<>""")+3))
Это возвращает последнюю непустую ячейку в диапазоне O4: O34.
Я думаю, что ответ 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))
Отличная ветка!
Если вы не боитесь использовать массивы, то вот очень простая формула для решения проблемы:
= СУММ (ЕСЛИ (A: A <> ""; 1,0))
Вы должны нажать CTRL + SHIFT + ENTER, потому что это формула массива.
Хорошо, у меня была та же проблема, что и у спрашивающего, и я попробовал оба основных ответа. Но получаются только ошибки формулы. Оказалось, что мне нужно было поменять "," на ";" чтобы формулы работали. Я использую XL 2007.
Пример:
=LOOKUP(2;1/(A:A<>"");A:A)
или
=INDEX(A:A;MAX((A:A<>"")*(ROW(A:A))))
Для отслеживания версий (добавление буквы v в начало числа) я обнаружил, что это хорошо работает в Xcelsius (SAP Dashboards)
="v"&MAX(A2:A500)