Добрый день, уважаемые форумчане. Возникла следующая задача: Дано: в ячейке есть текст с диапазоном чисел, записанным через дефис, например, 1-100 Необходимо: эту ячейку разобрать на массив всех целочисленных значений в указанном диапазоне, например, 1,2,3,...,100
Второй день бьюсь, никак не могу одолеть. В VBA лезть особо не хочется, но если без этого никак, то буду благодарен, если ткнёте носом где именно копать.
Заранее благодарен
Добрый день, уважаемые форумчане. Возникла следующая задача: Дано: в ячейке есть текст с диапазоном чисел, записанным через дефис, например, 1-100 Необходимо: эту ячейку разобрать на массив всех целочисленных значений в указанном диапазоне, например, 1,2,3,...,100
Второй день бьюсь, никак не могу одолеть. В VBA лезть особо не хочется, но если без этого никак, то буду благодарен, если ткнёте носом где именно копать.
Попробуйте вариант "Текст по столбцам" разделитель дефис. Если в тексте существуют пробелы то после разделения удалить пробелы через Ctrl+H. А лучше конечно файл - пример увидеть чтобы правильные советы дать.
Попробуйте вариант "Текст по столбцам" разделитель дефис. Если в тексте существуют пробелы то после разделения удалить пробелы через Ctrl+H. А лучше конечно файл - пример увидеть чтобы правильные советы дать.gling
gling, если использовать "Текст по столбцам" с разделителем дефис, то я получу 2 ячейки: 1 и 100. Т.е. все промежуточные значения не будут учтены (2,3,4,...,99).
gling, если использовать "Текст по столбцам" с разделителем дефис, то я получу 2 ячейки: 1 и 100. Т.е. все промежуточные значения не будут учтены (2,3,4,...,99).Vseslav
В VBA лезть особо не хочется, но если без этого никак, то буду благодарен, если ткнёте носом где именно копать.
Позвольте вставить в тему 5 VBA-шных копеек. Увидев подходящий случай, не преминул устроить себе вечернюю разминку с целью очередной демонстрации магии арифметики диапазонов Excel: [vba]
Код
Sub generateAllNaturalNumbersOfRange() Dim strSource As String Dim strAddress As String Dim rng As Range Dim c As Range
strSource = "1-25,35-30,45-49" 'исходная строка - несколько числовых диапазонов
'превращаем исходную строку в адрес диапазона Excel (в столбце A, чтобы далеко не ходить) strAddress = "A" & Replace(Replace(strSource, "-", ":A"), ",", ",A")
'здесь почувствуйте разницу, например, для strSource = "1-25,15-30" 'Set rng = Range(strAddress) Set rng = Union(Range(strAddress), Range(strAddress))
Debug.Print "Количество элементов ряда: ", rng.Cells.Count
'генерация всех элементов (натуральных чисел) сложной комбинации числовых диапазонов For Each c In rng.Cells Debug.Print c.Row 'номер строки олицетворяет собой очередное число ряда Next c
End Sub
[/vba]В общем, понимающий, да обрадуйся! Непонимающий - переспроси, не стесняйся!
В VBA лезть особо не хочется, но если без этого никак, то буду благодарен, если ткнёте носом где именно копать.
Позвольте вставить в тему 5 VBA-шных копеек. Увидев подходящий случай, не преминул устроить себе вечернюю разминку с целью очередной демонстрации магии арифметики диапазонов Excel: [vba]
Код
Sub generateAllNaturalNumbersOfRange() Dim strSource As String Dim strAddress As String Dim rng As Range Dim c As Range
strSource = "1-25,35-30,45-49" 'исходная строка - несколько числовых диапазонов
'превращаем исходную строку в адрес диапазона Excel (в столбце A, чтобы далеко не ходить) strAddress = "A" & Replace(Replace(strSource, "-", ":A"), ",", ",A")
'здесь почувствуйте разницу, например, для strSource = "1-25,15-30" 'Set rng = Range(strAddress) Set rng = Union(Range(strAddress), Range(strAddress))
Debug.Print "Количество элементов ряда: ", rng.Cells.Count
'генерация всех элементов (натуральных чисел) сложной комбинации числовых диапазонов For Each c In rng.Cells Debug.Print c.Row 'номер строки олицетворяет собой очередное число ряда Next c
End Sub
[/vba]В общем, понимающий, да обрадуйся! Непонимающий - переспроси, не стесняйся!Gustav
Захотелось на ходу после "вчерашнего" предложить решение и соответствующей обратной задачи. Т.е. имея последовательность натуральных чисел, причем, в общем случае неупорядоченную, свернуть эту последовательность в несколько диапазонов. Для наглядности и преемственности - в диапазоны предыдущего примера: [vba]
Код
Sub backTask() Dim arr As Variant, i As Long, rng As Range
Set rng = Cells(arr(LBound(arr)), 1) For i = LBound(arr) + 1 To UBound(arr) Set rng = Union(rng, Cells(arr(i), 1)) Next i
Debug.Print Replace(Replace(rng.Address(False, False), "A", ""), ":", "-") '45-49,30-35,1-25 End Sub
[/vba] Как видно из комментариев, на выходе получилась не очень хорошая строка - не по возрастанию диапазонов слева направо, вероятно, связанная именно с хаотичностью добавления ячеек в операторе Union. Если раскомментировать оператор с упорядоченной последовательностью чисел в Array, то возвращаемая строка станет "хорошей": 1-25,30-35,45-49.
Для универсальности же подхода с целью получения правильной строки следует неявно отсортировать последовательность чисел в процессе добавления очередных ячеек в операторе Union: [vba]
Код
Sub backTaskWithSort() Dim arr As Variant, i As Long, rng As Range, c As Range
Set rng = Cells(WorksheetFunction.Min(arr), 1) For i = LBound(arr) + 1 To UBound(arr) Set rng = Union(rng, Cells(WorksheetFunction.Small(arr, i + IIf(LBound(arr), 0, 1)), 1)) Next i
'бонус - отсортированный исходный массив - без дополнительных усилий For Each c In rng.Cells Debug.Print c.Row 'номер строки олицетворяет собой очередное число ряда Next c End Sub
[/vba]
Захотелось на ходу после "вчерашнего" предложить решение и соответствующей обратной задачи. Т.е. имея последовательность натуральных чисел, причем, в общем случае неупорядоченную, свернуть эту последовательность в несколько диапазонов. Для наглядности и преемственности - в диапазоны предыдущего примера: [vba]
Код
Sub backTask() Dim arr As Variant, i As Long, rng As Range
Set rng = Cells(arr(LBound(arr)), 1) For i = LBound(arr) + 1 To UBound(arr) Set rng = Union(rng, Cells(arr(i), 1)) Next i
Debug.Print Replace(Replace(rng.Address(False, False), "A", ""), ":", "-") '45-49,30-35,1-25 End Sub
[/vba] Как видно из комментариев, на выходе получилась не очень хорошая строка - не по возрастанию диапазонов слева направо, вероятно, связанная именно с хаотичностью добавления ячеек в операторе Union. Если раскомментировать оператор с упорядоченной последовательностью чисел в Array, то возвращаемая строка станет "хорошей": 1-25,30-35,45-49.
Для универсальности же подхода с целью получения правильной строки следует неявно отсортировать последовательность чисел в процессе добавления очередных ячеек в операторе Union: [vba]
Код
Sub backTaskWithSort() Dim arr As Variant, i As Long, rng As Range, c As Range
Set rng = Cells(WorksheetFunction.Min(arr), 1) For i = LBound(arr) + 1 To UBound(arr) Set rng = Union(rng, Cells(WorksheetFunction.Small(arr, i + IIf(LBound(arr), 0, 1)), 1)) Next i
'бонус - отсортированный исходный массив - без дополнительных усилий For Each c In rng.Cells Debug.Print c.Row 'номер строки олицетворяет собой очередное число ряда Next c End Sub
Захотелось на ходу после "вчерашнего" предложить решение и соответствующей обратной задачи. Т.е. имея последовательность натуральных чисел, причем, в общем случае неупорядоченную, свернуть эту последовательность в несколько диапазонов
Здравствуйте, посоветовали ваш замечательный код, но... увы очень нужен ваш код почему то не получилось., как раз тот случай нужно 2-35 разбить и собрать два этих кода ваших, как сделать чтоб заработало, не получается в файле примере
Захотелось на ходу после "вчерашнего" предложить решение и соответствующей обратной задачи. Т.е. имея последовательность натуральных чисел, причем, в общем случае неупорядоченную, свернуть эту последовательность в несколько диапазонов
Здравствуйте, посоветовали ваш замечательный код, но... увы очень нужен ваш код почему то не получилось., как раз тот случай нужно 2-35 разбить и собрать два этих кода ваших, как сделать чтоб заработало, не получается в файле примереnext777