- ベストアンサー
SUMPRODUCTで月毎の計の時に#VALUE!|対処法はある?
- WIN7 EXCELL2010を使用しています。添付図の質問文章中で、B14に日付を入力するとJ列に月が替わる際、#VALUE!が表示されます。D列に個数を入力すると正しく表示されますが、#VALUE!を表示しない方法はありますか?
- 質問文章中にあるSUMPRODUCTの式で、月毎の計算を行っています。しかし、特定の条件の場合に#VALUE!というエラーが表示されます。WIN7 EXCELL2010を使用している場合に、このエラーを回避する方法があれば教えてください。
- 質問文章の内容は、WIN7 EXCELL2010を使用している際に発生する問題についてです。具体的には、SUMPRODUCTを使用して月毎の計算を行っている際に、#VALUE!エラーが表示されることがあります。このエラーを回避するための方法をご教授いただけないでしょうか?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
H列の値が関数で""となっている場合は、そのセルの値は0などの数値と扱う事が出来なくなりますから、文字列に対して掛け算をした場合と同様の状態となってしまい、#VAUE!が表示されます。 但し、Excelでは "0" の様な数値を文字列データとしたものと同じ文字列に対してならば、四則演算は可能になります。 これを利用して、次の様にしますとエラーとはならずに済ます事が出来ます。 =IF(MONTH(B3)=MONTH(B4),"",SUMPRODUCT((MONTH(OFFSET($B$2,0,0,COUNT(B:B)))=MONTH(B3))*(0&OFFSET($H$2,0,0,COUNT(B:B))))) 但し、このままですと、例えばB3セルが1月の日付で、B4セルが空欄の場合、関数に拠らない純粋な空欄は数値の0、即ち1900年1月0日を表すシリアル値になりますから、J3セルには何も表示されない事になります。 又、COUNT(B:B)で行数を求めたのでは、B列の途中に空欄のセルか、文字が入力されているセルがある場合には、日付が入力されている最下段の行を正しく求める事は出来ません。 これらの弊害を排除するには、次の様にする方法があります。 =IF(TEXT($B3,"yyyy/m")=TEXT($B4,"yyyy/m"),"",SUMPRODUCT((TEXT($B$2:INDEX($B:$B,MATCH(9E+99,$B:$B)),"yyyy/m")=TEXT($B3,"yyyy/m"))*(0&$H$2:INDEX($H:$H,MATCH(9E+99,$B:$B))))) MATCH関数の照合の型を省略しますと、「『検査範囲内において、検査値よりも少しでも小さな数値が入力されているセルの中で、最後尾のセル』が検査範囲内で何番目のセルになるのか」を示す数が返されます。 ですから、検査値に「『検査範囲内に含まれている最大値』よりも大きな数」を指定しますと、「『検査範囲内に含まれている最大値』よりも大きな数」よりも少しでも小さな数が入力されている最下段の行、即ち、数値が入力されている最下段の行が、検査範囲内で数えて上から何番目の行にあたるのかを示す数が返される事になりますから、これをCOUNT(B:B)の代わりに使う訳です。 しかしながら、SUMPRODUCT関数は「繰り返し計算」を行う関数であるため、指定する行範囲に含まれる行数(或いは列範囲に含まれる列数)が多くなりますと、計算処理が重くなり、計算結果が出るまでに時間が掛かるという短所があります。 このため、SUMPRODUCT関数を使わずに済む場合には、SUMPRODUCT関数の使用は避けた方が無難です。 御質問の件に関しましても、SUMPRODUCT関数を使わずに、次の様な関数としますと、計算が重くならずに済みますので、こちらの方を使用される事を御勧め致します。(「B3セルの日付の翌月の1日よりも前の日付」の合計額から、「B3セルと同月の1日よりも前の日付」の合計額を差し引いた額を求める関数です) =IF(TEXT($B3,"yyyy/m")=TEXT($B4,"yyyy/m"),"",SUMIF($B:$B,"<"&DATE(YEAR($B3),MONTH($B3)+1,1),$H:$H)-SUMIF($B:$B,"<"&DATE(YEAR($B3),MONTH($B3),1),$H:$H))
その他の回答 (3)
- MarcoRossiItaly
- ベストアンサー率40% (454/1128)
ああ、そうですね。No.1さんのおっしゃるとおり H 列で「""」を返しているから、このままじゃエラーですね。次式にすると、H 列にゼロを表示する代わりに、J 列のエラーは解消されるかもしれません。ベストアンサーは辞退します。 H列 =IF(G3="",,D3*G3)
お礼
早速ご回答いただきありがとうございます。 私のミスで画像を添付していなくて下記のアドレスで再質問させていただき御迷惑をおかけしました。 お許しください。 http://oshiete.goo.ne.jp/qa/7852709.html
- MarcoRossiItaly
- ベストアンサー率40% (454/1128)
数式だけ見ててもよく分かりませんが、なんか月が変わるタイミングでだけ、その月の H 列にある何かの合計を数えてるのですね。 よく分かりませんが、SUMPRODUCT 関数で「#VALUE!」というエラー値が出る原因としてよくあるのは、「SUMPRODUCT(配列*配列)」という書式と「SUMPRODUCT(配列,配列)」の違いによって発生するものです。前者では文字列が配列の一部に含まれているとエラーになりますが、後者では文字列のある行を無視するのでエラーになりません。 この考えでご相談の数式を修正するなら、式中の「*」を「*1,」に直してみてください。ただし、あえてエラーを表示したい場合は、修正しないというのもアリかと。 今回の原因がこのせいだったとしたら、問題の文字列が存在しているのは、H 列でしょうね。
お礼
早速ご回答いただきありがとうございます。 私のミスで画像を添付していなくて下記のアドレスで再質問させていただき御迷惑をおかけしました。 お許しください。 http://oshiete.goo.ne.jp/qa/7852709.html
- MackyNo1
- ベストアンサー率53% (1521/2850)
#VALUE!エラーが表示されるのはH列に空白「文字列があるためです。 空白文字列を無視して(0とみなして)計算するにはJ列のSUMPRODUCT式の部分を以下のように変更する必要があります。 SUMPRODUCT((MONTH(OFFSET($B$2,0,0,COUNT(B:B)))=MONTH(B3))*1,OFFSET($H$2,0,0,COUNT(B:B)))
お礼
早速ご回答いただきありがとうございます。 ご指導いただいた数式で試してみました。 バッチリでしたが勝って言いますと空白部分かないのが非常に残念です。 私のミスで画像を添付していなくて下記のアドレスで再質問させていただき御迷惑をおかけしました。 お許しください。 http://oshiete.goo.ne.jp/qa/7852709.html
お礼
いつもお世話になります。 お示しいただいた数式で試しましたが 下記の数式を採用させていただきました。 =IF(TEXT($B3,"yyyy/m")=TEXT($B4,"yyyy/m"),"",SUMIF($B:$B,"<"&DATE(YEAR($B3),MONTH($B3)+1,1),$H:$H)-SUMIF($B:$B,"<"&DATE(YEAR($B3),MONTH($B3),1),$H:$H)) こういう時は当たり前的に SUMPRODUCTを良く使うのですがこの数式では思いつきませんでした。 詳細にご説明していただき本当にありございました。 今後ともご指導よろしくお願いします。