Вы не указали, будет ли ваш счет всегда состоять из двух цифр или нет, и может ли это быть что-то вроде 01.20.99.99
, но эта формула может привести вас в правильном направлении (не проверено с 100000 записями)
введите описание изображения здесь
=IF(C2=3;"ABCD.01.01."&TEXT(COUNTIF($C$2:C2;C2);"00");INDIRECT("E"&SUMPRODUCT(MAX(--($C$2:C2=3)*ROW($C$2:C2))))&"."&TEXT(SUMPRODUCT(--($C$2:C2=4)*--(ROW($C$2:C2)>SUMPRODUCT(MAX(--($C$2:C2=3)*ROW($C$2:C2)))));"00"))
Вот как это работает:
A) Сначала мы проверяем, является ли ячейка в столбце C 3 или 4. В случае 3, мы делаем ;"ABCD.01.01."&TEXT(COUNTIF($C$2:C2;C2);"00");
Это будет подсчитывать, сколько раз число 3 появляется в диапазоне $C$2:C2
и будет сцеплено со строкой ABCD.01.01.
Уловка здесь заключается в использовании $C$2:C2
, потому что он создает динамический диапазон c (, но это может привести к перегрузке вычислений. )
B) Если не 3, то мы делаем действительно полную часть, которую я попытаюсь объяснить. Кроме того, мы используем уловку динамики c диапазон
SUMPRODUCT(MAX(--($C$2:C2=3)*ROW($C$2:C2))))
эта часть используется дважды. Он получит номер последней строки из последних 3 значений в столбце C. Пример : ROW($C$2:C6)
получит массив только номеров строк, например {2;3;4;5;6}
. --($C$2:C6=3)
вернет массив из нуля / единицы в зависимости от того, равна ли ячейка / не равна 3, что-то вроде {1;0;0;0;1}
. ($C$2:C6=3)*ROW($C$2:C6))
умножит оба массива, поэтому мы получим {1;0;0;0;1}*{2;3;4;5;6}={2;0;0;0;6}
. И с помощью MAX мы получаем максимальное значение из этого массива, это 6 означает последнюю позицию значения 3. - Мы используем INDIRECT в сочетании с номером шага 1, чтобы получить текст внутри ячейки
SUMPRODUCT(--($C$2:C2=4)*--(ROW($C$2:C2)>SUMPRODUCT(MAX(--($C$2:C2=3)*ROW($C$2:C2)))));"
Все, что находится после >
, является тем же logi c, что и шаг 1. Он вернет номер строки последней ячейки, содержащей 3. Часть SUMPRODUCT(--($C$2:C2=4)*--(ROW($C$2:C2)
просто получит номера строк тех ячеек, которые содержат 4 значения. , и номера строк выше , чем значение, полученное на шаге 1. Таким образом вы убедитесь, как подсчитать ячейки, содержащие 4 значения, между двумя ячейками, содержащими 3 значения. - Мы объединяем все для формирования окончательной строки.
- Функции ТЕКСТ используются только для того, чтобы вычисление было 2-значным.
Вы можете использовать это вручную или вставить формулу с помощью VBA, перетащить вниз, а затем преобразовать все в значения (я бы, вероятно, сделал это). Что-то вроде этого может сработать.
Sub Macro1()
Dim LR As Long
LR = Range("C" & Rows.Count).End(xlUp).Row 'last non blank row in column c
Range("E2").FormulaR1C1 = _
"=IF(RC[-2]=3,""ABCD.01.01.""&TEXT(COUNTIF(R2C3:RC[-2],RC[-2]),""00""),INDIRECT(""E""&SUMPRODUCT(MAX(--(R2C3:RC[-2]=3)*ROW(R2C3:RC[-2]))))&"".""&TEXT(SUMPRODUCT(--(R2C3:RC[-2]=4)*--(ROW(R2C3:RC[-2])>SUMPRODUCT(MAX(--(R2C3:RC[-2]=3)*ROW(R2C3:RC[-2]))))),""00""))"
Range("E2").AutoFill Destination:=Range("E2:E" & LR), Type:=xlFillDefault
Range("E2:E" & LR) = Range("E2:E" & LR).Value 'paste into values
End Sub
ПРИМЕЧАНИЕ: Вероятно, вам нужно будет адаптировать это в зависимости от результатов (мы не знаем, может ли количество из 3 или 4 значений иметь 3 или 4 цифры и т. д.).