Відповіді:
Це працює як з текстом, так і з цифрами, і не важливо, чи є порожні комірки, тобто він поверне останню порожню клітинку.
Його потрібно ввести масив , тобто після натискання клавіші Ctrl-Shift-Enter натисніть 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
функції додасть ефект "мінливості" - формула буде перерахована щоразу, коли будь-яка комірка на оброблюваному аркуші змінюється
Ось ще один варіант: =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 є летючим, тому його слід використовувати лише в крайньому випадку
OFFSET є летючим, тому його слід використовувати лише в крайньому випадку
будь-які посилання на останній рядок або стовпець можливі (наприклад, 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))
Альтернативне рішення без формул масиву, можливо більш надійне, ніж рішення попередньої відповіді з (натяком на a) рішення без формул масиву , -
=INDEX(A:A,INDEX(MAX(($A:$A<>"")*(ROW(A:A))),0))
Дивіться цю відповідь як приклад. Престижність Brad і Беррі Гудіні , який допоміг рішенням цього питання .
Можливі причини переваги формули без масиву наведені у:
Офіційна сторінка 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. Безумовно, це можна зробити у відмінному 2003 році. Не як масив, ні стандартна формула. Я або отримую лише порожню помилку 0 або # значення. Тому я вдаюся до нестабільних методів .. Це спрацювало ..
= LOOKUP (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 після побудови -текстуально абсолютної посилання на комірку, наприклад:
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))
Перша MATCH знайде останню текстову комірку, а друга MATCH знайде останню числову комірку. Функція IFERROR повертає нуль, якщо перший MATCH знаходить усі числові комірки або якщо другий збіг знаходить усі текстові комірки.
В основному це невелика зміна змішаного тексту та чисельного рішення 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))
Чудова нитка!
Якщо ви не боїтеся використовувати масиви, то наступне - це дуже проста формула для вирішення проблеми:
= SUM (АКО (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)
="v"&MAX(A2:A500)