58本目 番号リストを簡潔にした文字列で返す

VBA100本ノック

VBA100本ノック 58本目を動画で解説しています。Excelの神髄さんの模範解答はコチラ


問題

#VBA100本ノック58本目
配列と数値nを受け取り、配列の番号リストを簡潔にした文字列で返すFunctionを作成します。
n連続以上の場合は「開始-終了」に変換した上でカンマ区切りで結合。
配列={1,2,3,5,8,9,11,12,13,14,15,17,19,20,21,22}
n=2→”1-3,5,8-9,11-15,17,19-22″
※結果は画像を参考に

解答

Sub ノック58本目()
    Dim ary() As Variant
    ary = Array(1, 2, 3, 5, 8, 9, 11, 12, 13, 14, 15, 17, 19, 20, 21, 22)
    Debug.Print List_Change(ary, 2)
    Debug.Print List_Change(ary, 3)
    Debug.Print List_Change(ary, 4)
End Sub

Function List_Change(ary As Variant, n As Long) As String
    Dim i As Long: i = 0: Dim j As Long: Dim i_first As Long, i_cnt As Long
    Do While i <= UBound(ary)
        i_first = i
        Do '差が1でなくなるまでループ
            If i = UBound(ary) Then Exit Do
            If ary(i + 1) - ary(i) <> 1 Then Exit Do
            i = i + 1
        Loop
        i_cnt = i - i_first
        If i_cnt >= n - 1 Then       '最初の数値(i) & "-" & 最後の数値(i)
            List_Change = List_Change & ary(i_first) & "-" & ary(i) & ","
        Else        '最初の数値(i)から一つずつ & "," で区切っていく
            For j = i_first To i
                List_Change = List_Change & ary(j) & ","
            Next
        End If
        i = i + 1
    Loop
    List_Change = Left(List_Change, Len(List_Change) - 1)
新人君
新人君

配列の問題は難しいですよね~!

ブチョ
ブチョ

配列は超簡単だよね~?

新人君
新人君

本気で言ってんのか…

コメント

タイトルとURLをコピーしました