excel SMALL 関数:昇順で指定した順位の値を取得する [excel]
excel SMALL 関数:昇順で指定した順位の値を取得する
はじめに
excelの SMALL 関数の使い方を紹介します。
SMALL 関数は昇順で指定した順位の値を取得します。1, 2, 3 のような順番が昇順です。
条件に一致する中での順位の値を取得方法も紹介します。
降順の順位の値を取得するには「LARGE 関数」を使用します。
順位を比率で指定して取得するには「PERCENTILE 関数」を使用します。
構文
SMALL(範囲, 順位)
範囲の中から昇順の順位の値を取得します。
引数「範囲」 セルの範囲、数値を指定できます。
引数「順位」 引数「範囲」の中から取得する順位を指定します。
使用例
excelセルの範囲「B2」~「B6」で 1 番目に小さい値を取得する。
=SMALL(B2:B6,1)
"excel2021508-426-1"
セル「C3」の順位の値を取得する。
=SMALL($B$4:$B$8,C3)
"excel2021508-426-2"
解説
引数「範囲」に数値以外の値を指定したときはエラー#NUM!になります。数値が 1 つでも含まれていればエラーにはなりません。
引数「順位」に引数「範囲」の個数を超える値を指定したときはエラー#NUM!になります。引数「範囲」に 3 個の値を指定したときに引数「順位」に指定できる値は1 ~ 3です。
同率順位の値があるときは、その順位でも次の順位でも値を取得できます。次のように 2 位が複数あるときは、2 位でも 3 位でも取得できます。
"excel2021508-426-3"
条件に一致した順位の値を取得する
グループごとの順位を指定したいときなど条件を付けるには「条件に一致する順位の値を取得する」をご覧ください。
はじめに
excelの SMALL 関数の使い方を紹介します。
SMALL 関数は昇順で指定した順位の値を取得します。1, 2, 3 のような順番が昇順です。
条件に一致する中での順位の値を取得方法も紹介します。
降順の順位の値を取得するには「LARGE 関数」を使用します。
順位を比率で指定して取得するには「PERCENTILE 関数」を使用します。
構文
SMALL(範囲, 順位)
範囲の中から昇順の順位の値を取得します。
引数「範囲」 セルの範囲、数値を指定できます。
引数「順位」 引数「範囲」の中から取得する順位を指定します。
使用例
excelセルの範囲「B2」~「B6」で 1 番目に小さい値を取得する。
=SMALL(B2:B6,1)
"excel2021508-426-1"
セル「C3」の順位の値を取得する。
=SMALL($B$4:$B$8,C3)
"excel2021508-426-2"
解説
引数「範囲」に数値以外の値を指定したときはエラー#NUM!になります。数値が 1 つでも含まれていればエラーにはなりません。
引数「順位」に引数「範囲」の個数を超える値を指定したときはエラー#NUM!になります。引数「範囲」に 3 個の値を指定したときに引数「順位」に指定できる値は1 ~ 3です。
同率順位の値があるときは、その順位でも次の順位でも値を取得できます。次のように 2 位が複数あるときは、2 位でも 3 位でも取得できます。
"excel2021508-426-3"
条件に一致した順位の値を取得する
グループごとの順位を指定したいときなど条件を付けるには「条件に一致する順位の値を取得する」をご覧ください。
PPT スライド番号付き目次を自動作成するPowerPointマクロ [PPT]
PPT スライド番号付き目次を自動作成するPowerPointマクロ
アクティブスライドの前に目次スライドを作成するマクロ
スライドが1枚選択された状態で以下のマクロを実行すると、そのスライドの前に新規スライドが挿入され、目次が自動的に作成されます。
"PPT-2021-5-8 291-1"
アクティブスライド以降のスライドの、タイトルプレースホルダーに入力されている文字列と、スライド番号が目次項目になります。
サンプルマクロで行っている処理
拙著『いちばんやさしいPowerPoint VBAの教本』のLesson 54で、タイトルをイミディエイトウィンドウに出力するPowerPointマクロを作成しています。
上記のマクロは、その発展形と言えます。
目次用スライドの挿入
まずアクティブなスライドの前に、目次用のスライドの挿入を行います。
目次用スライドの挿入時等に利用するために、アクティブスライドのSlideIndexを取得して、変数active_idxに格納します。
Dim active_idx As Long
active_idx = ActiveWindow.Selection.SlideRange.SlideIndex
ここで使っている「ActiveWindow.Selection.SlideRange」は、拙著P.123のワンポイントで簡単にご紹介しているアクティブなスライドを表すSlideRangeオブジェクトを取得するコードです。
SlideRangeオブジェクトはSlidesコレクションとSlideオブジェクトの特徴を併せ持つオブジェクトで、Slideオブジェクトと同様に何枚目のスライドかを表す数値を取得するSlideIndexプロパティを持っています(拙著Lesson 26参照)。
"PPT-2021-5-8 291-2"
Lesson 29で解説しているSlides.Addメソッドで、アクティブスライドの前に目次作成用のスライドを挿入して、
With ActivePresentation.Slides
Dim target_slide As Slide
Set target_slide = .Add(Index:=active_idx, Layout:=ppLayoutText)
Lesson 53でお伝えしているShapes.Titleプロパティ等を利用して、タイトルを「目次」と設定しています。
target_slide.Shapes.Title.TextFrame.TextRange.Text = "目次"
目次項目にする文字列の作成
目次用のスライドを挿入したら、アクティブスライド直後から最後のスライドまでFor~Nextループを回して、
Dim i As Long
For i = active_idx + 1 To .Count
Dim txt As String
With .Item(i)
タイトルプレースホルダーの文字列を変数txtに格納します。タイトルプレースホルダーがないときや、タイトルプレースホルダー内に文字列がない場合には「(タイトルなし)」を代入しています。
If .Shapes.HasTitle Then
txt = .Shapes.Title.TextFrame.TextRange.Text
If Trim(txt) = "" Then
txt = "(タイトルなし)"
End If
Else
txt = "(タイトルなし)"
End If
変数txtに格納したタイトルプレースホルダー等の文字列と、スライド番号をタブ文字(vbTab)を挟んで連結し、末尾には改段落するためのvbNewLineを連結します。
txt = txt & vbTab & .SlideNumber & vbNewLine
タイトルプレースホルダー等の文字列とスライド番号の間に、タブ文字を入れることで、PowerPoint上のルーラーを使ってスライド番号を揃えやすくしています。
目次項目の作成
変数txtが準備できたら、Lesson 46では紹介するに留めているTextRange.InsertAfterメソッドで目次項目を作成しています。
target_slide.Shapes.Placeholders(2).TextFrame _
.TextRange.InsertAfter NewText:=txt
TextRange.InsertAfterメソッドの引数は1つしかないので名前付き引数にする必要はないと言えばないのですが、
"PPT-2021-5-8 291-3"
長いオブジェクトを取得するコードに、標準引数が以下のようにポツンとかかれていると、
target_slide.Shapes.Placeholders(2).TextFrame _
.TextRange.InsertAfter txt
どうもバランスが悪く感じるので、ここでは名前付き引数で指定しています。
こういうときにもVBAが、戻り値を使う/使わないに関わらずプロパティやメソッドでも引数を必ずカッコで括るルールだったら良かったのに、と私は感じます。
エラー処理について
スライドが選択されていないときには実行時エラーが発生してしまうので、
On Error GoTo ErrHandl
ErrHandl:
MsgBox "スライドを1枚選択しておいてから実行してください。"
とエラートラップを行っています。
アクティブスライドの前に目次スライドを作成するマクロ
スライドが1枚選択された状態で以下のマクロを実行すると、そのスライドの前に新規スライドが挿入され、目次が自動的に作成されます。
"PPT-2021-5-8 291-1"
アクティブスライド以降のスライドの、タイトルプレースホルダーに入力されている文字列と、スライド番号が目次項目になります。
サンプルマクロで行っている処理
拙著『いちばんやさしいPowerPoint VBAの教本』のLesson 54で、タイトルをイミディエイトウィンドウに出力するPowerPointマクロを作成しています。
上記のマクロは、その発展形と言えます。
目次用スライドの挿入
まずアクティブなスライドの前に、目次用のスライドの挿入を行います。
目次用スライドの挿入時等に利用するために、アクティブスライドのSlideIndexを取得して、変数active_idxに格納します。
Dim active_idx As Long
active_idx = ActiveWindow.Selection.SlideRange.SlideIndex
ここで使っている「ActiveWindow.Selection.SlideRange」は、拙著P.123のワンポイントで簡単にご紹介しているアクティブなスライドを表すSlideRangeオブジェクトを取得するコードです。
SlideRangeオブジェクトはSlidesコレクションとSlideオブジェクトの特徴を併せ持つオブジェクトで、Slideオブジェクトと同様に何枚目のスライドかを表す数値を取得するSlideIndexプロパティを持っています(拙著Lesson 26参照)。
"PPT-2021-5-8 291-2"
Lesson 29で解説しているSlides.Addメソッドで、アクティブスライドの前に目次作成用のスライドを挿入して、
With ActivePresentation.Slides
Dim target_slide As Slide
Set target_slide = .Add(Index:=active_idx, Layout:=ppLayoutText)
Lesson 53でお伝えしているShapes.Titleプロパティ等を利用して、タイトルを「目次」と設定しています。
target_slide.Shapes.Title.TextFrame.TextRange.Text = "目次"
目次項目にする文字列の作成
目次用のスライドを挿入したら、アクティブスライド直後から最後のスライドまでFor~Nextループを回して、
Dim i As Long
For i = active_idx + 1 To .Count
Dim txt As String
With .Item(i)
タイトルプレースホルダーの文字列を変数txtに格納します。タイトルプレースホルダーがないときや、タイトルプレースホルダー内に文字列がない場合には「(タイトルなし)」を代入しています。
If .Shapes.HasTitle Then
txt = .Shapes.Title.TextFrame.TextRange.Text
If Trim(txt) = "" Then
txt = "(タイトルなし)"
End If
Else
txt = "(タイトルなし)"
End If
変数txtに格納したタイトルプレースホルダー等の文字列と、スライド番号をタブ文字(vbTab)を挟んで連結し、末尾には改段落するためのvbNewLineを連結します。
txt = txt & vbTab & .SlideNumber & vbNewLine
タイトルプレースホルダー等の文字列とスライド番号の間に、タブ文字を入れることで、PowerPoint上のルーラーを使ってスライド番号を揃えやすくしています。
目次項目の作成
変数txtが準備できたら、Lesson 46では紹介するに留めているTextRange.InsertAfterメソッドで目次項目を作成しています。
target_slide.Shapes.Placeholders(2).TextFrame _
.TextRange.InsertAfter NewText:=txt
TextRange.InsertAfterメソッドの引数は1つしかないので名前付き引数にする必要はないと言えばないのですが、
"PPT-2021-5-8 291-3"
長いオブジェクトを取得するコードに、標準引数が以下のようにポツンとかかれていると、
target_slide.Shapes.Placeholders(2).TextFrame _
.TextRange.InsertAfter txt
どうもバランスが悪く感じるので、ここでは名前付き引数で指定しています。
こういうときにもVBAが、戻り値を使う/使わないに関わらずプロパティやメソッドでも引数を必ずカッコで括るルールだったら良かったのに、と私は感じます。
エラー処理について
スライドが選択されていないときには実行時エラーが発生してしまうので、
On Error GoTo ErrHandl
ErrHandl:
MsgBox "スライドを1枚選択しておいてから実行してください。"
とエラートラップを行っています。