dポイントプレゼントキャンペーン実施中!

やりたいことは以下の通りです。

1.A列を今の行から下に見ていき、最初の空白を見つける。(以下の例で今の行を1行目とした場合、A1から見ていって4行目のA4セルが空白)
2.B列について、今の行から1で見つけた行の1つ前の行を見ていき、値が-または空白のセルがあれば0、そうではなければ1を返す。(以下の例だと、1で見つけた行の1つ前の行は3行目。B1~B3を見て、空白があるので0を返す)

以下のC1セルに何らかの計算式を入れて、それを実現する(0を返す)ようにしたいです。(作業スペース使用不可)

A B
- -
A D
B 
C F

# matchとかoffsetとか入れて試行錯誤していますがややこしくて頭が混乱しています。。

お知恵を拝借できないでしょうか。よろしくおねがいします。

A 回答 (4件)

日本語というのは本当に難しいものです。


当初のご質問者の説明は
>A列を今の行から下に見ていき、最初の空白を見つける・・・
>B列について、今の行から1で見つけた行の1つ前の行「を」見ていき・・・
となっており「A列が空白である行の一つ前の行のB列の値を見よ」だと理解しました。

しかし、前回回答のお礼に書かれたコメントを見ると
>A1を基準として下に見ていってA4で最初に空白を見つける・・・
>B列を1行目から3行目「まで」見ていくと、B2に空白があるので0を返すようにしたい・・・
ということで、ご質問者の真意はB列の一つのセルを見るのではなく、「自分の列からA列にある次の空白の行の直前までの『範囲』でB列の値の中に空白または「-」があるか」ということのようです。

>以下のケースでいただいた内容を全て試してみましたが、すべて1が返ってきます。

上記のとおり、前回回答はニーズに合致しない条件で数式を組立てたものということになり、望んだ結果は表示されません。

そこで、この新しい解釈で数式を組み立て直してみました。

ご質問者は明確に説明しておられませんが、ここでは、B列の今の行のセルが空白または「-」だった場合、その行A列の値が空白でもC列のセルは「0」になるという前提です。

もう少し、簡単な数式があるかもしれませんが、とりあえず、ご質問者が望む結果が表示されることを優先しました。

C1に以下の数式を記述し、下方向にコピーすればご希望の結果が表示されると思います。
なお、前回回答とは異なり、空白または「-」があるときのみ0とし、それ以外は文字、数値(マイナス値を含む)もエラーとしないルールです。

=1-AND(COUNTIF(OFFSET($B1,0,0,AGGREGATE(15,6,ROW(A:A)/(A:A=""),COUNTIF($A$1:A1,"")+1)-ROW(B1),1),"")+COUNTIF(OFFSET($B1,0,0,AGGREGATE(15,6,ROW(A:A)/(A:A=""),COUNTIF($A$1:A1,"")+1)-ROW(B1),1),"-"))
    • good
    • 0
この回答へのお礼

いただいた式で実現できました。
そのままだと実用に耐えられないくらい重くなってしまったのですが、A:Aのところを実際の表の最初から終わりまでとすることで性能的にも問題ない形にできました。
何度もありがとうございました。

お礼日時:2021/02/11 13:39

No2です。


No.1さんからの修正と修正の意味を判り易くするため、空白でなくハイフンでもないという条件を()でくくってありますが、数式としては()は不要です。
従って、以下のようにしても数式としては使用できます。

=(OFFSET(B$1,AGGREGATE(15,6,ROW(A1:A999)/(A1:A999=""),1)-2,0)<>"")*(OFFSET(B$1,AGGREGATE(15,6,ROW(A1:A999)/(A1:A999=""),1)-2,0)<>"-")*(OFFSET(B$1,AGGREGATE(15,6,ROW(A1:A999)/(A1:A999=""),1)-2,0)>=0)
    • good
    • 0
この回答へのお礼

確認に時間がかかってしまいすみません。
いろいろとありがとうございます。
以下のケースでいただいた内容を全て試してみましたが、すべて1が返ってきます。
このケースの場合、A1を基準として下に見ていってA4(4行目)で最初に空白を見つける。B列を1行目から3行目(4-1行目)まで(B1:B3)見ていくと、B2に空白があるので0を返すようにしたいんです。

A B
---
A D
B 
C F

いただいた式についてはまだ内容の理解が追いついていないので、自分でアレンジできるよう解読をがんばってみます!

お礼日時:2021/02/09 09:33

基本的にNo.1さんの回答を支持しますが、大変失礼とは存じますが、条件がひとつもれている気がします。

ご質問者は、

>値が-または空白のセルがあれば0

とおっしゃっておられますので、空白だけでなく「-」ハイフンもチェックしないといけないのではないかと思います。

その条件を追加すると、

=((OFFSET(B$1,AGGREGATE(15,6,ROW(A1:A999)/(A1:A999=""),1)-2,0)<>"")*(OFFSET(B$1,AGGREGATE(15,6,ROW(A1:A999)/(A1:A999=""),1)-2,0)<>"-"))*(OFFSET(B$1,AGGREGATE(15,6,ROW(A1:A999)/(A1:A999=""),1)-2,0)>=0)

という数式になるのではないかと思います。
この数式は文字列にも対応しますが、数値がマイナス数値の場合は0として扱われます。

ただし、ひとつ暗黙の了解になっていて確認できていないことがあります。

>A列を今の行から下に見ていき、最初の空白を見つける。

という条件の意味は、A列の今の行が空白の場合、
(1)今の行そのものが、ご質問者の条件に合致した行
(2)今の行は含まず、今の行より下にある最初の空白行がご質問者の条件に合致した行

上記の(1)(2)のいずれでしょうか?
前述の数式は(1)の想定で作成してあります。
(2)だとすると以下のようになります。

=((OFFSET(B$1,AGGREGATE(15,6,ROW(A2:A999)/(A2:A999=""),1)-2,0)<>"")*(OFFSET(B$1,AGGREGATE(15,6,ROW(A2:A999)/(A2:A999=""),1)-2,0)<>"-"))*(OFFSET(B$1,AGGREGATE(15,6,ROW(A2:A999)/(A2:A999=""),1)-2,0)>=0)
    • good
    • 0

こんにちは



よくわからないところだらけなので勝手に解釈しました。

ご提示のサンプルでは、A1セルの値がAでA2がB・・・
A、B、C、D、F は必ず数値であるものとして。
>値が-または空白のセルがあれば
「値が-」とは「負の数値」と同義と解釈。

としてよいのなら、C1セルに
=(OFFSET(B$1,AGGREGATE(15,6,ROW(A1:A999)/(A1:A999=""),1)-2,0)<>"")*(OFFSET(B$1,AGGREGATE(15,6,ROW(A1:A999)/(A1:A999=""),1)-2,0)>=0)
で、いかがでしょうか?

※ 当たるも八卦なので、外していたらスルーして下さい。
    • good
    • 0
この回答へのお礼

早速ありがとうございます。
色々分かりづらいところが多くてすみません。
各値 (A、B、C、D、F) は文字列、数値のいずれもありえます。
ハイフンは「-」(文字列)です。

お礼日時:2021/02/04 17:35

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