なんでもエクセル(Nandemo Excel)

何でもエクセルでやってしまう そこのあなた。ようこそ

数式/関数:連続する数字をまとめる

日付などで時々あるかもしれないけど、連続する日付をまとめて表記したい時。「3つ以上連続する数字」は「-」で間の数字をまとめて、それ以外は「,」で区切る。

こんな感じ。「2」「3」は連続する数が2つだから「,」で区切っている。なかなか難しそうに思えるかもしれないが、順を追ってやるとそうでもない。

まず元の値が並んでいるA列から重複を省いた昇順の数値を抽出する。


C1:=FILTER(A:A,A:A) D1:=UNIQUE(C1#) E1:=SORT(D1#)

続いて、E列と上下比較するためのデータを用意する。といっても VSTACK関数で上下に「9^9(大きい値ならなんでもいい)」をくっつけるだけ。


F1:=VSTACK(9^9,E1#,9^9)

次はE列とF列を比較する式を作る。


G1:=IFERROR(IF(DROP(E1#,1)=E1#+1,IF(DROP(F1#,-2)=E1#-1,"",E1#&IF(DROP(F1#,3)=E1#+2,"-",",")),E1#&","),E1#)

ここまでくれば後は、CONCAT関数で結合するだけ。


H1:=CONCAT(G1#)

これを一つにまとめるとこうなる。

=LET(
    r,SORT(UNIQUE(FILTER(A:A,A:A<>""))),
    rr,VSTACK(9^9,r,9^9),
    a,IF(DROP(rr,3)=r+2,"-",","),
    b,IF(DROP(rr,-2)=r-1,"",r&a),
    c,IF(DROP(r,1)=r+1,b,r&","),
    CONCAT(IFERROR(c,r))
)

「2-3」となっていいならもうちょっとだけ簡単。

=LET(
    r,SORT(UNIQUE(FILTER(A:A,A:A<>""))),
    a,IF(DROP(VSTACK(9^9,r),-1)=r-1,"",r&"-"),
    b,IF(DROP(r,1)=r+1,a,r&","),
    CONCAT(IFERROR(b,r))
)

あんまり変わらんかな。