Остання не порожня клітинка у стовпці


Відповіді:


76

Це працює як з текстом, так і з цифрами, і не важливо, чи є порожні комірки, тобто він поверне останню порожню клітинку.

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

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

@ Жан-Франсуа, Вибачте, я визнав це в коментарі минулої ночі, але помилково виклав його в оригінальному дописі. Це працює в XL 2007 та 2010 рр. Спасибі.
Doug Glancy

Не працює для мене в Excel 2007. Я вставив точну формулу. У мене стовпець (A), де значення = ROW () аж до 127ish, а формула повертає "1"
DontFretBrett

2
@DontFretBrett, Не забудьте ввести його як формулу масиву з Ctrl-Shift-Enter, як зазначено у відповіді.
Doug Glancy

@DougGlancy не вдається з мого боку. Дякую!
DontFretBrett

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функції додасть ефект "мінливості" - формула буде перерахована щоразу, коли будь-яка комірка на оброблюваному аркуші змінюється
Дмитро Павлів

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
Це не повинно бути вгорі, тому що це неправильно, коли результати вбудовують пробіли.
Мірддін Емріс

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 є летючим, тому його слід використовувати лише в крайньому випадку

  • OFFSET є летючим, тому його слід використовувати лише в крайньому випадку

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

Це те, що я використовую

  • коли тип даних змішується: =max(MATCH(1E+306,[RANGE],1),MATCH("*",[RANGE],-1))

  • коли відомо, що дані містять лише цифри: =MATCH(1E+306,[RANGE],1)

  • коли відомо, що дані містять лише текст: =MATCH("*",[RANGE],-1)

MATCH має найнижчі витрати та є енергонезалежними, тому якщо ви працюєте з великою кількістю даних, це найкраще використовувати.


Це хороша відповідь (+1), але все ж є деякі лазівки, які цей метод може пропустити. Наприклад, якщо є комірки з логічними значеннями ( TRUE/ FALSE), вони не виявляться. Незважаючи на те, що ця відповідь не є куленебезпечною, я все ж думаю, що ця відповідь має найменший вплив на продуктивність.
ImaginaryHuman072889

2
Матч повертає індекс, а не значення комірки. Ви можете використовувати функцію індексу, щоб отримати значення. Крім того, вам, мабуть, слід включити щось про те, яким повинен бути [RANGE]. Я вибрав весь стовпець, використовуючи "N: N". Ось приклад, який працював на мене: =INDEX(N:N,MATCH(1E+306,N:N,1))
купання

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))
Serj Sagan

8

Альтернативне рішення без формул масиву, можливо більш надійне, ніж рішення попередньої відповіді з (натяком на a) рішення без формул масиву , -

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

Дивіться цю відповідь як приклад. Престижність Brad і Беррі Гудіні , який допоміг рішенням цього питання .

Можливі причини переваги формули без масиву наведені у:

  1. Офіційна сторінка Microsoft (шукайте "Недоліки використання формул масиву").
    Формули масиву можуть здатися магічними, але вони мають і деякі недоліки:

    • Ви можете час від часу забути натиснути CTRL + SHIFT + ENTER. Не забудьте натискати цю комбінацію клавіш кожного разу, коли ви вводите або редагуєте формулу масиву.
    • Інші користувачі можуть не розуміти ваші формули. Формули масиву відносно недокументовані, тому якщо іншим людям потрібно змінювати ваші робочі книжки, вам слід або уникати формул масиву, або переконайтесь, що ці користувачі розуміють, як їх змінити.
    • Залежно від швидкості обробки та пам'яті комп'ютера великі формули масиву можуть уповільнити обчислення.
  2. Єресі формули єресі .


Я не можу змусити це працювати з колоною 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) для числових даних


Будь ласка, використовуйте кодові блоки, надаючи фрагмент коду у своїх відповідях.
β.εηοιτ.βε

Я думаю, що ці формули дадуть нам першу не порожню клітинку, а не останню непусту клітинку.
Баодад

2

Я спробував усі енергонезалежні версії, але жодна версія, наведена вище, не працювала. Excel 2003 / 2007update. Безумовно, це можна зробити у відмінному 2003 році. Не як масив, ні стандартна формула. Я або отримую лише порожню помилку 0 або # значення. Тому я вдаюся до нестабільних методів .. Це спрацювало ..

= LOOKUP (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

2
Це не обов'язково ОСТАННІ пусті клітинки, а лише НАСТУПНА порожня клітинка, що починається вгорі.
Портленд Бігун

Питання про формулу, а не про VBA
Патрік Хонорез

0

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

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

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

EQUIV(0;A1:A10;-1)

Це дає вам відносний індекс останньої не порожньої комірки у вибраному діапазоні (тут A1: A10).

Якщо ви хочете отримати значення, відкрийте його через INDIRECT після побудови -текстуально абсолютної посилання на комірку, наприклад:

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 року:

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

А1: перша комірка A100: відношення стосується останньої комірки


0

Я думаю, що відповідь від 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))

Чудова нитка!


0

Якщо ви не боїтеся використовувати масиви, то наступне - це дуже проста формула для вирішення проблеми:

= SUM (АКО (A: A <> "", 1,0))

Ви повинні натиснути CTRL + SHIFT + ENTER, оскільки це формула масиву.



-1

Гаразд, тому у мене було те саме питання, що і у запитувача, і я спробував обидва найкращих відповіді. Але лише отримання помилок формули. Виявилося, що мені потрібно обміняти "," на ";" щоб формули працювали. Я використовую XL 2007.

Приклад:

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

або

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

-3

Для відстеження версій (додавання літери v до початку числа) я знайшов цю, яка добре працює в Xcelsius (панелі інструментів SAP)

="v"&MAX(A2:A500)

1
Здається недостатньо загальним, оскільки він спирається на строго висхідний порядок.
Натан Туггі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.