[[20151030133514]] 『検索範囲内で5個のデータづつ判定させたいです。』(ちぃさん) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『検索範囲内で5個のデータづつ判定させたいです。』(ちぃさん)

お世話になります。

検索範囲内のデータを5個のデータで範囲外があれば「否」と表示させたいのですが可能でしょうか?

今はB列内のデーター全てで「合否」表示がでるのですが、B列のデータ内で 5個のデータで「15」〜「20」以外の数値があれば「否」と表示させたいのです。

最下行の位置は特定できない状態ですがデータの始まりは「B1」となっていまして、データのある最下行までは空白はございません。

5個のデータづつというのはデーターが「B1」からありますので

「B1」から「B5」までで「15」〜「20」以外の数値があれば「否」
「B2」から「B6」までで「15」〜「20」以外の数値があれば「否」
「B3」から「B7」までで「15」〜「20」以外の数値があれば「否」

   ・
  ・

このような感じでデータの 最下行までで 「15」〜「20」以外の数値がなければ「合」と表示させたいのです。

全く足りていなのですが現在は

=IF(AND(MIN(B:B)>=15,MAX(B:B)<=20),"合","否")

としています。

式をどのようにすればよいでしょうか。

どうぞ宜しくお願い致します。

< 使用 Excel:Excel2003、使用 OS:Windows7 >


 C1 : =IF(OR(MIN(B1:B5)<15,MAX(B1:B5)>20),"否","合")

 とか?

(β) 2015/10/30(金) 14:10


(β)さん ありがとうございます。

お世話になります。

本当にすみません。

質問内容が間違っていました。

sheet1

 ____A____ ____B____
1             16
2             16
3             17
4             16
5             15
6             17 
7             17
8             16
9             17
.              .
.              .
500           18

sheet2

 ____A____ ____B____
1             16
2             16
3             17
4             16
5             15
6             20
7             15
8             16
9             17
.              .
.              .
500           18

最下行が特定できなので、仮にサンプルを最下行が500とします。

B列にある最下行までのデータが5個づつで区切った時に「15」〜「20」の間で値の差が「4」以内であればB列は「合」としたいです。

サンプルsheet1でしたら「合」
サンプルsheet2でしたら「否」

としたいです。

本当に申し訳ございません。

可能でしょうか?

どうぞ宜しくお願いいたします。
(ちぃさん) 2015/10/30(金) 15:20


 値の差 というのは、何と何の差でしょうか?
 アップされたサンプルで説明願います。

 また、B1〜B5、B2〜B6、B3〜B7、・・・ というのはなくなったのですか?
 まだ、要件として存在するのですか?

(β) 2015/10/30(金) 15:48


(β)さん ありがとございます。

説明不足で申し訳ありません。

サンプルで500行までデータがあるとします。

B1〜B5、B2〜B6、B3〜B7は
>B列にある最下行までのデータが5個づつで区切った時に「15」〜「20」の間で値の差が「4」以内であればB列は「合」としたいです。

この部分になります。

sheet1

 ____A____ ____B____
1             16
2             16
3             17
4             16
5             15
6             17 
7             17
8             16
9             17
.              .
.              .
500           18

こちらは
1行目から5行目→「15」〜「20」の間で値の差が「4」以内
2行目から6行目→「15」〜「20」の間で値の差が「4」以内
3行目から7行目→「15」〜「20」の間で値の差が「4」以内
4行目から8行目→「15」〜「20」の間で値の差が「4」以内
5行目から9行目→「15」〜「20」の間で値の差が「4」以内
.
.
.
〜行目から500行目→「15」〜「20」の間で値の差が「4」以内

判定は「合」

sheet2

 ____A____ ____B____
1             16
2             16
3             17
4             16
5             15
6             20
7             15
8             16
9             17
.              .
.              .
500           18

こちらは
1行目から5行目→「15」〜「20」の間で値の差が「4」以内
2行目から6行目→「15」〜「20」の間で値の差が「4」以上
3行目から7行目→「15」〜「20」の間で値の差が「4」以上
4行目から8行目→「15」〜「20」の間で値の差が「4」以上
5行目から9行目→「15」〜「20」の間で値の差が「4」以上
.
.
.
〜行目から500行目→「15」〜「20」の間で値の差が「4」以内

2行目から6行目→「15」〜「20」の間で値の差が「4」以上
3行目から7行目→「15」〜「20」の間で値の差が「4」以上
4行目から8行目→「15」〜「20」の間で値の差が「4」以上
5行目から9行目→「15」〜「20」の間で値の差が「4」以上

が「4」以上なので判定は「否」

このような感じで判定したのですが。

以上の説明でわかりにくい部分はありますでしょうか。

どうぞ宜しくお願いいたします。
(ちぃさん) 2015/10/30(金) 16:10


 値の差 が 「何」と「何」の値の差なのかが、まだ説明からはわかりません。
 想像で。

 Sheet2 の B1〜B5 でいうと 16,16,17,16,15  
 この 5つのなかの最小値 15 と 最大値 17 との差は 2。なので4以内。
 SHeet2 の B2〜B6 でいうと 16,17,16,15,20
 この 5つのなかの最小値 15 と 最大値 20 との差は 5。なので4超。

 これを、以降も、1行ずつ下にみていって、そこから始まる5つのセルの数値がどうかを判定し、
 すべての5つのブロックの判定が 4以内なら 合、1つでも 4超があれば 否。

 この全体に対する判定を1つだけ C1 に記載。

 そういうことですか?

 また、5つの数字の中で 14以下、あるいは 21以上のものがあれば、そのブロックは NGですか?
 たとえば 21,21,21,21,21 だった時。最大値と最小値の差は 0 ですが。

(β) 2015/10/30(金) 16:58


(β) さん  ありがとうございます。

説明がうまくできておらずすみません。

(β) さんが想像しているままです。

可能でしょうか?
(ちぃさん) 2015/10/30(金) 18:06


 仕様は理解しました。

 ただ、βは、交通整理の意味で、確認をお願いしてきましたが、関数音痴ですので
 ご期待にはそえそうもありません。VBAでよければお手伝いできますが。

 せいぜい、

 D列を作業列として
 D1 : =IF(AND(MIN(B1:B5)>=15,MAX(B1:B5)<=20,MAX(B1:B5)-MIN(B1:B5)<=4),"","NG")
 これを、ずらっと下にフィルコピーしておいて、
 C1 : =IF(COUNTA(D:D),"否","合")

 でも、これでは、最後の4行、対象領域に空白せるがあって、そこは下限の 15 を下回りますので
 NGになり、結果として、C1 は常に 否 になってしまいます。

 専門家さんからの回答をお待ちください。

(β) 2015/10/30(金) 19:59


 とりあえず専門家さんからの回答がでるまでのつなぎでVBA。

 20:19 UDFスタイルに変更。

 C1 に =判定() と入れてください。

 Function 判定() As String
    Dim c As Range
    Dim r As Range
    Dim ng As Boolean
    Dim mx As Long

    Application.Volatile
    Set r = Range("B1", Range("B" & Rows.Count).End(xlUp))
    mx = r.Cells(r.Count).Row

    For Each c In r
        If c.Value < 15 Or c.Value > 20 Then
            ng = True
            Exit For
        Else
            With c.Resize(WorksheetFunction.Min(mx - c.Row + 1, 5))
                If WorksheetFunction.Max(.Cells) - WorksheetFunction.Min(.Cells) > 4 Then
                    ng = True
                    Exit For
                End If
            End With
        End If
    Next

    判定 = IIf(ng, "否", "合")

 End Function

(β) 2015/10/30(金) 20:13


(β) さん ありがとうございます。

これはシートモジュールでいいのでしょうか?

シートモジュールにコピペし、

C1 に =判定() と入力すると 関数名が正しくないエラーが(#NAME?)と出ます。

無知で申し訳ありません。

どのようにご教授いただいたコードを使えばよいでしょうか。

どうか宜しくお願い致します。
(ちぃさん) 2015/10/30(金) 20:35


 標準モジュールに書いてください。

(β) 2015/10/30(金) 20:39


 関数音痴らしく、ちょっと勘違いしていたところがあります。
 (β) 2015/10/30(金) 19:59 でアップした作業列方式で、一応結果が出ますね。
 ただし、式は、

 D1 : =IF(AND(MIN(B1:B5)>=15,MAX(B1:B5)<=20,MAX(B1:B5)-MIN(B1:B5)<=4),0,1)
 これを D500までフィルコピーしておいて

 C1 : =IF(SUM(D:D)>0,"否","合")

 アップしたVBAコードも勘違い内包していますが、これは、影響がないのでこのままでも。
(β) 2015/10/30(金) 20:59

(β)さん ありがとうございます。

いけました。
マクロも正しくうごきました。

マクロの方、仮に検索列を増やす場合はどこに追加すればいいでしょうか。
現在はB列のみ検索していますが、H列、J列と離れた場所の場合など。

後出し的で申し訳ありません。

もしよければ今一度お願いできないでしょうか。

どうぞ宜しくお願いいたします。
(ちぃさん) 2015/10/30(金) 21:20


 検索列を増やす という意味は?

 今、B列でやっているけど、それと同じことを 他の列でもやりたいということなら。
 (ついでに、勘違いしていたところもちょこっと直してあります)

 セル(どこでもいいです) =判定("B") とか =判定("I") とか、判定する数字が入った列を " " で囲んで指定。

 Function 判定(col As String) As String
    Dim c As Range
    Dim r As Range
    Dim ng As Boolean

    Application.Volatile
    Set r = Range(col & 1, Range(col & Rows.Count).End(xlUp))

    For Each c In r
        If c.Value < 15 Or c.Value > 20 Then
            ng = True
            Exit For
        Else
            With c.Resize(5)
                If WorksheetFunction.Max(.Cells) - WorksheetFunction.Min(.Cells) > 4 Then
                    ng = True
                    Exit For
                End If
            End With
        End If
    Next

    判定 = IIf(ng, "否", "合")

 End Function

(β) 2015/10/30(金) 23:15


(β) さん ありがとうございます。

凄いです。

希望してた以上の回答内容です。

計算式よりシート内がスッキリしてていいと思いました。

ありがとうございました。

(ちぃさん) 2015/10/30(金) 23:47


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.