- ベストアンサー
エクセルで空白行がある場合の計算
- エクセル2000で、空白行がある場合の計算方法についてアドバイスをお願いします。
- H列のデータ値をC列の日にち間隔で割り、I列に1日の平均値を表示したいですが、H列に空白がある場合は空白行の日にち間隔を足して平均値を求めたいです。
- 初心者のため、空白行の処理方法についてアドバイスをいただけると助かります。
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
No.7です。 補足に >最初の行は、日にち間隔が無いため・・・ とありますが、もしC列にデータがない場合は「0」で割ることになりますので、当然エラーになります。 仮にC列の最初の行だけが空白であるならば、2行目以降に数式を入れる方法があると思います。 前回の数式をそのまま利用し、I2セルに数式を入れるとすれば↓のような数式ではどうでしょうか? C列もしくはH列が空白の場合はI列は空白になるようにしてみました。 C2セルに =IF(OR(C2="",H2=""),"",IF(H1<>"",H2/C2,H2/(SUM($C$2:C2)-SUM($C$2:INDEX($C$2:C2,LARGE(IF($H$2:H2<>"",ROW($A$1:A1)),2)))))) ※ 前回同様に配列数式になってしまいますので、Shift+Ctrlキーを押しながらEnterキーで確定してみてください。 こんなんではどうでしょうか?m(_ _)m
その他の回答 (7)
- tom04
- ベストアンサー率49% (2537/5117)
こんばんは! ↓の画像のような配置だとして・・・ I2セルに =IF(H2="","",IF(H1<>"",H2/C2,H2/(SUM($C$2:C2)-SUM($C$2:INDEX($C$2:C2,LARGE(IF($H$2:H2<>"",ROW($A$1:A1)),2)))))) これは配列数式になってしまいますので、この画面からI2セルにコピー&ペーストする場合は I2セルに貼り付け後、数式バー内で一度クリック → 編集可能になりますので Shift+Ctrlキーを押しながらEnterキーで確定! 数式の前後に{ }マークが入り配列数式になります。 これをオートフィルで下へコピーすると画像のような感じになります。 以上、参考になれば良いのですが・・・m(_ _)m
補足
お礼が大変遅くなりました。 画像までつけていただき、分かりやすいです。 ありがとうございます。 大変参考になります。 最初の行は、日にち間隔が無いためエラー表示しますが 回避方法はありますか? 実際には印刷設定でエラーを横棒にしてますが・・・・ これにお気づきで、 よろしければお願いします。
- imogasi
- ベストアンサー率27% (4737/17069)
#3ですが、VBAだけの方法でなく、関数での方法を考えてみた。 例データ B-D列 D列は下記関数の結果 日にち間隔 データ値 1日平均値 2 4 2 1 3 4 1 18 2 2 3 1.5 3 1 1 15 3 3 2 1 18 3 ーー その行より上で、何日間(行)空白があるかの、ユーザー関数を定義すると 標準モジュールに Function up(a) Application.Volatile If a = "" Then up = "" Else up = a.Row - a.End(xlUp).Row '上方向に空白で在るセルも含めての行数 End If End Function ーー D2に =IF(C2="","",C2/SUM(OFFSET($B$1:$B$100,ROW()-up(C2),0,up(C2)))) と入れて下方向に式を複写する。 ーー 結果 上記D列。
- kagakusuki
- ベストアンサー率51% (2610/5101)
I2セルに次の関数を入力してから、I2セルをコピーして、I3以下に貼り付けると良いと思います。 =IF(ISNUMBER($D2),$D2/SUM(IF(COUNT($D$1:$D1)=0,$C$1,INDEX($C:$C,MATCH(MAX($D:$D)+1,INDEX($D:$D,1):$D1)+1)):$C2),"")
補足
お礼が大変遅くなりました。 C2行目がデータが0以下はエラー表示し、1以上だとエラー表示はしません。 実際は3行目からデータが入っていますが、日にちのB3行目が最初になるので C3行目は日にち間隔がとれません。が 問題はないです。
- 某HN クロメート(Chromate)(@CoalTar)
- ベストアンサー率40% (705/1742)
- imogasi
- ベストアンサー率27% (4737/17069)
VBAに縁が無かっただろうがVBAでやると、人間が電卓でやる場合と同じ理屈で、素直にプログラムが組める。 関数でやる場合の方が、経験を積んでいて、改めて考えて直ぐ出てくる人ばかりではなかろう。 こういう現在行より直前の不定数の空白行をとらえるのって難しい(適当な簡単な関数がない)。 参考までに。プログラムのコメントを読んで見てください。電卓でやる場合の考え方とそっくりです。 例データ 日にち 日にち間隔 データ値 1日平均値 - 14 42 - 3 15 - 2 - 2 - 1 10 - 1 2 - 3 - 4 21 ーー 標準モジュールに Sub test01() d = Range("A65536").End(xlUp).Row '最終データ行の割り出し 'MsgBox d For i = 2 To d '最終行まで毎行繰り返し If Cells(i, "C") = "" Then 'C列が空白なら k = k + Cells(i, "B") '間隔だけは足して、変数kに覚えておく Else 'C列が空白でない場合 k = k + Cells(i, "B") '間隔は空白分行分に加えて出す Cells(i, "D") = Cells(i, "C") / k '間隔合計でデータを和ってD列にセット k = 0 '空白行の間隔は使ったので0にしておく End If Next i End Sub ーーー 結果 日にち 日にち間隔 データ値 1日平均値 - 14 42 3 - 3 15 5 - 2 - 2 - 1 10 2 - 1 2 2 - 3 - 4 21 3 ただし C列が空白のデータで終わらない(最終行付近が空白でない)ものとする。
お礼
お礼が大変遅くなりました。 VBAには縁がありませんが、参考にさせて頂きます。 ありがとうございます。
- MASUKUBO
- ベストアンサー率22% (4/18)
1行目は項目名が入力されているとしてI2セルには次の式を入力して下方にオートフィルドラッグします。 =IF(H2="","",IF(ROW(A1)=1,H2/C2,ROUND(H2/SUM(INDEX(C:C,MATCH(10^10,H$1:H1)+1):C2),2))) 式では平均値が小数点以下3位で四捨五入されて小数点以下2位までが表示されるようにしています。
お礼
お礼が大変遅くなりました。 参考にさせて頂きます。 ありがとうございます。
- superski
- ベストアンサー率19% (388/2010)
count関数を使うか、 if関数で実数が入力してあるカラムの数を割り出して計算させれば良いかと。 例えば、Iの右隣の列に=if(RC[-1]>0.1,1)を計算させて、 SUMでまとめた数で割ってやればokでしょ。
お礼
お礼が大変遅くなりました。 参考にさせていただきます。
お礼
お気づきいただき、親切の補足回答頂きありがとうございます。 アドバイスいただいた式でうまくいきそうです。