Отримайте останню не порожню клітинку у стовпці в Google Таблицях


140

Я використовую наступну функцію

=DAYS360(A2, A35)

щоб обчислити різницю між двома датами в моєму стовпці. Однак стовпчик постійно розширюється, і мені наразі доводиться вручну змінювати "A35" під час оновлення електронної таблиці.

Чи є спосіб (в Google Таблицях) знайти останню не порожню клітинку в цьому стовпці, а потім динамічно встановити цей параметр у вищевказаній функції?


Відповіді:


172

Можливо, є більш красномовний спосіб, але ось такий спосіб я придумав:

Функція пошуку останньої заселеної комірки у стовпці:

=INDEX( FILTER( A:A ; NOT( ISBLANK( A:A ) ) ) ; ROWS( FILTER( A:A ; NOT( ISBLANK( A:A ) ) ) ) )

Тож якщо ви поєднаєте його з вашою поточною функцією, це виглядатиме так:

=DAYS360(A2,INDEX( FILTER( A:A ; NOT( ISBLANK( A:A ) ) ) ; ROWS( FILTER( A:A ; NOT( ISBLANK( A:A ) ) ) ) ))

1
Мене не дуже турбує красномовство в цьому випадку, поки це працює як шарм (що це і робиться) - велике спасибі Сем!
MichaelS

4
Я в кінцевому підсумку порівнював із порожнім рядком, а не використовуючи ISBLANK, який розглядає деякі порожні на вигляд клітини (наприклад, порожні формули типу "=" "як порожні. Таким чином: '= index (фільтр (A: A, A: A) <> ""), рядки (фільтр (A: A, A: A <> ""))) '
circlepi314

У мене також були проблеми з ISBLANK через формули. Але використовуючи = INDEX (FILTER (F3: F; F3: F <> "")); ROWS (FILTER (F3: F; F3: F <> "")) помилка аналізу формули результатів. Будь-яка ідея, що не так?
клор

Питання. Якщо замість A: A існує importrange (), як це можна переписати, не виконуючи той же importrange () 4 рази?
Рубін

4
Трохи спрощена відповідь, яка також обробляє пробіли, Дуг Бредшоу: =INDEX(FILTER(A1:A,NOT(ISBLANK(A1:A))),COUNTA(A1:A))(може змінити початковий рядок A1) Повний опис за адресою: stackoverflow.com/a/27623407/539149
Зак Морріс

82

Для того, щоб знайти останню непорожню осередок можна використовувати INDEXі MATCHфункцію , як це:

=DAYS360(A2; INDEX(A:A; MATCH(99^99;A:A; 1)))

Я думаю, що це трохи швидше і простіше.


1
Це простіше, і я це перевірив. Чудово працює.
Ciaran

24
Схоже, ваш метод знаходить останню комірку, якщо значення є числом, мій метод знайде останній рядок, якщо також є рядок типу. Первісне питання стосувалося дат, тож це спрацювало б, але якщо стаття все-таки привертає увагу, варто зазначити різницю. Все залежить від ваших потреб. Якщо вам просто потрібен номер, я рекомендую цей спосіб.
Сем Плюс Плюс

1
Це передбачає, що стовпець відсортований
Андрій Адаменко

Також можна зробити як=DAYS360(A2;VLOOKUP(99^99;A:A;1))
vstepaniuk

56

Якщо A2: A містить дати безперервно, то INDEX (A2: A, COUNT (A2: A)) поверне останню дату. Заключна формула така

=DAYS360(A2,INDEX(A2:A,COUNT(A2:A)))

9
Особисто я вважаю, що це має бути прийнятою відповіддю. Лаконічний і простий.
SwampThingTom

4
Це найточніша відповідь. Хоча відповідь @Poul вище працює в цьому випадку, я хотів знайти фактичну останню клітинку з фактичними даними, і вона отримує це, чи є дані в порядку чи ні.
Чак Клоун

4
Це прекрасно. По-друге, про те, що це має бути прийнята відповідь.
ширі

37

Мій улюблений:

=INDEX(A2:A,COUNTA(A2:A),1)

Отже, для потреб ОП:

=DAYS360(A2,INDEX(A2:A,COUNTA(A2:A),1))

... хоча "MAX", розміщений вище Poul, чистіше виглядає у випадку, коли останній день завжди є останнім.
Ерік Маллінг

1
Він мав на увазі +1 не, 1
Новітня

1
Це не відповідає на питання - воно вибирає останнє значення, але не останнє не порожнє значення.
NateS

17

Якщо стовпець розширювався лише на сумірно додані дати, як у моєму випадку - я використовував лише функцію MAX, щоб отримати останню дату.

Остаточною формулою буде:

=DAYS360(A2; MAX(A2:A)) 

3
Геній! Простий і ефективний.
Asu

14

Хоча на питання вже відповіли, є красномовно це зробити.

Use just the column name to denote last non-empty row of that column.

Наприклад:

Якщо ваші дані є, A1:A100і ви хочете мати можливість додати ще кілька даних у стовпчик А, скажімо, це може бути A1:A105або навіть A1:A1234пізніше, ви можете використовувати цей діапазон:

A1:A

Зразок

Отже, щоб отримати останнє не порожнє значення в діапазоні, ми використаємо 2 функції:

  • КОНТА
  • INDEX

Відповідь така =INDEX(B3:B,COUNTA(B3:B)).

Ось пояснення:

COUNTA(range) повертає кількість значень у діапазоні, ми можемо використовувати це для отримання підрахунку рядків.

INDEX(range, row, col)повертає значення в діапазоні в положенні rowі col( col=1якщо не вказано)

Приклади:

INDEX(A1:C5,1,1) = A1
INDEX(A1:C5,1) = A1 # implicitly states that col = 1
INDEX(A1:C5,1,2) = A2
INDEX(A1:C5,2,1) = B1
INDEX(A1:C5,2,2) = B2
INDEX(A1:C5,3,1) = C1
INDEX(A1:C5,3,2) = C2

Для малюнка вище наш асортимент буде B3:B. Таким чином , ми будемо вважати , скільки значень є в діапазоні B3:Bвід COUNTA(B3:B)першого. У лівій частині він буде вироблятись, 8оскільки є 8 значень, тоді як буде вироблятися 9в правій. Ми також знаємо, що останнє значення знаходиться в 1-му стовпці діапазону, B3:Bтому colпараметр INDEXповинен бути 1, а rowпараметр повинен бути COUNTA(B3:B).

PS : Будь ласка, підкажіть @ bloodymurderlive відповідь, оскільки він написав її першою, я просто пояснюю це тут.


1
Мені це подобається, але я бачив проблеми, коли він іноді повертає наступний елемент замість останнього.
Ерік Маллінг

1
@EricSmalling, що може статися тому, що у вас є одна додаткова передача рядків у кінці всіх рядків, і коли ви копіюєте її, вставляйте її, вона може розглядатися як порожня комірка. Чи є у вас зразки електронної таблиці, що розкривали цю проблему?
Рамазан Полат

Схоже, найрозумніше рішення!
MemLeak

Це не працює. Звідки ви взяли цитату з btw? Я подумав, що це з листової документації Google.
Атул

1
@RamazanPolat: ОП просить спосіб (в Google Таблицях) знайти останню не порожню клітинку в стовпці A1:A , не дає мені останнього значення непустої комірки в колонці A
Atul

8

Ось ще одна:

=indirect("A"&max(arrayformula(if(A:A<>"",row(A:A),""))))

З кінцевим рівнянням таке:

=DAYS360(A2,indirect("A"&max(arrayformula(if(A:A<>"",row(A:A),"")))))

Інші рівняння тут працюють, але мені це подобається, оскільки це робить номер рядка легким, що, як я вважаю, мені потрібно робити частіше. Просто номер рядка буде таким:

=max(arrayformula(if(A:A<>"",row(A:A),"")))

Спочатку я намагався знайти саме це, щоб вирішити проблему з електронною таблицею, але не зміг знайти нічого корисного, що дало б номер рядка останнього запису, тому, сподіваюся, це комусь корисно.

Крім того, це має додаткову перевагу в тому, що він працює для будь-якого типу даних у будь-якому порядку, і ви можете мати порожні рядки між рядками із вмістом, і він не зараховує комірки з формулами, які оцінюють на "". Він також може обробляти повторювані значення. Загалом, це дуже схоже на рівняння, яке тут використовує max ((G: G <> "" * рядок (G: G)), але робить виведення номера рядка трохи простіше, якщо це те, що ви хочете .

Крім того, якщо ви хочете помістити сценарій на свій аркуш, ви можете полегшити себе, якщо ви плануєте робити це багато. Ось цей вчений:

function lastRow(sheet,column) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  if (column == null) {
    if (sheet != null) {
       var sheet = ss.getSheetByName(sheet);
    } else {
      var sheet = ss.getActiveSheet();
    }
    return sheet.getLastRow();
  } else {
    var sheet = ss.getSheetByName(sheet);
    var lastRow = sheet.getLastRow();
    var array = sheet.getRange(column + 1 + ':' + column + lastRow).getValues();
    for (i=0;i<array.length;i++) {
      if (array[i] != '') {       
        var final = i + 1;
      }
    }
    if (final != null) {
      return final;
    } else {
      return 0;
    }
  }
}

Тут ви можете просто ввести наступне, якщо потрібно останній рядок на тому ж аркуші, який ви зараз редагуєте:

=LASTROW()

або якщо ви хочете останній рядок певного стовпця з цього аркуша або певного стовпця з іншого аркуша, ви можете зробити наступне:

=LASTROW("Sheet1","A")

І для останнього рядка конкретного аркуша загалом:

=LASTROW("Sheet1")

Тоді для отримання фактичних даних ви можете використовувати непрямі:

=INDIRECT("A"&LASTROW())

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

return sheet.getRange(column + final).getValue();

і

return sheet.getRange(column + lastRow).getValue();

Однією з переваг цього сценарію є те, що ви можете вибрати, якщо ви хочете включити рівняння, які оцінюються на "". Якщо жодних аргументів не буде додано, рівняння, що оцінюються на "", будуть зараховані, але якщо ви вказали аркуш і стовпець, вони тепер будуть підраховані. Крім того, є велика гнучкість, якщо ви готові використовувати варіанти сценарію.

Напевно, надмірність, але все можливе.


1
"Невідома функція LASTROW"
Ларсен

Має бути +100, щоб реально відповісти на заголовок питання: Останній рядок, а не значення в останньому рядку
Норберт ван Нобелен

6

Як щодо цієї формули отримання останнього значення:

=index(G:G;max((G:G<>"")*row(G:G)))

І це буде остаточною формулою для вашого початкового завдання:

=DAYS360(G10;index(G:G;max((G:G<>"")*row(G:G))))

Припустимо, ваша початкова дата в G10.


5

Я пішов іншим маршрутом. Оскільки я знаю, що я буду додавати щось у рядок / стовпчик по черзі, я дізнаюся останній рядок, спершу підрахувавши поля, у яких є дані. Я продемонструю це стовпцем:

=COUNT(A5:A34)

Отже, скажімо, що повернувся 21. А5 - це 4 ряди вниз, тому мені потрібно зайняти 21 позицію з 4-го ряду вниз. Я можу це зробити, використовуючи непрямі, як-от так:

=INDIRECT("A"&COUNT(A5:A34)+4)

Він знаходить кількість рядків із даними та повертає мені число, яке я використовую як модифікатор індексу.


1
Зауважте, що порожні комірки не можуть бути. Також COUNTA має відповідати більше сценаріям
З. Хулла

4

для ряду:

=ARRAYFORMULA(INDIRECT("A"&MAX(IF(A:A<>"", ROW(A:A), ))))

для стовпця:

=ARRAYFORMULA(INDIRECT(ADDRESS(1, MAX(IF(1:1<>"", COLUMN(1:1), )), 4)))

1
Відмінна відповідь. Дякую.
Нік

2

Це здається найпростішим рішенням, яке я знайшов, щоб отримати останнє значення у стовпці, що постійно розширюється:

=INDEX(A:A,COUNTA(A:A),1)

2

Це працює для мене. Отримайте останнє значення стовпця А на аркуші Google:

=index(A:A,max(row(A:A)*(A:A<>"")))

(Він також пропускає порожні рядки між ними, якщо такі є)



1

Це дасть вміст останньої комірки:

=indirect("A"&max(ARRAYFORMULA(row(a:a)*--(a:a<>""))))

Це дасть адресу останньої комірки:

="A"&max(ARRAYFORMULA(row(a:a)*--(a:a<>"")))

Це дасть рядок останньої комірки:

=max(ARRAYFORMULA(row(a:a)*--(a:a<>"")))

Можливо, ви віддаєте перевагу сценарій. Цей сценарій набагато коротший, ніж величезний, розміщений вище ким-небудь ще:

Перейдіть до редактора сценаріїв і збережіть цей сценарій:

function getLastRow(range){
  while(range.length>0 && range[range.length-1][0]=='') range.pop();
  return range.length;
}

Один це робиться, вам просто потрібно ввести це в клітинку:

=getLastRow(A:A)

0

Те, як це робить аматор, це "= CONCATENATE (" A ", COUNTUNIQUE (A1: A9999))", де A1 - перша клітинка у стовпці, а A9999 - далі внизу цього стовпця, ніж я коли-небудь очікував, що буде мати будь-які записи. Отриманий A # може бути використаний за допомогою функції INDIRECT за потреби.


Вибачте. Це працює лише в тому випадку, якщо всі записи у стовпці унікальні.
Конрад Ліндес

1
Хоча я ціную ваш внесок у StackOverflow, Конрад, у вашої відповіді є деякі питання. По-перше, він не вказав, що дати є унікальними, тому слід використовувати count (), а не countunique (). По-друге, використання непрямих () та об'єднаних копій дублює існуючу функціональність індексу (), як ви бачите в інших відповідях. По-третє, замість A1: A9999, чому б не просто використовувати A1: A?
sondra.kinsey

0

Щоб знайти останній непорожній номер рядка (дозволяючи пропуски між ними), я використовував нижче для пошуку стовпця A.

=ArrayFormula(IFNA(match(2,1/(A:A<>""))))
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.