>[1-10,12,15-20,22-38]と入っているセルがあるとします。
>各数字は","で区切られています。
とのことですが、「1,2,3,4,5,6,7,8,9,10,12,15,16,17,18,19,20,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38」と入力された セル がある、ということでしょうか? それとも、正味「1-10,12,15-20,22-38」と入力されているのでしょうか?
読んだままですと後者の方になりますので、後者の方で考えてみます。
いずれにいたしましても、何の用途かは存じませんが、「後からこうでした」みたいな追加ご質問にはお応えいたしかねますので、参考までにご覧ください。
A1 セル に「1-10,12,15-20,22-38」と入力されているとして、別のセルに
=NUMORDER(A1,-5)
と入力すると「1-4,6-10,12,15-20,22-38」と表示し
=NUMORDER(A1,21)
と入力すると「1-10,12,15-38」と表示します。
1つ目の引数には「セル番地」または「文字列」を、2つ目の引数には「1 ~ 99 までの整数」をお入れください。
この煩雑な コーディング をご覧になって、もっと スマート なご回答の付くことをお祈り申します。
Function NUMORDER(myStr As Variant, num As Integer) As String
Dim i As Long
Dim j As Double
Dim myNum As Variant
'文字列中の スペース を削除
myStr = Replace(myStr, " ", "")
'文字列の前後に「0」・「100」を挿入
Select Case Left(myStr, 2)
Case "1,", "1-"
myStr = myStr & ",100"
Case Else
myStr = "0," & myStr & ",100"
End Select
'文字列を カンマ で分割し、ハイフン の区間の数字を補完する
myStr = Split(myStr, ",")
For i = 0 To UBound(myStr)
If InStr(myStr(i), "-") > 0 Then
myNum = Split(myStr(i), "-")
myStr(i) = ""
For j = myNum(0) To myNum(1)
myStr(i) = myStr(i) & " " & j
Next
myStr(i) = Trim(myStr(i))
End If
Next
'欠番に「●」を入れ、「数を足したり引いたり」する
myStr = Split(Join(myStr))
For i = 0 To UBound(myStr) - 1
myStr(i) = myStr(i) & Application.WorksheetFunction.Rept(" ●", myStr(i + 1) - myStr(i) - 1)
Next
myStr = Split(Join(myStr))
If num > 0 Then
myStr(num - myStr(0)) = num
Else
myStr(-num - myStr(0)) = "●"
End If
'前後に挿入した「0」・「100」を削除
myStr = Replace(Join(myStr), " 100", "")
If Left(myStr, 2) = "0 " Then myStr = Right(myStr, Len(myStr) - 2)
'連続数字を ハイフン で繋ぐ
myStr = Split(myStr, "●")
For i = 0 To UBound(myStr)
If myStr(i) <> " " Then
myNum = Split(Trim(myStr(i)))
If UBound(myNum) > 0 Then
myStr(i) = myNum(0) & "-" & myNum(UBound(myNum))
End If
End If
Next
'カンマ で文字列に分割する
myStr = Application.Trim(Join(myStr))
NUMORDER = Replace(myStr, " ", ",")
End Function
お礼
ありがとうございます!解決しました。