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)

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

ブチョ
配列は超簡単だよね~?

新人君
本気で言ってんのか…
コメント