プロが教えるわが家の防犯対策術!

  A  B  C
1 ○  1
2 ×  2
3 ×  3
4 ○  0.5
5 ×  2
6...

以上の様なマトリクスにて。
A列が条件セル,B列がデータセルとします。

C列セルを計算セルに,
(1)同行のA列が○ならば「0」。
  例:C1=0
(2)同行のA列が×ならば,
  そこより上段で,最も近い○からの差分を計算。
  例:C2=2-1=1
    C3=3-1=2
    C5=2-0.5=1.5

としたいのです。

うまいやり方をご教授いただけないでしょうか?

A 回答 (7件)

No4の配列数式の回答がNo1とかぶったので、参考までに。



提示した可変のセル範囲を入力した配列数式は、表示する数が多いと数式でのメモリーを多く消費するうえ、配列数式の再計算に時間がかかるなどのデメリットもあります。

よく考えたら、配列を使わなくても以下のような数式のほうがメモリー消費や計算負荷が少ないので、はるかに勝れた数式ですね。

=IF(A2="","",(A2="×")*(B2-B1+C1))

この回答への補足

おお,これはスマート!
ありがとうございます。
ところで,これIF構文はいらずに
=(A2="×")*(B2-B1+C1)
の部分だけでいいような気がするのですが,なにか理由があるのでしょうか?

補足日時:2011/09/28 10:58
    • good
    • 0

>ところで,これIF構文はいらずに


=(A2="×")*(B2-B1+C1)
の部分だけでいいような気がするのですが,なにか理由があるのでしょうか?

計算の基本部分とは関係ありませんが、今後のデータの追加に対応できるようにする(あらかじめA,B列が未入力のセルに数式を入力した場合に空白表示させる)ために、IF文を付けてみました(データの入力行だけに数式を入れるなら、もちろん必要ありません)。
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2011/09/28 11:58

余りエクセル関数の経験がないなら、A-C以外の列に作業列を作って考えるのが良い。

そういう回答が出ていますが、賛成を1票投じたい。
A列    B列     C列    D列(作業列)
○101
×211
×321
○0.500.5
×21.50.5
D1式は=b1
D2の式は =IF(A2="○",B2,D1)
下方向に式を複写
C1に =B1-D1
下方向に式複写
===
この問題の難しさは各行によって、引くデータのセルが変わることであり、どの行かはデータの有様による。
VBAなら○の行のB列の値を変数に記憶しておいて、次の行からその値を次の○の行まで使える。
Sub test02()
d = Range("A65536").End(xlUp).Row
m = Cells(1, "B")
For i = 1 To d
If Cells(i, "A") = "○" Then
Cells(i, "C") = 0
m = Cells(i, "B")
Else
Cells(i, "C") = Cells(i, "B") - m
End If
Next i
End Sub
=====
その行まで出一番下の丸の行のB列の値を使えば良いから
A列でそこの行までで、 最下行の○の行番号は
=SUMPRODUCT(MAX((($A$1:A2="○")*(ROW($A$1:A2)))))
これを使って
C2に=B2-INDEX($A$1:$B$100,SUMPRODUCT(MAX((($A$1:A2="○")*(ROW($A$1:A2))))),2) と入れて下方向に式複写。
C1は0を入れておく。
ーーー
例データ
A列   B列     C列
○10
×21
×32
○0.50
×21.5
×10.5
×10.5
○30
×63
×74
×96
○60
×4-2
上記C列が結果
    • good
    • 0
この回答へのお礼

VBAもなれていかんとな・・・
試してみます,ありがとうございます。

お礼日時:2011/09/28 11:01

例示のレイアウトならC2セルに以下の式を入力して下方向にデータ数分オートフィルコピーしてください。



=(A2="×")*(B2-INDEX(B:B,MAX(INDEX(($A$1:A1="○")*ROW($A$1:A1),))))
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2011/09/28 11:02

自分だったらですが、BとCの間に作業列を作ります。



C列:最後に○があった行の数字
C1:=B1
C2:=IF(A2="○", B2, C1)
C3~:C2をコピペ

とすれば、

D列:質問の条件
D1:=IF(A1="○", 0, B2-C2)
D2~:D1をコピペ

とか。
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2011/09/28 11:00

自分ならあんまり複雑にしたくないので2段構えにします。



C列に最後の○が現れたときのB値を記録
C1=B1
C2=if(A2="○",B2,C1)
以下C2をフィル

D列にご希望の「○なら0」「それ以外ならB値との差」
D1=if(A1="○",0,B1-C1)
以下D1をフィル
    • good
    • 0
この回答へのお礼

これはわかりやすい。
今回はこれを採用させて頂きます。
ありがとうございます。

お礼日時:2011/09/28 11:01

一例です。


=IF(A1<>"",B1-INDEX(B:B,MAX(INDEX(($A$1:A1="○")*ROW($A$1:A1),))),"")
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2011/09/28 11:02

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!