プロが教える店舗&オフィスのセキュリティ対策術

「検索値」がFrom Toの間の値である場合に、「結果」の値を返したいのですが、
Excelの関数、もしくは、AccessのSQL等で実現できますでしょうか。

2つの表があります。

<表1>
[行番][検索値]
1;    1395
2;    2059
3;    0059
4;    5928
5;    3000

<表2>
[From] [To] [結果]
0000;  1000;  A
1050;  2000;  B
3000;  5000;  C

※FromからToの間隔はランダムです。
 また、前行のToと次行のFromも連続していない場合があります。

表1の行番1には、「B」
表1の行番2には、N/A  を返す。

色々調べてみたのですが、解決策が見つかりませんでした。
ご教示頂けると幸甚です。
何卒よろしくお願い致します。

A 回答 (4件)

<表1>と<表2>を添付図のようにして考えました。

Excel2010です。

セルB1に、
=IFERROR(INDEX($D$7:$F$9,SUMPRODUCT((ROW($D$7:$D$9)-ROW($D$7)+1)*($D$7:$D$9<=A1)*(A1<=$E$7:$E$9)),3),"N/A")

と入力して下にコピーします。「N/A」はエラーではなく、文字列にしています。
<表2>でFromToを満足する行を求めています。なければ「0」です。これでIndex関数で「ABC」を持ってこようとしています。

Excel2010(またはExcel2007)でなかったら、IfError関数を、
 =If(IsError(Index(・・・)),"N/A",Index(・・・))
に書き換えてください。

また、<表1>と<表2>は行が重複しないように配置してください。行が重なると、Index関数で行を「0」にしたときにエラーが発生せず、結果が安定しない(重複した行の値を返すようです)ようです。行が重複しないと問題なくエラーが出ます。
「検索値がFrom Toの間の場合に特定の」の回答画像3
    • good
    • 0
この回答へのお礼

nishi6様

素晴らしいですね。
SUMPRODUCT関数を初めてしりましたが、このように1行で解決できるとは、思ってもみませんでした。
とても勉強になりました。

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

お礼日時:2014/05/18 23:27

作業列を用意して地道に表計算すれば、簡単な数式のみでできます。



A ~ B 列の 2 行目以下に表 1 のデータを記入。G ~ I 列の 3 行目以下に表 2 のデータを記入。その上で、次式を記入。

H2 0 など
C2 =match(b2,g:g,1)
D2 =match(b2-10^-3,h:h,1)+1
E2 =if(c2=d2,index(i:i,c2),na())

H2 セルに 0 などを記入しておかないと、D 列の MATCH 関数は最初の区間を検出できません。D2 の「10^-3」という部分は、B 列と比べて十分に小さな値であれば幾つでも構わないので、B 列に小数が含まれるときは、適当に大きさを調節してください。

なお表 2 を Sheet2 に置きたいという場合は、ひとまず上のとおり同じシート上に 2 表とも作製した後、G ~ I 列の全体をコピーではなく切り取って、Sheet2 に貼り付けてください。上式に「Sheet2!」という記述が勝手に書き加えられます。
「検索値がFrom Toの間の場合に特定の」の回答画像4
    • good
    • 0
この回答へのお礼

MarcoRossiItaly様

ご教示下さりありがとうございます。
ご指摘頂きました通り、私も作業列を用意してどうにか実現させたので、
手法は同じですが、D2列の式が私の考えたのよりスッキリしております。
自分のロジックと比較して、今後に活用したいとおもいます。

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

お礼日時:2014/05/18 23:20

続けて失礼します。


画像を添付するのを忘れていました。

Sheet2は↓のような配置です。m(_ _)m
「検索値がFrom Toの間の場合に特定の」の回答画像2
    • good
    • 0

こんにちは!


VBAになってしまいますが一例です。

↓の画像のようにSheet2に対応表を作成しておきます。
そしてデータはSheet1のA列2行目以降にあり、結果をB列に表示させるとします。
Sheet1のシートモジュールにしてください。

Sub Sample1()
Dim i As Long, k As Long
With Worksheets("Sheet2")
For i = 2 To Cells(Rows.Count, "A").End(xlUp).Row
k = WorksheetFunction.Match(Cells(i, "A"), .Range("A:A"), True)
If Cells(i, "A") >= .Cells(k, "A") And Cells(i, "A") <= .Cells(k, "B") Then
Cells(i, "B") = .Cells(k, "C")
Else
Cells(i, "B") = "N/A"
End If
Next i
End With
End Sub

こんな感じではどうでしょうか?m(_ _)m
    • good
    • 0
この回答へのお礼

tom04様

VBAでのご教示、ありがとうございます。
勉強になりました。
やはりVBAが書けると便利ですね。
ご教示頂いたロジックをもとに、VBAの勉強をしてみます。

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

お礼日時:2014/05/18 23:08

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