Получить последнюю непустую ячейку в столбце в Google Sheets


140

Я использую следующую функцию

=DAYS360(A2, A35)

чтобы вычислить разницу между двумя датами в моем столбце. Однако столбец постоянно расширяется, и в настоящее время мне приходится вручную изменять «A35», когда я обновляю свою электронную таблицу.

Есть ли способ (в Google Таблицах) найти последнюю непустую ячейку в этом столбце, а затем динамически установить этот параметр в приведенной выше функции?


2
Аналогичный вопрос: stackoverflow.com/questions/4169914/…
Джон Шнайдер

Ответы:


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 (filter (A: A, A: A <> ""), rows (filter (A: A, A: A <> ""))) '
circlepi314

У меня тоже были проблемы с ISBLANK из-за формул. Но используя = ИНДЕКС (ФИЛЬТР (F3: F; F3: F <> "")); ROWS (FILTER (F3: F; F3: F <> "")) приводит к ошибке синтаксического анализа формулы. Есть идеи, что не так?
klor

Вопрос. Если вместо A: A есть importrange (), как это можно переписать, не выполняя тот же importrange () 4 раза?
Ruby

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
Кажется, что ваш метод находит последнюю ячейку, только если значение является числом, мой метод найдет последнюю строку, если она также имеет тип string. Первоначальный вопрос был о датах, так что это сработает, но, поскольку статья все еще привлекает внимание, стоит отметить разницу. Все зависит от ваших потребностей. Если вам просто нужен номер, я рекомендую этот способ.
Sam Plus Plus

1
Предполагается, что столбец отсортирован
Андрей Адаменко

Также можно было сделать как=DAYS360(A2;VLOOKUP(99^99;A:A;1))
встепанюк

56

Если A2: A содержит даты подряд, то INDEX (A2: A, COUNT (A2: A)) вернет последнюю дату. Окончательная формула

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

9
Лично я считаю, что это должен быть принятый ответ. Лаконично и просто.
SwampThingTom,

4
Это самый точный ответ. Хотя приведенный выше ответ @Poul работает в этом случае, я хотел найти фактическую последнюю ячейку с фактическими данными, и это позволяет понять, в порядке ли данные или нет.
Чак Клаунч 05

4
Это потрясающе. Во-вторых, предложение о том, что это должен быть принятый ответ.
Шири

37

Мой любимый:

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

Итак, для необходимости OP:

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

... хотя "MAX", опубликованный Poul выше, выглядит чище в случае, когда последняя дата всегда самая поздняя.
Эрик Смоллинг

1
Он имел в виду +1 не, 1
Newbrict

1
Это не отвечает на вопрос - выбирается последнее значение, но не последнее непустое значение.
NateS

17

Если столбец расширялся только за счет добавленных подряд дат, как в моем случае, я использовал только функцию MAX, чтобы получить последнюю дату.

Окончательная формула будет такой:

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

3
Genius! Просто и эффективно.
Asu

14

Хотя на вопрос уже дан ответ, есть красноречивый способ сделать это.

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

Например:

Если ваши данные находятся внутри, A1:A100и вы хотите добавить еще несколько данных в столбец A, скажем, это может быть A1:A105или даже A1:A1234позже, вы можете использовать этот диапазон:

A1:A

Образец

Итак, чтобы получить последнее непустое значение в диапазоне, мы будем использовать 2 функции:

  • COUNTA
  • ИНДЕКС

Ответ есть =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

Не работает Откуда у тебя цитата, кстати? Я думал, что это из документации Google.
Атул

1
@RamazanPolat: OP запрашивает способ (в Google Таблицах) найти последнюю непустую ячейку в столбце A1:A , не дает мне последнее непустое значение ячейки в столбце A
Атул

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 <> "") * row (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
«Неизвестная функция ПОСЛЕДНИЙ»
Берит Ларсен

Должно быть +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. A5 на 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

Это работает для меня. Получите последнее значение столбца A в листе 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

Любитель делает это так: «= СЦЕПИТЬ (« A », COUNTUNIQUE (A1: A9999))», где A1 - первая ячейка в столбце, а A9999 находится дальше по этому столбцу, чем я ожидал иметь какие-либо записи. Этот результирующий A # можно использовать с функцией INDIRECT по мере необходимости.


Сожалею. Это работает, только если все записи в столбце уникальны.
Конрад Линдес,

1
Хотя я ценю ваш вклад в StackOverflow, Конрад, у вашего ответа есть некоторые проблемы. Во-первых, он не указал, что даты уникальны, поэтому вам следует использовать count () вместо countunique (). Во-вторых, использование Indirect () и concatenate дублирует существующие функциональные возможности index (), как вы можете видеть в других ответах. В-третьих, почему бы не использовать A1: A вместо A1: A9999?
sondra.kinsey

0

Чтобы найти номер последней непустой строки (с пропуском пробелов между ними), я использовал ниже для поиска столбца A.

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