Не особо разбираюсь в экселе, но жизнь "приперла" Помогите решить задачу:
Имеются числовые последовательности, например 1, 2, 3, 4, 5, 20, 22, 26, 27, 28, 29, 30, записанные в одной ячейке. Их надо преобразовать в вид 1-5, 20, 22, 26-30 Такие вариации могут быть абсолтно различными и диапазон чисел от 1 до 999.
Заранее благодраю за помощь!
Доброго времени, форумчане!
Не особо разбираюсь в экселе, но жизнь "приперла" Помогите решить задачу:
Имеются числовые последовательности, например 1, 2, 3, 4, 5, 20, 22, 26, 27, 28, 29, 30, записанные в одной ячейке. Их надо преобразовать в вид 1-5, 20, 22, 26-30 Такие вариации могут быть абсолтно различными и диапазон чисел от 1 до 999.
Если более 256 знаков для Excel версий ранее 2007 или более 16 385 знаков для Excel версий позже 2003, то можно раскладывать текст формулой вертикально
Цитата (benelli)
как автоматически разложить 1, 2, 3, ... на столбцы?
Цитата (Serge_007)
Данные - Текст по столбцам (это действо можно заменить формулой)
Цитата (benelli)
длинна может быть большой
Если более 256 знаков для Excel версий ранее 2007 или более 16 385 знаков для Excel версий позже 2003, то можно раскладывать текст формулой вертикально
Цитата (benelli)
как автоматически разложить 1, 2, 3, ... на столбцы?
Цитата (Serge_007)
Данные - Текст по столбцам (это действо можно заменить формулой)
Option Explicit Function разделить(stroka As String) Dim a() As String, k As String, i As Integer, ch As Integer If Right(Trim(stroka), 1) <> "," Then stroka = stroka & "," a = Split(Replace(stroka, " ", ""), ",") For i = 1 To UBound(a) If Val(a(i)) = Val(a(i - 1)) + 1 Then ch = ch + 1 Else If ch > 0 Then разделить = разделить & a(i - ch - 1) & "-" & a(i - 1) & "," Else разделить = разделить & a(i - 1) & "," End If ch = 0 End If Next End Function
[/vba]
UDF: [vba]
Код
Option Explicit Function разделить(stroka As String) Dim a() As String, k As String, i As Integer, ch As Integer If Right(Trim(stroka), 1) <> "," Then stroka = stroka & "," a = Split(Replace(stroka, " ", ""), ",") For i = 1 To UBound(a) If Val(a(i)) = Val(a(i - 1)) + 1 Then ch = ch + 1 Else If ch > 0 Then разделить = разделить & a(i - ch - 1) & "-" & a(i - 1) & "," Else разделить = разделить & a(i - 1) & "," End If ch = 0 End If Next End Function
Function benelli$(s$) Dim x, rng As Range For Each x In Split(Replace(s, " ", ""), ",") If rng Is Nothing Then Set rng = Range("A" & Replace(x, "-", ":A")) Else Set rng = Union(rng, Range("A" & Replace(x, "-", ":A"))) End If Next x benelli = Replace(Replace(Replace(rng.Address(0, 0), "A", ""), ":", "-"), ",", ", ") End Function
[/vba]
Данные могут быть не сортированы, можно в исходном значении использовать "-" например из "1-3, 4-5, 20, 22, 30, 26, 27-29" получится "1-5, 20, 22, 26-30"
Ограничения: нужно использовать только натуральные числа (положительные, целые числа), максимальное число для Ex2003 - 65536
Ну и мо вариант UDF: [vba]
Код
Function benelli$(s$) Dim x, rng As Range For Each x In Split(Replace(s, " ", ""), ",") If rng Is Nothing Then Set rng = Range("A" & Replace(x, "-", ":A")) Else Set rng = Union(rng, Range("A" & Replace(x, "-", ":A"))) End If Next x benelli = Replace(Replace(Replace(rng.Address(0, 0), "A", ""), ":", "-"), ",", ", ") End Function
[/vba]
Данные могут быть не сортированы, можно в исходном значении использовать "-" например из "1-3, 4-5, 20, 22, 30, 26, 27-29" получится "1-5, 20, 22, 26-30"
Ограничения: нужно использовать только натуральные числа (положительные, целые числа), максимальное число для Ex2003 - 65536MCH
Огромное при-огромное СПАСИБО всем Вам! Фанкции помогли и работают как надо, что и требовалось сделать. Я так рад! Написал бы крупным жирным шрифтом "спасибо" но боюсь удалят такое сообщение!
Огромное при-огромное СПАСИБО всем Вам! Фанкции помогли и работают как надо, что и требовалось сделать. Я так рад! Написал бы крупным жирным шрифтом "спасибо" но боюсь удалят такое сообщение!benelli