- ベストアンサー
エクセルで再計算のエラーが出る
- エクセルでINDEX関数と循環参照を使った表を作成していますが、一部のセルで再計算エラーが発生しています。具体的には、INDEX関数が参照するデータが入力されていない場合にエラーが発生します。また、循環参照がうまく再計算されず、#NUM!というエラーが表示されることもあります。
- エラーの回避方法としては、まずINDEX関数が参照するデータが入力されていることを確認することです。また、循環参照の再計算がうまくいかない場合は、エクセルのオプションを設定し直すことで解決できることがあります。具体的には、数式のブックの計算を自動に設定し、反復計算を行うオプションにチェックを入れて、反復回数を適切に設定することです。
- 最終的には、グラフやマクロを使用して一括で印刷することが目標です。そのためには、エラーが発生しないようにデータを入力し、循環参照の再計算が正常に行われるように設定する必要があります。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
自信たっぷりに間違ってませんと言い切りましたね。 ご自分の文章と実際のエクセルを照合したり、あるいは指摘を受けてどこか間違えてないかを探したり、あるいは回答の数式はそこをキチンと説明している事などに気が付かなかったようです。 循環参照の使い方も、循環参照を使って何を計算したいのかも、完全に把握しています。一応そのうえで間違いを指摘しておくと 1)平均の10分の1以下もデータ無しとするので(if(A1<A102,""の部分) →A102はご説明のどこにも出てきません。回答では修正済みです。 2)平均の10分の1は29.4です。 →B102の数式は確かに循環参照していますが、循環参照させたいのはそうじゃありません。回答では必要な1/10だけ説明しています。 3)B1からB10に#NUM!#NUM!#NUM!… →B1からB10に10個のエラーが発生する、というご説明をされています。 でもエラーが直接の原因は、B1からB10の他に「もう一個」、平均値を求めているセル(B101)でもエラーを発生しているからです。(余談ですがもう一個、平均値の1/10も当然エラーになります) そしてAVERAGE関数は、対象セル範囲に「一つも数字が無い場合に」#NUMではなく#DIV/0エラーを発生します。結果してB1からB10の全てのセルが、AVERAGE関数のエラーに引っ張られて#DIV/0になります。 ついでに 4)IFERROR関数を使うと、「#NUM!」の時には任意の何かを表示させるだけで、循環参照が動いているわけではなくなる →この認識も間違いです。 「AVERAGE関数がエラーになる」場合、循環させるべき値がそもそも存在しないため、IFERRORで循環を切って暫定的な値を表示します(今回は""を表示します)。 その後A列に数字が現れるとエラーは解消され、回答の数式により意図した通りの計算結果が現れます。 さて。以上から推測されるのは、あなたのご相談と補足は「実際にご自分のエクセルを確認したり、回答を試してみる」といった事実確認をしていない、ただの「説明のための説明」だということです。ヒトの話を聞いて、まずはその通り実際にご自分の手を動かしてやってみる所から始めてみてはいかがですか。
その他の回答 (2)
- bunjii
- ベストアンサー率43% (3589/8249)
>エクセルで、INDEX関数と循環参照を使って表を作っています。 循環参照を使うと正しい結果が得られません。 従って、最大反復回数と変化の最大値を指定します。 反復回数が少ないと目的の値とかけ離れた結果になります。 >Sheet2のC1に1~3の数値を入力した時は問題ありませんが、4を入力したらB列は全て「#NUM」と表示されます。 A列とB列の値はどのようになっているかによって対処方法が異なります。 >セルB1に「=if(A1="","",if(A1=0,"",if(A1<A102,"",A1)))」 >セルB2~B100までB1と同様の計算式 >セルB102に「=B102/10」 >セルB101に「=average(B1:B100)」 論理が合いません。 >どのようにすれば、これを回避できるでしょうか? エラーの表示を回避するだけであればIFEROOR関数でエラーのとき""にすれば良いでしょう。 信憑性のある値に近づけたいのであれば反復回数を順次増やしてみることになるでしょう。
お礼
どうもありがとうございました。
- keithin
- ベストアンサー率66% (5278/7941)
B1,B102としてご相談に提示された数式は,恐らくあなたの実際のエクセルの内容とは違う間違った数式です。あるいはもしかすると言葉のご説明に誤りがあります。 また「#NUM!が出る」というご説明も誤りですね。 簡易にはB102に10分の1を入れておき B1: =IF(A1="","",IF(A1=0,"",IF(A1<IFERROR($B$102,0),"",A1))) 以下コピー とでもしてみます。 IFERRORの時ゼロでいいのかは,あなたのエクセルの実際のデータに応じて適切に調整して下さい。
補足
ご回答ありがとうございます。 説明不足だったかもしれませんが、私が記入した式に間違いはありません(絶対参照を抜かしていることを除いて)。 私の数式は循環参照をすることを前提にして作っています。 100日分のデータは多すぎるので、ここでは10日分のサンプルでご説明します。 18 0 576 515 _ 37 422 415 367 299 という10日間のデータがあったとします。 ここでは「_」はデータが無いことを意味することとします。 この場合は9日分のデータしかなく、平均は294になり、平均の10分の1は29.4です。 「=if(A1="","",if(A1=0,"",if(A1<A102,"",A1)))」 私が質問時に記入したこの式では、0もデータ無しと同じ扱いをするので、 18 _ 576 515 _ 37 422 415 367 299 と変化し、平均は331になります。 平均の10分の1以下もデータ無しとするので(if(A1<A102,""の部分)、 _ _ 576 515 _ 37 422 415 367 299 と変化し、平均は375で、平均の10分の1以下は37.5です。 37.5以下がもう一か所あるのでさらに処理され、 _ _ 576 515 _ _ 422 415 367 299 というデータになったところで処理を終える という循環参照を入れています。 つまりA1からA10に 18 0 576 515 _ 37 422 415 367 299 と入っていれば、B1からB10に _ _ 576 515 _ _ 422 415 367 299 と表示されるようになります。 これらを、INDEX関数を使って順番に表示することになるのですが、 データが全くないケースを一度表示させると、その後INDEX関数で元のケースに戻っても、 A1からA10に 18 0 576 515 _ 37 422 415 367 299 が表示されても、B1からB10に #NUM! #NUM! #NUM! #NUM! #NUM! #NUM! #NUM! #NUM! #NUM! #NUM! と表示されてしまいます。 回答してくださったkeithinさんのIFERROR関数を使うと、「#NUM!」の時には任意の何かを表示させるだけで、循環参照が動いているわけではなくなるので、結局処理が止まったままとなります。 手を付けていただきまして恐縮でしたが、私のしたい方向と少し違っていたかと思います。
お礼
A102のところが間違っていました。 ご指摘ありがとうございました。 そもそもの、INDEX関数で作っているところにエラーがあったのがわかりました。 そこにIFERROR関数を入れたら、循環も全て解決しました。 どうもありがとうございました。