- 締切済み
エクセルで指定月の最小値を抽出したいです
日頃からお世話になっております。 今回教えていただきたいのは、 エクセルにて指定月の最小値の 抽出方法が分からず困っております。 まずは、簡易化したエクセルが下記です。 ---------- シート1 ---------- A B 1 2014/5/12 15.1 2 2014/5/23 20.8 3 2014/5/30 10.1 4 2014/6/11 25.6 ---------- シート2 ---------- A(指定月) B(最大値) C(最小値) 1 2014/5 20.8 ● 2 2014/6 25.6 ● ---------- 上記の構成で、B1に 下記のコードを入れると 正しく最大値は抽出されます。 =MAX(INDEX((YEAR(シート1!A$1:A$65640)=YEAR(A1))*(MONTH(シート1!A$1:A$65640)=MONTH(A1)*シート1!B$1:B$65640,)) しかしながら、シート2のC1に 上記のコードのMAXをMINに 書き換えるだけでは最小値は 抽出してくれません。。。 何かほかに手立てはありますでしょうか? ご教授よろしくお願いいたします。>< ※ちなみにエクセルは Excel2007を使用しております。
- みんなの回答 (6)
- 専門家の回答
みんなの回答
- tom04
- ベストアンサー率49% (2537/5117)
こんばんは! 横からお邪魔します。 あまりおススメできませんが シート2のB1セルに =MAX(IF((YEAR(シート1!A$1:A$65640)=YEAR(A1))*(MONTH(シート1!A$1:A$65640)=MONTH(A1)),シート1!B$1:B$65640)) C1セルに =MIN(IF((YEAR(シート1!A$1:A$65640)=YEAR(A1))*(MONTH(シート1!A$1:A$65640)=MONTH(A1))*(シート1!B$1:B$65640<>""),シート1!B$1:B$65640)) どちらも配列数式になってしまいますので、Ctrl+Shift+Enterで確定! この画面からコピー&ペーストする場合は 上記数式をドラッグ&コピー → Sheet2の各セルを選択 → 数式バー内に貼り付け → そのまま(編集可能なまま) Ctrl+Shiftキーを押しながらEnterキーで確定! 数式の前後に{ }マークが入り配列数式になります。 それぞれをフィルハンドルで下へコピーしてみてください。 ※ 配列数式はPCにかなりの負担を掛けますので、結果表示に若干の時間を要すると思います。 ※ シート2の指定月のデータが全くない場合(その月のB列がすべて空白の場合)は 「0」が表示されてしまいます。m(_ _)m
- bunjii
- ベストアンサー率43% (3589/8249)
回答No.3の訂正です。 提言しました数式に誤りがありましたので以下の数式で検証してください。 =MIN(INDEX((YEAR(シート1!A$1:A$65640)&MONTH(シート1!A$1:A$65640)=YEAR(A1)&MONTH(A1))*シート1!B$1:B$65640+(YEAR(シート1!A$1:A$65640)&MONTH(シート1!A$1:A$65640)<>YEAR(A1)&MONTH(A1))*MAX(シート1!B$1:B$65640),)) 当方ではExcel 2013で検証しました。 年月の比較を年と月を別々に比較すると論理的に不具合が起りますのでYEAR関数の結果とMONTH関数の結果を&演算子で連結した文字列比較することで解決できました。
- MackyNo1
- ベストアンサー率53% (1521/2850)
No2の回答者です。 >やはりこちらも結果は「0」になってしまうようです。。 実際「シート1」という名前のシートのA列に日付、B列に数字を入力して、提示した数式を検証してみましたが、A1セルの年月のデータお一致するシート1のB列の最小値を問題なく表示できています。 もしうまくいかないのであれば、実際に入力した数式をコピー貼り付けしてみてください。
- bunjii
- ベストアンサー率43% (3589/8249)
>しかしながら、シート2のC1に上記のコードのMAXをMINに書き換えるだけでは最小値は抽出してくれません。。。 はい、当然のことですがINDEX関数で配列数値を前処理した結果の最小値は0ですからMAX関数をMIN関数に書き換えただけでは目的の15.1になりません。 シート1のA列とシート2のA1が一致しないセルの値をシート1のB列の最大値に置き換えることを合わせて前処理しないと目的に合いません。 下記の式で試してください。(検証していません) =MIN(INDEX((YEAR(シート1!A$1:A$65640)=YEAR(A1))*(MONTH(シート1!A$1:A$65640)=MONTH(A1)*シート1!B$1:B$65640+INDEX((YEAR(シート1!A$1:A$65640)=YEAR(A1))*(MONTH(シート1!A$1:A$65640)<>MONTH(A1)*MAX(シート1!B:B,)) 尚、次の式は誤りの元になりますので変更されることをお勧めします。 YEAR(シート1!A$1:A$65640)=YEAR(A1))*(MONTH(シート1!A$1:A$65640)=MONTH(A1)*シート1!B$1:B$65640 ↓ (YEAR(シート1!A$1:A$65640)&シート1!A$1:A$65640)=YEAR(A1))&MONTH(A1))*シート1!B$1:B$65640
- MackyNo1
- ベストアンサー率53% (1521/2850)
最小値を表示したいなら、以下のような数式に変更してください。 =MIN(INDEX(((YEAR(シート1!A$1:A$65640)<>YEAR(A1))+(MONTH(シート1!A$1:A$65640)<>MONTH(A1)))*10^10+シート1!B$1:B$65640,))
- keithin
- ベストアンサー率66% (5278/7941)
元の数式にも間違いがありますので直した上で、 =MIN(INDEX((YEAR(シート1!A$1:A$65640)=YEAR(A1))*(MONTH(シート1!A$1:A$65640)=MONTH(A1))*(シート1!B$1:B$65640<>0)*シート1!B$1:B$65640,)) のような段取りにします 実際にはそんな6万個ものセルを計算させるような無意味に重たい数式にするのは止めて =MIN(INDEX((TEXT(シート1!A$1:A$1000,"yyyymm")=TEXT(A1,"yyyymm"))*(シート1!B$1:B$1000<>0)*シート1!B$1:B$1000,)) ぐらいに合理的な範囲で計算します。
補足
さっそくのご回答ありがとうございます。 =MIN(INDEX((TEXT(シート1!A$1:A$1000,"yyyymm")=TEXT(A1,"yyyymm"))*(シート1!B$1:B$1000<>0)*シート1!B$1:B$1000,)) こちらの方向で進めようと思ってセルに入れてみたのですが、0と表示されてしまいました。
補足
ご回答ありがとうございます! やはりこちらも結果は「0」になってしまうようです。。