Как использовать ARRAYFORMULA с OFFSET для предыдущей строки без получения ошибки циклической ссылки - PullRequest
2 голосов
/ 20 марта 2019

Пример листа: https://docs.google.com/spreadsheets/d/14ma-y3esh1S_EkzHpFBvLb0GzDZZiDsSVXFktH3Rr_E/edit?usp=sharing

В столбце B листа ItemData я достиг желаемого результата, скопировав формулу в каждую ячейку столбца, но вместо этого я хочу решить эту проблему, используя ArrayFormula.

В столбце C я достиг того же результата, используя ArrayFormula. Однако, кроме того, столбец C ссылается на ячейки в столбце B, а столбец B ссылается на ячейки в столбце B. Т.е. каждая ячейка в столбце B добавляет 1 к ячейке в строке выше.

Если я выделю текст формулы C3 и вставлю его в поле редактирования ячейки для ячейки B3 (чтобы не испортить ссылки на ячейки во время копирования - я знаю, что могу сделать их статическими ссылками, но это не моя проблема), ячейка получает значение ошибки

# REF!

Ошибка Обнаружена круговая зависимость. Чтобы решить с помощью итеративного расчета, см. Файл> Настройки электронной таблицы.

Обратите внимание, что добавления, которые необходимо выполнить, одинаковы в обоих случаях: добавьте 1 к значению ячейки в предыдущей строке, чтобы не было циклической ссылки. В B2 имеется начальное значение, и ячейки в B3 и ниже должны использовать данные из ячейки B в предыдущей строке.

Также обратите внимание, что я попробовал Настройки файла-> Электронная таблица и включил вычисление циклических ссылок максимум с 25 элементами, но это заполняет только первые две ячейки (B3 и B4).

Как я могу решить эту проблему? Я бы предпочел иметь что-то вроде ArrayFormula, где формула существует только в одной ячейке. Но копирование будет приемлемо, если любые новые строки, вставленные между ними или добавленные внизу, получат ту же формулу, добавленную в столбце B.

1 Ответ

1 голос
/ 26 марта 2019

Соответствующие элементы всегда будут последовательными?Кажется, так, поскольку вы сравниваете каждую ячейку с ячейкой над ней прямо в логике формулы.Это нарушает [неписанное?] Правило нормализации электронных таблиц;значения адреса сами по себе, как правило, не должны рассматриваться как данные.

ЕСЛИ вы привержены этому, рассматривали ли вы явное использование местоположения в качестве источника данных?Пример:

=ARRAYFORMULA(IFS(
  NOT(LEN(A3:A40)),,
  ROW(A3:A40)-3-MATCH(A3:A40,A$3:A$40,0)<=VLOOKUP(VLOOKUP(A3:A40,Items!$A$2:$D,2,false),DataPerColor!$A$2:$B,2,false),ROW(A3:A40)-3-MATCH(A3:A40,A$3:A$40,0),
  true,
))

Так же, как ваши формулы, все, что делает на английском языке, это:

for each row,  
if there's no Item, don't output any ItemData,  
if the number that belongs in this cell¹ is less than or equal to the lookup, print it,  
otherwise, don't output any ItemData

Но тогда что такое ¹ «число, которое принадлежит этой ячейке» и как мы можемрассчитать без использования столбца B?Я злоупотребляю местами вещей, чтобы получить это.Если посмотреть вниз по строке B, каждое появившееся число будет просто:

this row's number,  minus  
the row where items start [always 3],  minus  
the row number [in just the Item rows] of the first row containing this row's Item

Используя второй-последний ItemC в качестве примера: первый ItemC является списком 16-го элемента, итот, который мы ищем… «второй-последний ItemC» находится в строке 21 листа.21-3-16 = 2 ... число, которое вы хотели.

Если вы можете это пережить, это одна формула и работает в соответствии с вашими требованиями.

...