Страницы: 1
RSS
Сгруппировать рад чисел непрерывные группы 1, 2, 3, 5, 6, 8 в формате 1-3, 5-6, 8
 
Доброго времени суток! Имеется произвольный меняющийся ряд чисел, например 1, 2, 3, 5, 6, 8, каждое в отдельной ячейке. Нужно формулой в одной ячейке получить текст в формате 1-3, 5-6, 8. Ряд может начинаться не только с единицы, разброс может быть самым разным, но числа всегда отсортированы по возрастанию. Помогите пожалуйста! Сам пока не догадался до алгоритма  :sceptic:

P.S.: не принципиально, если между двумя соседними числами с разницей в единицу будет дефис или запятая.
Изменено: Barsik - 05.10.2018 10:38:47
 
Barsik, а файл пример есть!?
Не бойтесь совершенства. Вам его не достичь.
 
Есть, но насколько он нужен?
 
Barsik, а почему именно 1-3 а не 1-5? или 1-2!? и атк далее?!
Не бойтесь совершенства. Вам его не достичь.
 
a.i.mershik, т.к. ряд 1-5 предполагает наличие 1, 2, 3, 4 и 5. А в моем случае отсутствует число 4.
 
a.i.mershik, ну это то понятно, там проколы, 4 и 7, а вот упорядочить  - это не совсем тот глагол что приемлем в данном случае.
формулой, без использования доп. столбцов это не сделать.

Сгруппировать рад чисел непрерывные группы в формате ….
Изменено: БМВ - 05.10.2018 11:42:45
По вопросам из тем форума, личку не читаю.
 
БМВ,принцип я понял, это то, что нужно, спасибо большое!
 
Код
Function NewStr$(OldStr)
  Dim re, ms, s$, i&, v1&, v2&, v&
  Set re = CreateObject("VBScript.RegExp"): re.Global = True: re.Pattern = "\d+"
  Set ms = re.Execute(Trim(Replace(OldStr, ",", " "))): s = ms(0): v1 = Val(s): v2 = v1
  For i = 1 To ms.Count - 1
    v = Val(ms(i))
    If v = v2 + 1 Then
      v2 = v
    Else
      If v2 <> v1 Then s = s & "-" & v2
      s = s & "," & v: v1 = v: v2 = v
    End If
  Next
  If v2 <> v1 Then s = s & "-" & v2
  NewStr = s
End Function

Sub Test()
  Const b$ = "1, 2, 3, 5, 6, 8"
  MsgBox NewStr(b)
End Sub
Изменено: Ігор Гончаренко - 05.10.2018 13:45:48
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Уважаемый Ігор Гончаренко
а как сделать, чтобы   Const b$ = "1, 2, 3, 5, 6, 8" задать  диапазоном ячеек?
 
Код
Sub FromRange(rg As Range)
  Dim ar
  ar = WorksheetFunction.Transpose(rg.Value):  If rg.Rows.Count = 1 Then ar = WorksheetFunction.Transpose(ar)
  MsgBox NewStr(Join(ar))
End Sub

Sub Test()
  FromRange Range("A5:A11")
End Sub
понятно что в А5:А11 должны быть числа (от меньших к большим)
и внимание!
скопируйте себе повторно NewStr (я там 1 строку добавил в код)
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Спасибо, работает
Страницы: 1
Наверх