Excel。SMALL関数は指定した○番目に小さい値を算出します。
<関数辞典:SMALL関数>
SMALL関数
読み方: スモール
分類: 統計
SMALL(配列,順位)
指定した○番目に小さい値を算出します
【Excel・Word・PowerPoint・Access】あなたの「困った」を解決!10年以上の経験が詰まった、現場の疑問から生まれた実践テクニック集。作業効率を劇的に上げるOffice活用術をお届けします。
SMALL関数
読み方: スモール
分類: 統計
SMALL(配列,順位)
指定した○番目に小さい値を算出します
データベースや表から、該当する条件のデータを抽出して、別のセルに表示したい場合、オートフィルターでデータを抽出して、コピーをする。
この作業でもいいのですが、抽出条件が変わるとなると、オートフィルターで抽出してコピーするという作業が面倒になってきます。
そこで、数式だけで、対応することもできます。
G1を「B」にしたら、クラスBのメンバーが抽出され表示するというものです。
最初は準備として、D2に次の数式を設定し、D8までオートフィルで数式をコピーします。
B列のデータと、G1のデータが合致したら、行番号-1を算出するという数式ですね。
ROW関数は行番号を算出します。
「-1」するのは、あとでINDEX関数をつかうのですが、座標がわかりやすくするために、「1」からの値にしたいからです。
今回は、データの1件目が2行目にありますので、「-1」すれば、「1」から表示することができます。
F4にメインとなる数式を設定します。
設定したら、オートフィルで数式をコピーします。
=IFERROR(INDEX($A$2:$C$8,SMALL($D$2:$D$8,ROW(A1)),COLUMN(A1)),"")
長い数式ですが、これだけで、該当するデータを抽出し表示することができます。
F4:H8まで数式を設定してあります。
それでは、数式を確認していきます。
最初のIFERROR関数ですが、データの件数が少ない場合、「#NUM!」というエラーが表示されてしまうので、その防止のためにIFERROR関数をつかっています。
INDEX関数は、設定した範囲の中から、指定した行番号と列番号のデータを抽出するという関数です。
最初の引数は、「配列」です。
「$A$2:$C$8」と設定します。
オートフィルで数式をコピーしますので、絶対参照を忘れないようにしましょう。
2番目の引数は、「行番号」です。
SMALL($D$2:$D$8,ROW(A1))
先程、IF関数で算出した結果を、SMALL関数を使い、1番小さい値を抽出させます。
1番小さい値、次に2番目の小さい値というようにしたいので、SMALL関数をつかい、さらに、ROW関数でA1を指定します。
オートフィルで数式をコピーすると、A1がA2とかわり、2番目・3番目に小さい値のある場所を見つけてくれるという仕組みです。
最後の引数は、「列番号」です。
COLUMN(A1)
こちらも、先程と同じ仕組みで、オートフィルで数式をコピーするときに、座標がズレるようにしています。
このように、INDEX関数をつかうことで、データを抽出することもできます。
今回は、SLN関数~SORTBY関数までをご紹介しております。
SLN関数
読み方: エスエルエヌ
読み方: ストレートライン
分類: 財務
SLN(取得価額,残存価額,耐用年数)
減価償却費を定額表で算出します
Straight LiNe depreciationの略
SLOPE関数
読み方: スロープ
分類: 統計
SLOPE(既知のy,既知のx)
回帰直線の傾きを算出する
SMALL関数
読み方: スモール
分類: 統計
SMALL(配列,順位)
指定した○番目に小さい値を算出します
SORT関数
読み方: ソート
分類: 検索/行列
SORT(配列,[並べ替えインデックス],[並べ替え順序],[並べ替え基準])
範囲または配列を並べ替えます
SORTBY関数
読み方: ソートバイ
分類: 検索/行列
SORTBY(配列,基準配列1,[並べ替え順序1],…)
範囲または配列を、対応する範囲または配列の値に基づいて並べ替えます
セルの結合は設定するのが簡単なのですが、結合したセルの値を別のセルにコピーするとか、一覧表を作る場合、意外と大変というか、困ってしまうことがあります。
例えば、次の表のような処理をする場合で、説明していきます。
A列には、セル結合された担当者名が入力されています。
入力規則のリストなどで使うために、D列のように担当者一覧を作りたいとします。
今回は、4名なので、コピー&ペーストでも、どうにかなりますが、件数が多かったらコピー&ペーストでは大変です。
Excel VBAでマクロをつくってもいいのですが、マクロを作成すること自体も面倒です。
今回のような、結合セルの値から、一覧表をつくるには、ちょっとした関数を組み合わせれば、可能になります。
では、早速作っていきましょう。
C2に、次の数式を設定して、オートフィルで数式をコピーします。
=IF(A2<>"",ROW(A1),"")
このように、算出されます。
縦方向にセルが結合されている場合、結合されている一番上のセルに値が設定されいます。
値が入っているか、どうかを判断したいので、IF関数を使います。
論理式は、「A2<>""」。
A2が空白ではなかったらと、問い合わせます。
真の場合は、「ROW(A1)」。
ROW関数で行番号をつかって、数値を算出させます。
義の場合は、空白 とします。
これによって、値があるセルの場所がわかりました。
続いて、D列にまとめる作業を行います。
D2に次の数式を設定します。
=IFERROR(INDEX($A$2:$A$10,SMALL($C$2:$C$10,ROW(A1))),"")
数式を説明していきます。
IFERROR関数を使うのは、このあと、オートフィルで数式をコピーすると、抽出データがないセルに、「#NUM!」というエラーが表示されるので、その防止のために使います。
INDEX関数は、INDEX(参照,行番号,列番号)という引数をもっています。
参照は、担当者名を算出したいわけですから、$A$2:$A$10。
オートフィルで数式をコピーしますので、絶対参照を設定します。
行番号は、
SMALL($C$2:$C$10,ROW(A1))
SMALL関数は、その数値の順位の数値を算出します。
このために、先程のIF関数で算出したわけです。
SMALL関数は、SMALL(配列,順位)という引数をもっています。
配列は、IF関数で算出した範囲の、$C$2:$C$10
絶対参照も忘れずに設定します。
順位は、ROW(A1) A1を指定することで、「1」という数値を算出することができます。
オートフィルで数式をコピーすると、A2・A3とかわることで「2」「3」とスライドすることができます。
列番号は、今回複数列ではないので、省略します。
すると、このような結果になりました。
最後に、C列の数値を表示してあると、カッコ悪いので、非表示にしますので、C2:C10を範囲選択して、セルの書式設定ダイアログボックスを表示します。
表示形式の「ユーザー定義」にして、種類に「;;;」(セミコロン×3)と設定します。
最高値を算出するには、MAX関数を使いますし、2位や3位など指定の順位を算出するには、LARGE関数をつかいます。
ただ、困ったことに、数値そのものしか算出することができません。
どういうことかというと、次の表があります。
AB列の表は、ある競技の時間の表です。
上位3位までのタイムのいい人を抽出したいわけです。
作業としては、最初にD列を算出します。
数値が小さい上位3名までなので、SMALL関数を使えばOKです。
D2の数式を確認してみましょう。
=SMALL($B$2:$B$11,ROW(A1))
引数のROW(A1)は何を意味似ているのかというと、ROW(A1)としないで、1位を算出したいので、「1」と設定したら、オートフィルで数式をコピーしても、「1」のままなので、「2」「3」と修正しないといけません。
ROW関数をつかって、数式を修正する手間を省いています。
垂直の表になっているので、VLOOKUP関数を使えば、抽出することができるのではと考えるかもしれませんが、残念ながら、今回のような表からでは、VLOOKUP関数で、別のフィールドのデータを抽出することはできません。
なぜならば、VLOOKUP関数は、抽出する範囲の一番左側が、検索値でなければなりません。
つまり、今回は、参加者・時間という並びになっていますので、VLOOKUP関数が使えないわけです。
時間・参加者ならばVLOOKUP関数が使えます。
このような表に対応するには、INDEX+MATCH関数をつかうことで、抽出することはできるのですが、なかなか面倒な関数の組み合わせです。
ところが、近年追加された「XLOOKUP関数」を使うと、とても簡単に問題を解決してデータを抽出することができます。
E2をクリックして、XLOOKUP関数をつかった数式を作っていきます。
なお、XLOOKUP関数ですが、XLOOKUP関数ダイアログボックスで数式をつくると、どのように引数を設定したらわかりにくいので、出来ることならば、手入力で数式をつくるほうがいいように思えます。
なので、今回は、手入力で、XLOOKUP関数を作っていきます。
検索範囲ですが、検索値が所属しているフィールド(列)ですから、B2:B11。
オートフィルで数式をコピーするのではなく、「スピル機能」によって数式がコピー(スピル)されますので、絶対参照は不要です。
戻り範囲ですが、これは、抽出したいものですから、参加者の列ですね。
A2:A11と入力します。
ここも、絶対参照は不要です。
見つからない場合は、空白にしたいので「””(ダブルコーテーション×2)」
一致モードは、完全一致なので「0」
検索モードは、データの上部から下部へと検索しますので「1」
Enterキーで数式を確定すると、スピル機能によって、数式が設定されます。
=XLOOKUP(D2:D4,B2:B11,A2:A11,"",0,1)
です。
このように、XLOOKUP関数は、VLOOKUP関数よりも、融通がききやすいので、使ってみると便利です。
なお、「スピル機能」がよくわからない場合は、旧来通り、絶対参照をつかった数式をつくり、オートフィルで数式をコピーしてもOKですよ。
その場合の数式は、
=XLOOKUP(D2,$B$2:$B$11,$A$2:$A$11,"",0,1)
です。
新しく加わった機能や関数を、取り入れてみると、改善できるものとかあるかもしれませんね。