nna1016
@nna1016

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Excelにて、連続する数値の省略表現を行いたいです。

Q&A

Closed

Excelにて、連続する数値の省略表現を行いたいです。

以下が、例です。

1
2
3
5
7
8

などの整数値が改行区切りでセルに入っています。
これを、

1―3
5
7―8

と表現したいです。
また、数値に関してはスタートは1とは限らず、また数値、データ数も日により異なります。

私なりに調べてみたものの、そもそも何というワードで検索を行うのが適切かがまずわからず、手詰まりの状態となってしまっております。

どなたか、ご教授いただけると幸いです。

環境

手法に関してはExcelの関数、VBA問わず、実行環境はExcel2016です。

0

2Answer

Sub sample()
    Dim d, a, k, i
    
    Set d = CreateObject("Scripting.Dictionary")
    a = Split(ActiveCell.Value, vbLf)
    k = a(0)
    d(k) = 0
    
    For i = 1 To UBound(a)
        If a(i) - a(i - 1) = 1 Then
            d(k) = d(k) + 1
        Else
            k = a(i)
            d(k) = 0
        End If
    Next
    
    For Each k In d
        d(k) = IIf(d(k) = 0, k, k & "-" & k + d(k))
    Next
    
    ActiveCell.Offset(, 1).Value = Join(d.Items, vbLf)

End Sub

1Like

Comments

  1. 上記について、参考にさせていただきました。

    連続する値が3つ以上のときのみ省略表現をおこなう、
    とするにはどのように標記すればよろしいでしょうか。

    例えば、
    1
    2
    3
    5
    7
    8
    と標記されているものを
    1―3
    5
    7
    8
    と表現したいです。

    ご教示のほどよろしくお願いいたします。

頭のいい人がもっとエレガントな回答をするでしょう。
私にはこれしか思いつきませんでした。

開発言語:Excel VBA

[1] 開始位置のセルを取得し、変数cellに代入
    空の文字列型の配列omitted_num_arrayを生成

[2] 変数cellに入っている数値を取得し、変数old_numとstart_numに代入

[3] ひとつ下のセルに値が入っていれば[4]へ、それ以外は[7]へ

[4] 変数cellにひとつ下のセルを代入

[5] 変数cellに入っている数値を変数current_numに代入

[6] 変数current_numが変数old_numより1だけ大きい場合は
    変数old_numに変数current_numを代入し[3]へ

    それ以外の場合は配列omitted_num_arrayに「start_num~old_num」という文字列を追加
    ただしstart_numとold_numが同じ場合は「start_num」という文字列を追加
    変数old_numに変数current_numを代入
    変数start_numに変数current_numを代入
    [3]へ

[7] 配列omitted_num_arrayに「start_num~old_num」という文字列を追加
    ただしstart_numとold_numが同じ場合は「start_num」という文字列を追加

[8] 配列omitted_num_arrayに入っている文字列を表示したい箇所に出力
0Like

Your answer might help someone💌