- ベストアンサー
特定の値を返すための検索方法とは?
- 「検索値」がFrom Toの間の値である場合に、「結果」の値を返す方法について教えてください。
- Excelの関数やAccessのSQLなどを使用して、検索値がFrom Toの間の場合に特定の値を返す方法を実現したいです。
- 表1と表2にデータがあり、表1の検索値がFrom Toの間にある場合に、表2の結果を返す方法を教えてください。
- みんなの回答 (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」にしたときにエラーが発生せず、結果が安定しない(重複した行の値を返すようです)ようです。行が重複しないと問題なくエラーが出ます。
その他の回答 (3)
- MarcoRossiItaly
- ベストアンサー率40% (454/1128)
作業列を用意して地道に表計算すれば、簡単な数式のみでできます。 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!」という記述が勝手に書き加えられます。
お礼
MarcoRossiItaly様 ご教示下さりありがとうございます。 ご指摘頂きました通り、私も作業列を用意してどうにか実現させたので、 手法は同じですが、D2列の式が私の考えたのよりスッキリしております。 自分のロジックと比較して、今後に活用したいとおもいます。 ありがとうございました。
- tom04
- ベストアンサー率49% (2537/5117)
- tom04
- ベストアンサー率49% (2537/5117)
こんにちは! 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
お礼
tom04様 VBAでのご教示、ありがとうございます。 勉強になりました。 やはりVBAが書けると便利ですね。 ご教示頂いたロジックをもとに、VBAの勉強をしてみます。 ありがとうございました。
お礼
nishi6様 素晴らしいですね。 SUMPRODUCT関数を初めてしりましたが、このように1行で解決できるとは、思ってもみませんでした。 とても勉強になりました。 ありがとうございました。