![列Aの特定の値を持つ前の行を検索します](https://rvso.com/image/1452870/%E5%88%97A%E3%81%AE%E7%89%B9%E5%AE%9A%E3%81%AE%E5%80%A4%E3%82%92%E6%8C%81%E3%81%A4%E5%89%8D%E3%81%AE%E8%A1%8C%E3%82%92%E6%A4%9C%E7%B4%A2%E3%81%97%E3%81%BE%E3%81%99.png)
セマンティックな「ヘッダー」、「サブヘッダー」、および「小計」行がある上記のサンプル シートを前提として、現在のセルを基準として前のサブヘッダー行を見つける数式を決定しようとしています。たとえば、数式を に入力するとF5
行 が見つかり2
、 に入力するとF17
行 が見つかります13
。
H
行は、値、S
またはT
列の存在によって、ヘッダー、サブヘッダー、または小計として条件付きで書式設定されます。つまり、$A:$A
サブヘッダー行n
は の行です$An = "S"
。ここで、この概念を数式に拡張したいと思います。
ヘッダー行の後には必ずサブヘッダーが続きます (そのため、ヘッダーとサブヘッダーの順序が間違っていることを心配する必要はありません)。
私は次のことを試しました:
=MATCH("S", OFFSET($A5, 0, 0, -ROW($A5), 1), 0)
これは常に行を返します
2
。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)
配列が残りますが、これは の有効な数値パラメータでは-{5}
ありません(ビットを ではなく配列にしたかったのですが、Excel では区別できません)。height
OFFSET
IF(OFFSET(...)="S",...)
-ROW($A5)
現在、Excel 2010 をターゲットにしています。以前のバージョンは適用できません (ただし、上位互換性は利点です)。*.xlsx ファイルを配布するよりも *.xlsm ファイルを配布する方が困難なため、VBA は避けるようにしています (また、VBA で配布する方法はすでにわかっています)。
他に試せることはありますか?
答え1
これを行う簡単な方法は、絶対/相対の混合数式をチートして使用することです。これは、セルに入力された配列数式 (CTRL+SHIFT+ENTER で入力) ですB4
が、行 4 のどこにでも配置できます。マークされた行の行番号を返しますS
。
=MAX(IF($A$1:A4="S",ROW($A$1:A4)))
コピーすると、参照の2番目の部分B4 and A4
が増加します。これにより、最大の一致を持つ行が確実に取得されます。その上現在の行。F4関連する範囲を入力/選択した後、 を使用してこれらの数式をより速く入力できます。 これにより、すべての選択肢でドル記号が循環します。
範囲の写真
数式を置き換えるために使用
質問を少し読んだ後(そして @SteveTaylor による編集に基づいて)、これを使用する目的は数式を更新することであるようです。上記から返された行を使用して、INDEX
合計するデータの範囲を取得できます。置き換えることができる 2 つの数式があります。
- ラベル付けされたデータ行ごとに合計を計算します。この場合、上の小計行を動的に参照できます。
- 小計行の合計計算。この場合、上から合計する値は動的に参照できます。
単一行データの場合は、配列数式として開始する数式を使用できますF3
。 を使用するように切り替えたSUMPRODUCT
ため、2 列を超えるデータへの移動がはるかに簡単になったことに注意してください。
=C3*SUMPRODUCT(INDEX(D:E,MAX(IF($A$1:A3="S",ROW($A$1:A3))),),D3:E3)
合計行の数式には、 から始めてF11
、再び配列数式を使用できます。
=SUM(F10:INDEX($F$1:F10, 1+MAX(IF($A$1:A11="S",ROW($A$1:A11)))))
IF
1 つの数式ですべてを制御したいという場合は、列の値に基づいてこれらをネストして結合できますA
。以下は、 から始まる配列数式で、F2
下にコピーできます。
=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)))
この数式は、空白行と「データ」行を区別しません。現在、スペーサー行には 0 が返されますが、これは問題ありません。
および式の結果の画像データの 2 つのブロックに対して。