読者です 読者をやめる 読者になる 読者になる

空談録

http://artfulplace.net/blogs/ からひっこしつつ

ver16.0.6568.2016でExcelに追加されたワークシート関数について

怪奇!いつ追加されたのかわからないワークシート関数!

というわけで追加されたという新しい6個のワークシート関数について調べていきたいと思います
解説は知らないので公式のドキュメントとかを待つとよいかと

追加されたのは
IFS
SWITCH
MAXIFS
MINIFS
CONCAT
TEXTJOIN
ですね。とりあえず一つずつ見ていきます

インクとかの他の情報については昨日の記事でどうぞ
artfulplace.hatenablog.com

追記(2/24):Office Blogで関数についての記事が書かれてたのでそっちをどうぞ
blogs.office.com

IFS関数

プログラミング的に考えるとIf, ElseIf, ElseIf... って感じ。Elseはないです
定義としてはこんな感じ

IFS(logical_test1, value_if_true1 [, logical_test2, value_if_true2] ...)

logical_test* (*には数字が入る)は真偽値を返す式、値を入力します。
value_if_test* は対応する数字のlogical_test*がtrueの場合に返す値を入力します

IFSが返す値は最初に条件を満たした logical_test* に対応する value_if_test* です。これ以降に条件を満たす logical_test* があったとしても無視されます。
すべての logical_test* が false を返す場合 #N/A が返されます

例として書くとこんな感じ。
J7 = 3, J8 = 4, J9 = 10 とします

IFS(J7 = 1,"a",J7 = 2,"b",J7 = 3,"c",J7 = 4,"d",J7 = 5,"e") // = "c"
IFS(J8 = 1,"a",J8 = 2,"b",J8 = 3,"c",J8 = 4,"d",J8 = 5,"e",J8 = 4,"f") // = "d"
IFS(J9 = 1,"a",J9 = 2,"b",J9 = 3,"c",J9 = 4,"d",J9 = 5,"e",J9 = 4,"f") // = #N/A

Else取れないの案外面倒くさい…

SWITCH関数

CのswitchよりもVBのSelect Caseに近いというかVBAのInteraction.Switchというそのものな名前の関数がいる
定義はこんな感じ

SWITCH(expression, value1, result1 [, value2, result2] ...)

expressionには基となる値を入れます
value*, result* は expression が value* と等しい時に SWITCH 関数が返す値 result* をそれぞれ入力します
日本語難しい

SWITCHもIFS同様に最初に等しい値だった value* に対応する result* を返します。これ以降に等しい値となる value* が存在しても無視されます
expression と等しい value* が存在しない場合は #N/A を返します

例を書くとこんな感じ
J7 = 3, J8 = 4, J9 = 10 とします

SWITCH(J7, 1, "a", 2, "b", 3, "c", 4, "d", 5, "e") // = "c"
SWITCH(J8, 1, "a", 2, "b", 3, "c", 4, "d", 5, "e", 4, "f") // = "d"
SWITCH(J9, 1, "a", 2, "b", 3, "c", 4, "d", 5, "e", 4, "f") // = #N/A

追記(2/24):SWITCHのほうは既定値が設定できるようです
IFSと同じかと思っていた…

J9 = 10とするとこんな感じ
SWITCH(J9, 1, "a", 2, "b", 3, "c", 4, "d", 5, "e", 4, "f", "x") // = "x"

MINIFS, MAXIFS関数

どっちも似たようなものだし(何とか)IFSがわかれば簡単ですし…
定義はこんな感じ

MINIFS(min_range, criteria_range1, criteria1 [, criteria_range2, criteria2] ...)
MAXIFS(max_range, criteria_range1, criteria1 [, criteria_range2, criteria2] ...)

MINIFSはすべてのcriteria*を満たしているmin_range内の値の中で最も小さい値を返します
MAXIFSはすべてのcriteria*を満たしているmax_range内の値の中で最も大きい値を返します
やったね!コピペがはかどるよ!!

正直SUMIFSとかAVERAGEIFSで使い方見たほうが早いんじゃないですかねこれ…

すべてのcriteria*の判定終了後にmax_range, min_rangeに値が一つもない場合0を返します

例を書くとこんな感じなのかなぁ。SUMIFSでググったほうが絶対にわかると思う
A1:A5にはそれぞれ1,2,3,4,5が入っていることとします

MINIFS(A1:A5, A1:A5, ">3") // = 4
MAXIFS(A1:A5, A1:A5, ">3") // = 5

MINIFS(A1:A5, A1:A5, ">6") // = 0
MAXIFS(A1:A5, A1:A5, ">6") // = 0

TEXTJOIN, CONCAT関数

CONCATENATE?あいつは死んだんだ…

定義はこんな感じ
CONCAT(text1, [,text2] ...)
TEXTJOIN(delimiter, ignore_empty, text1 [, text2] ...)

CONCATは引数に指定したテキストをすべてそのまま結合して返します
TEXTJOINは指定した text* を delimiter で区切りを入れながら結合します。このとき空のセルが含まれる場合は無視することもできます

これは例を見たほうが早いですね
A1 = "aaa", A2 = "bbb", A3 = "ccc", A4 = "" として、A1 ~ A4を結合してみます

CONCAT(A1,A2,A3,A4) // = "aaabbbccc"
TEXTJOIN(",", FALSE, A1,A2,A3,A4) // = "aaa,bbb,ccc,"
TEXTJOIN(",", TRUE, A1,A2,A3,A4) // = "aaa,bbb,ccc"

こんな感じでとりあえずくっつけるならCONCATを、区切り文字も指定したい場合はTEXTJOINを使う形で行くとよいです。

ん? 君は…CONCATENATEじゃないか!どうしたんだ! なに? 俺が付いてるだろって?

CONCATENATE(A1,A2,A3,A4) // = "aaabbbccc"

そうだな、確かにCONCATと同じ値が返ってくるな

残念ながら君の役目は終わったのだよ

CONCAT(A1:A4) // = "aaabbbccc"
TEXTJOIN(",", FALSE, A1:A4) // = "aaa,bbb,ccc,"
TEXTJOIN(",", TRUE, A1:A4) // = "aaa,bbb,ccc"

CONCATENATE(A1:A4) // = #VALUE!

というわけでレガシーーーExcelと何かするでもなければCONCATENATEではなくCONCATを使いましょう


とりあえず追加分は全部書いたはず

ちなみにIFSとSWITCHはWorksheetFunctionに追加されていません。どこから湧いてきたんだ
って思ったけどこんなんVBAで処理できない気がするんだよな…

この辺で