Конкретные промежуточные итоги с использованием VBA - PullRequest
0 голосов
/ 08 февраля 2019

enter image description here

Выше приведен пример входных данных, которые я извлекаю из базы данных.Столбец А имеет несколько уровней (названных L1, L2, L3, L4, L5).Столбец B имеет значения.Он работает следующим образом: L2 = сумма всех L1 над ним, пока вы не встретите другой L2 выше.L3 = сумма всех L2 выше, пока вы не встретите другой L3 выше.

Аналогично для L4.Последний уровень - L5, в котором есть сумма всех L4 в столбце.

Кроме того, иногда существует автономный L2 (для которого нет подробных данных о разрыве L1), и его следует рассматривать как есть.Пример - Ячейка B10, которая имеет автономное значение 2, и сразу же в ячейке B9 есть еще один L2, который является суммой L1 над ней

Проблема в том, что иногда данные неверны и L2может не быть суммой всех L1 над ним (например, строка L1 могла быть пропущена базой данных).Мне нужно проверить в столбце C, если такая ошибка произошла.

Таким образом, мой вывод в столбце C должен иметь значения, аналогичные столбцу B для L2, L3, L4, L5, если нет ошибки.Или другие значения, если есть ошибка.

Диапазон является динамическим и состоит из сотен строк.

Любой макрос или существующая формула Excel могут выполнить это?

Я был бы очень признателен за любую помощь / код или указатели, которые я могу получить для этой проблемы.

Ниже приведен код детали, который я создал.Нужна ваша помощь для части комментариев.Спасибо за помощь.

Sub Ttals()
lastrow = Worksheets("EMEA").Cells(Rows.Count, "AB").End(xlUp).Row
Debug.Print lastrow
For i = 2 To lastrow
If Cells(i, 1) = "L1" Then
    Cells(i, 3) = Cells(i, 2) 'This is pasting L1 values from column B/2 to column C/3

ElseIf Cells(i, 1) = "L2" Then
'Insert a function to search rows above this cell for values:
'If immediately above - L2/L3/L4/L5/L6 are encountered, paste value from column B/2 for this row
'If immediately above L1 is encountered, keep going above till more L1 are encoutered,
'and when any other L are encountered, stop going up and take a sum of all L1 in this range and post the sum

ElseIf Cells(i, 1) = "L3" Then
'Insert similar function which I can modify myself once I get the above function for L2

End If
Next
End Sub

1 Ответ

0 голосов
/ 08 февраля 2019

Вот формула, которую вы можете использовать:

{=IF(VALUE(RIGHT(A1,1))>1,IF(COUNTIFS(INDIRECT("A1:A"&ROW()),A1)=1,SUMIFS(INDIRECT("B1:B"&ROW()),INDIRECT("A1:A"&ROW()),"L"&VALUE(RIGHT(A1,1))-1),SUMIFS(INDIRECT("B"&LARGE(IF($A$1:INDIRECT("A"&ROW())=A1,ROW($A$1:INDIRECT("A"&ROW()))-MIN(ROW($A$1:INDIRECT("A"&ROW())))+1),2)&":B"&ROW()),INDIRECT("A"&LARGE(IF($A$1:INDIRECT("A"&ROW())=A1,ROW($A$1:INDIRECT("A"&ROW()))-MIN(ROW($A$1:INDIRECT("A"&ROW())))+1),2)&":A"&ROW()),"L"&VALUE(RIGHT(A1,1))-1)),B1)}

Пробовал разные вещи, чтобы проверить значение строки выше, но формула массива одолела меня, поэтому ниже проверкадля 0:

{=IF(IF(VALUE(RIGHT(A1,1))>1,IF(COUNTIFS(INDIRECT("A1:A"&ROW()),A1)=1,SUMIFS(INDIRECT("B1:B"&ROW()),INDIRECT("A1:A"&ROW()),"L"&VALUE(RIGHT(A1,1))-1),SUMIFS(INDIRECT("B"&LARGE(IF($A$1:INDIRECT("A"&ROW())=A1,ROW($A$1:INDIRECT("A"&ROW()))-MIN(ROW($A$1:INDIRECT("A"&ROW())))+1),2)&":B"&ROW()),INDIRECT("A"&LARGE(IF($A$1:INDIRECT("A"&ROW())=A1,ROW($A$1:INDIRECT("A"&ROW()))-MIN(ROW($A$1:INDIRECT("A"&ROW())))+1),2)&":A"&ROW()),"L"&VALUE(RIGHT(A1,1))-1)),B1)=0,B1,IF(VALUE(RIGHT(A1,1))>1,IF(COUNTIFS(INDIRECT("A1:A"&ROW()),A1)=1,SUMIFS(INDIRECT("B1:B"&ROW()),INDIRECT("A1:A"&ROW()),"L"&VALUE(RIGHT(A1,1))-1),SUMIFS(INDIRECT("B"&LARGE(IF($A$1:INDIRECT("A"&ROW())=A1,ROW($A$1:INDIRECT("A"&ROW()))-MIN(ROW($A$1:INDIRECT("A"&ROW())))+1),2)&":B"&ROW()),INDIRECT("A"&LARGE(IF($A$1:INDIRECT("A"&ROW())=A1,ROW($A$1:INDIRECT("A"&ROW()))-MIN(ROW($A$1:INDIRECT("A"&ROW())))+1),2)&":A"&ROW()),"L"&VALUE(RIGHT(A1,1))-1)),B1)}

Обратите внимание, что это формула массива!Вставьте cel C1 как таковой и перетащите его вниз.

Он довольно длинный: P

...