의미 론적 'header', 'subheader'및 'subtotal'행이있는 위의 샘플 시트가 주어지면 현재 셀을 기준으로 이전 하위 헤더 행을 찾는 수식을 결정하려고합니다. 예를 들어 수식이에 입력 된 경우 F5
행을 찾고에 2
입력하면 F17
행을 찾습니다 13
.
행이 조건 값의 존재에 의해, 헤더, 서브 헤더 또는 합계로 포맷되고 H
, S
또는 T
열에서 $A:$A
, 즉, 서브 헤더의 행 n
위치를 행이다 $An = "S"
. 이제이 개념을 내 공식으로 확장하고 싶습니다.
헤더 행 다음에는 항상 하위 헤더가옵니다 (따라서 순서가 잘못된 헤더와 하위 헤더에 대해 걱정할 필요가 없습니다).
나는 다음을 시도했다 :
=MATCH("S", OFFSET($A5, 0, 0, -ROW($A5), 1), 0)
집합에서 첫 번째 일치 항목을 반환하고 높이를 제한 할 수 2
없기 때문에 항상 row 를 MATCH
반환합니다 (즉, 이전 하위 헤더 위치를 알 수 없기 때문에 재귀 적으로).OFFSET
{=LARGE(MATCH("S", OFFSET($A5, 0, 0, -ROW($A5), 1), 0), 1)}
이것은 또한를 반환합니다 2
. 왜냐하면 배열 컨텍스트 (즉, Ctrl+ Alt+ 사용 Enter)에서도 MATCH
여전히 첫 번째 결과를 반환하기 때문입니다.
=LARGE(IF(OFFSET($A5, 0, 0, -ROW($A5), 1)="S", ROW(OFFSET($A5, 0, 0, -ROW($A5), 1))), 1)
이 반환 0
하기 때문에, IF
여기에 배열을 기대되지 않으므로 확장 OFFSET($A5, 0, 0, -ROW($A5), 1)
한 값 0
과 일치하지 않는, "S"
및 LARGE
취급 FALSE
숫자로;
{=LARGE(IF(OFFSET($A5, 0, 0, -ROW($A5), 1)="S", ROW(OFFSET($A5, 0, 0, -ROW($A5), 1))), 1)}
이것은 #VALUE
배열 확장이 너무 일찍 일어나기 때문에를 반환합니다 . 이는 유효한 숫자 매개 변수 가 아닌 -ROW($A5)
array 로 남겨 집니다 ( 비트가 비트가 아닌 배열 이기를 원했지만 Excel을 구별 할 수 없음).-{5}
height
OFFSET
IF(OFFSET(...)="S",...)
-ROW($A5)
현재 Excel 2010을 대상으로하고 있습니다. 이전 버전은 적용 할 수 없습니다 (향후 호환성은 보너스이지만). * .xlsx보다 * .xlsm 파일을 배포하는 것이 더 어렵 기 때문에 VBA를 사용하지 않으려 고합니다 (게다가 VBA로 수행하는 방법을 이미 알고 있습니다).
내가 시도 할 수있는 다른 것이 있습니까?
이를 수행하는 쉬운 방법은 절대 / 상대적 혼합 공식을 속이고 사용하는 것입니다. 이것은 셀에 입력 된 배열 수식 (CTRL + SHIFT + ENTER로 입력) B4
이지만 4 행의 어느 곳 으로든 이동할 수 있습니다 S
.으로 표시된 항목의 행 번호를 반환합니다 .
=MAX(IF($A$1:A4="S",ROW($A$1:A4)))
아래로 복사하면 참조의 두 번째 부분 B4 and A4
이 증가합니다. 이렇게하면 현재 행 위에 가장 많이 일치하는 행을 얻을 수 있습니다. F4관련 범위를 입력 / 선택한 후 사용하면 이러한 수식을 더 빠르게 입력 할 수 있습니다 . 이것은 모든 선택을 통해 달러 기호를 순환합니다.
범위 그림
수식을 대체하는 데 사용
질문을 조금 읽은 후 (및 @SteveTaylor의 편집 내용을 기반으로 함) 수식을 업데이트하는 데 사용하는 것 같습니다. 위에서 반환 된 행을 함께 사용 INDEX
하여 합계 할 데이터 범위를 가져올 수 있습니다. 대체 할 수있는 두 가지 공식이 있습니다.
For the single row data, you can use the formula, starting in F3
as an array formula. Note that I switched over to using SUMPRODUCT
which makes it much easier to go to more than 2 columns.
=C3*SUMPRODUCT(INDEX(D:E,MAX(IF($A$1:A3="S",ROW($A$1:A3))),),D3:E3)
For the total row formula, you can use, starting in F11
, again array formula:
=SUM(F10:INDEX($F$1:F10, 1+MAX(IF($A$1:A11="S",ROW($A$1:A11)))))
If you want one formula to rule them all! then you can combine these into a nested IF
based on the value in column A
. Here is said array formula, starting in F2
which can be copied down.
=IF(
A2="S",
SUM(D2:E2),
IF(A2="T",
SUM(F1:INDEX($F$1:F1, 1+MAX(IF($A$1:A2="S",ROW($A$1:A2))))),
C2*SUMPRODUCT(INDEX(D:E,MAX(IF($A$1:A2="S",ROW($A$1:A2))),),D2:E2)))
This formula does not differentiate between a blank row and a "data" row. It currently returns 0 for the spacer row which is fine.
데이터의 두 블록에 대한 결과 및 공식 그림 .
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다