1

わかりました、これはしばらくの間私を悩ませてきた問題であり、私は本当にそれを解決したと思っていましたが...

次のワークシートを検討してください。

スプレッドシート

データ セルには数値 1 のみが含まれ、合計セルには示されている数式が含まれています。これはすべて機能します。

次の名前を使用します (説明付き)。

RangeAboveAll
=INDIRECT(CONCATENATE(ADDRESS(1,COLUMN()),":",ADDRESS(ROW()-1,COLUMN())))

1 番目の ADDRESS 関数は現在の列の最初のセルのアドレスを返し、2 番目の ADDRESS 関数は現在のセルの上のセルを返します。これらは : で CONCATENATE され、INDIRECT 関数に渡されて範囲参照に変換されます。一番上の行で使用するとエラーが発生することに注意してください。

BlankRowAbove
=IFERROR(SMALL(IF(ISBLANK(RangeAboveAll),ROW(RangeAboveAll),""),
COUNTIF(RangeAboveAll,"")),0)

IF 関数は、セルが ISBLANK の場合は列番号、そうでない場合は 0 の RangeAboveAll に対応するリストを作成します。これは、空白セルの数をカウントする COUNTIF 引数を使用して SMALL 関数に渡されます。したがって、SMALL は最後の空白セルの列番号を返します。これは、空白セルがない場合に対処するために IFERROR にラップされます。

RangeAboveBlock
=INDIRECT(CONCATENATE(ADDRESS(1+BlankRowAbove,COLUMN()),":",
ADDRESS(ROW()-1,COLUMN())))

RangeAboveAll 名と同じ手法を使用して、これは最後の空白セルの列 (ない場合は 0) を取得し、このセルの下 1 から始まり、現在のセルの上 1 で終わる範囲を返します。現在のセルのすぐ上のセルが空白の場合、循環参照が作成されますが、これは問題ありません。

私が言ったように、これはすべて、一番上のブロックのデータ セルの 1 つが一番下のブロックの結果を参照するまで正常に機能します。たとえば、CellB1の式が=B10.

これがダイナミック レンジなしで行われた場合、これは循環参照ではありませんが、ダイナミック レンジは上記のすべてのセルを計算してそれらを除外する必要があるため、循環参照がポップアップします。

以下で何が起こっているかの要約で始まるスプ​​レッドシートがあるため、これは特別な問題です。反復をオンにすることで修正できるようになりましたが、それでは他の問題が発生する可能性があります。コードで実装することもできますが、これだけのためにマクロを有効にする必要はありません。

この問題を回避するこの種の名前付き範囲を構築する方法を誰かが見ることができますか?

背景情報については、これが克服しようとしている特定の問題 (ユーザー エラー) があります。B13に静的数式があり、=SUBTOTAL(B7:B12,9)B7 の上または B12 の下に行を挿入すると、この新しい行は合計範囲外になります。このスプレッドシートは、多くの異なるプロジェクトの建設工事の請求書を作成するためのテンプレートとして使用するため、各サブセクションの行数がそれぞれ異なるため、数万ドル相当の項目を除外することは問題です。

4

2 に答える 2

0

合わないかもしれませんが、コメントよりも余裕が必要です!

データが左側のように始まり (小計の「グループ化ルール」を提供するために ColumnA を挿入しました)、小計を適用すると、結果は右側のようになります。

SO18395841 の例

関連する部分は、C2 (つまり、B2 が 1 列右にシフトした) には、その下のセルを参照する数式が含まれていることです (具体的には、B10 だったもの、つまり B8 と B9 の合計でした)。

反復をオンにせずに小計を使用しても、循環参照は生成されませんでした。(数式は自動的に に調整され=SUM(C8:C9)ます。

注意してください、私はほとんど同じことが「あなたのやり方で」達成できると思います-代わりに を=B10 使用します=B8+B9

于 2013-08-23T07:47:25.697 に答える
0

なぜ使用しないのOFFSETですか?

[C6]  =SUM(OFFSET(C5;1-B6;0;B6;1))
于 2013-08-23T08:37:05.660 に答える