次の方法で共有

セルアドレスを$で固定指定しても、行や列の削除などを行うと更新されてしまう

Anonymous
2015-09-30T23:10:27+00:00

たとえばC2に以下の数式があります。

=SUM(C$3:INDIRECT("C"&LOOKUP(1,0/(C1:C**$1000**<>""),ROW(1:$1000))))

C3に500

C4に300

C5に400

が入っています。

このとき当然ながら、C2は1200となります。

このあと4行目を削除するとC2の数式は

=SUM(C$3:INDIRECT("C"&LOOKUP(1,0/(C1:C**$999**<>""),ROW(1:$999))))

となります。

固定指定してあるのに、なぜ更新されるのでしょうか?

あと、3行目を削除するとC2の数式は

=SUM(#REF!:INDIRECT("C"&LOOKUP(1,0/(C1:C$997<>""),ROW(1:$997))))

となり参照エラーになります。

Microsoft 365 と Office | Excel | 家庭向け | Windows

ロックされた質問。 この質問は、Microsoft サポート コミュニティから移行されました。 役に立つかどうかに投票することはできますが、コメントの追加、質問への返信やフォローはできません。

0 件のコメント コメントはありません

15 件の回答

並べ替え方法: 最も役に立つ
  1. Anonymous
    2015-10-01T07:41:21+00:00

    こんにちは。

    > 固定指定してあるのに、なぜ更新されるのでしょうか?

    それは戸島さんの理解が間違っています。

    $F$5 という式での $ の役割は、

     "F" や "5" という 文字表記を固定 するものではありません。

    式を記入した時のF5 セルを参照****する ことを固定するものです。

    式が記入されているセルがコピー/移動されても、

    F5 セルよりも内側(シートのトップセルに近い側)で挿入/削除をしても、

    式を記入した際の F5 セル を参照し続けなさい』 というものです。

    4行目を削除すれば、削除前に 『 C1000 』 であったセルは 『C999 』になります。

    その結果、式が、書かれているように変更されるのは 、

    エクセルの正しい動作であり、絶対参照という機能の正しい結果です。

    同様に、3行目を削除すれば、その3行目の中にある『C3 』セルも消えます。

    削除後に繰り上がって C3 セルになったセルは

    式記入時の C3 セルではありません

    『式記入時の C3 セルを参照し続けなさい』と言う指定をしておいて、

    その参照先を消し去ったのですから、エクセルから

    【それはエラーです】 といわれるのは正しい動作であり、期待通りの結果です。

    10+ 人がこの回答が役に立ったと思いました。
    0 件のコメント コメントはありません
  2. Anonymous
    2015-10-01T10:11:26+00:00

    >やりたいことは、行の挿入や削除をしても、参照範囲(セルそのものではなく、そのときのC3からC1000までの範囲)を変えたくないので、なにかよい方法ないでしょうか?

    このような場合にこそ、セル範囲を文字列で指定できるINDIRECT関数を使うことになります。

    =SUM(INDIRECT("C3:C"&LOOKUP(1,0/(INDIRECT("C1:C1000")<>""),ROW(INDIRECT("1:1000")))))

    なお上記の関数ならC3セルを削除しても新たなC3セルからの集計ができますのでエラーが表示されません。

    >あとできれば1000ではなく最終行までとしたいのですが。(個人で使うので1000行で十分ですが。)

    一般に、検索系の関数や配列数式では数式範囲を必要以上に大きくすると(たとえば列全体を指定する)、再計算に時間がかかりシートの動きが重くなるので、お勧めできません。

    8 人がこの回答が役に立ったと思いました。
    0 件のコメント コメントはありません
  3. Anonymous
    2015-10-02T01:18:37+00:00

    今回の場合そもそも INDIRECTを使う必要自体がないように思います。

     =SUM(C:C)-SUM(C$1:C$2)

    でいいはずです。この式を C2に入れてますという場合でも D2に「★」などを入れて

     =SUMIF(D:D,"<>★",C:C)

    とすれば済みます。

    基本的に配列計算と揮発性の関数を組み合わせるのは避けた方がいいと思います。

    3 人がこの回答が役に立ったと思いました。
    0 件のコメント コメントはありません
  4. Anonymous
    2015-10-01T12:13:51+00:00

    >結局数式はこうなりました。

    =IF(ISERROR(LOOKUP(1,0/(INDIRECT("$C$3:$C1000")<>""),ROW(INDIRECT("$3:$1000")))),,SUM(INDIRECT("$C$3"):INDIRECT("C"&LOOKUP(1,0/(INDIRECT("$C$3:$C$1000")<>""),ROW(INDIRECT("$3:$1000"))))))

    まずINDIRECT関数のセル参照は文字列なので絶対参照にする必要はありません。

    またIF関数とISERROR関数を使っていますが、エラーが出ることはないのではないでしょうか?

    最終的な数式は以下のような関数でよいと思います。

    =SUM(INDIRECT("C3:C"&LOOKUP(1,0/(INDIRECT("C3:C1000")<>""),ROW(INDIRECT("3:1000")))))

    >これひとつきを上旬、中旬、下旬にシートを分けて、同じ数式を3シートに記述しています。

    同じレイアウトのシートなら、シートを作業グループにして、1つのシートに入力すればすべてのシートに同じ数式を入力することができます。

    具体的には、Ctrlキーを押しながら上旬、中旬、下旬シートのシート名をクリックして選択し(これで作業グループになります)、どれか1つのシートの数式入力セルに数式を入力してEnterすればすべてのシートの同じセル番地に同じ数式が入力できます。

    最後に別のシートを選択して(シート名を右クリックして「作業グループ解除」)、作業グループを解除してください。。

    1 人がこの回答が役に立ったと思いました。
    0 件のコメント コメントはありません
  5. Anonymous
    2015-10-01T09:02:13+00:00

    Tsunodaさん、ありがとうございます。

    理解できました。

    セルアドレスの文字列で参照しているのではなく、セルそのものを参照しているということですね。

    やりたいことは、行の挿入や削除をしても、参照範囲(セルそのものではなく、そのときのC3からC1000までの範囲)を変えたくないので、なにかよい方法ないでしょうか?

    あとできれば1000ではなく最終行までとしたいのですが。(個人で使うので1000行で十分ですが。)

    ありがとうございました。

    1 人がこの回答が役に立ったと思いました。
    0 件のコメント コメントはありません