わかりました、これはしばらくの間私を悩ませてきた問題であり、私は本当にそれを解決したと思っていましたが...
次のワークシートを検討してください。
データ セルには数値 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 の下に行を挿入すると、この新しい行は合計範囲外になります。このスプレッドシートは、多くの異なるプロジェクトの建設工事の請求書を作成するためのテンプレートとして使用するため、各サブセクションの行数がそれぞれ異なるため、数万ドル相当の項目を除外することは問題です。