Страницы: 1
RSS
Разбить строку по ячейкам.
 
Добрый всем день!
Новая интересная задачка, я её решил формулами, но пипец как длинно и громоздко. Если будут мысли как это сделать более "элегантно" буду премного благодарен!

Суть задачи:
Существует запись заказа, которая прописывается в файле Плана Производства:
Заявка_058_099_БК:   001,002,005-008,020-027,030-035,070-079,097
где:
Заявка_058 - порядковый номер заявки в   году (min 001, max 999)
_099_БК: - общее количество Блок-контейнеров в   заявке (min 001, max 999)
001,002,005-008,020-027,030-035,070-079,097   - порядковые номера идентичных Блок-контейнеров ("-" обозначает   диапазон "с… по...")
Необходимо из записи заявки извлечь все порядковые номера Блок-контейнеров, диапазоны заменить на последовательности, каждый номер расположить в отдельной ячейке, в столбик. Конечная запись выглядит так:
Результат
1
2
5
6
7
8
20
21
22
23
24
25
26
27
30
31
32
33
34
35
70
71
72
73
74
75
76
77
78
79
97
Правила записи номера заявки следующие:
Заявка_058_099_БК: 001,002,005-008,020-027,030-035,070-079,097
Заявка_058_099_БК:  - постоянная часть, с постоянным количеством знаков 19 штук. (включая пробел после ":"). Оба числа всегда по 3 знака, от 001, до 999.
001,002,005-008,020-027,030-035,070-079,097 - порядковые номера контейнеров, всегда по 3 знака, "-" - обозначение интервалов с номерами, разделение ",", всегда записываются без пробелов. количество одиночных номеров и интервалов не ограничено.
Пробел в записи встречается только один раз, после ":", т.е. отделяет номер заявки от перечня контейнеров.

Данную задачу решил с помощью формул, очень громоздко получилось, файл прикрепляю.
При чём пришлось использовать нестандартную функцию "РАЗБСТРОКУ"  - как я понимаю эта функция появилась после установки надстройки "EXCELTools".

Буду благодарен за подсказку как это сделать менее громоздко, в т.ч. с помощью макроса.
Особенно хотелось бы убрать нестандартную функцию "РАЗБСТРОКУ".
 
Добрый день

Не совсем понятен алгоритм действий с точки зрения пользователя, но сама задача сводится к выделению ряда чисел, часть из которых записана интервалами. Можно сделать например так (результат заносится в массив res):
Код
Sub test()
    Dim st As String
    Dim tmp() As String, j As Integer, k As Integer
    Dim res() As Integer, i As Integer
    st = "Заявка_058_099_БК: 001,002,005-008,020-027,030-035,070-079,097"
    tmp = Split(Split(st, " ")(1), ",")
    
    i = 0
    For j = LBound(tmp) To UBound(tmp)
        If tmp(j) Like "*-*" Then
            For k = Int(Split(tmp(j), "-")(0)) To Int(Split(tmp(j), "-")(1))
                ReDim Preserve res(i)
                res(i) = k
                i = i + 1
            Next k
        Else
            ReDim Preserve res(i)
            res(i) = Int(tmp(j))
            i = i + 1
        End If
    Next j
End Sub
 
webley, благодарю! Буду изучать.

Пользователь данного файла ни как не пользуется результатом "расклада" заявки в числовой ряд. Он даже не знает об этом.
Результат используется в дальнейшем, при разворачивании норм расхода материалов на каждый контейнер и формировании выписки материалов со склада, для подачи их к нужному времени на производственные участки (План производства - номер контейнера - дата производства - норма из технологической карты - заявка на доставку материалов к нужному участку).
 
Результат заносится в столбец I
Код
Sub Konteiner()
Dim arr
Dim n As Long
Dim BeginNumber As Long
Dim iRow As Long
  arr = Split(WorksheetFunction.Trim(Split(Range("A24"), ":")(1)), ",")
    iRow = 25
  For n = 0 To UBound(arr)
    If InStr(arr(n), "-") > 0 Then     'есть перечень номеров
      BeginNumber = Split(arr(n), "-")(0)
      Cells(iRow, "I") = BeginNumber
      Do
        BeginNumber = BeginNumber + 1
        iRow = iRow + 1
        Cells(iRow, "I") = BeginNumber
      Loop While BeginNumber <> Split(arr(n), "-")(1) + 1
    Else
      Cells(iRow, "I") = arr(n)
      iRow = iRow + 1
    End If
  Next
End Sub
 
Олег Ирхин, я вообще к тому, что не совсем понятно, откуда берется исходная строка и в каком виде должен быть оформлен результат. Поэтому написал некий "скелет", который уже можно доработать под нужный процесс
 
webley, ага, я не правильно понял фразу о пользователе, теперь ясно.


webley,
Kuzmich,
Благодарю Вас за помощь! Думаю теперь задачка будет решаться гораздо "красивее", чем с моим монструозным вариантом на формулах!
 
Ну и ещё, просто интересно -  я не смог найти стандартную формулу (сочетание формул) для деления содержимого строки по столбцам. Пришлось пользоваться функцией из надстройки ("РАЗБСТРОКУ" из "EXCELTools"). Возможно все таки есть возможность сделать это в стандартном экселе? У меня офис LTSC профессиональный плюс 2021.
 
а Данные -> Текст по столбцам не подойдет?

Ну или если непременно формулой:
Код
=ФИЛЬТР.XML("<t><s>"&ПОДСТАВИТЬ(A1;"-";"</s><s>")&"</s></t>";"//s[1]")
, где "-" - разделитель, s[1] - номер столбца.

PS формула взята отсюда:
https://www.planetaexcel.ru/forum/index.php?PAGE_NAME=message&FID=1&TID=152971
Изменено: webley - 21.11.2022 14:44:42
 
Цитата
Олег Ирхин написал:
деления содержимого строки по столбцам
как вариант =TRIM(MID(SUBSTITUTE($B$20;",";REPT(" ";20));(COLUMN(A1)-1)*20+1;20)), текст разделенный запятыми в B20
формулу тянуть вправо
 
Одной формулой всё
=ЕСЛИОШИБКА(НАИМЕНЬШИЙ(ЕСЛИ(ЕСЛИОШИБКА((СТОЛБЕЦ(A:ALK)>=--ЛЕВБ(СЖПРОБЕЛЫ(ПСТР(ПОДСТАВИТЬ(ПСТР(B$24;20;999);",";ПОВТОР(" ";99));СТРОКА($1:$99)*99-98;99));3))*(СТОЛБЕЦ(A:ALK)<=--ПРАВБ(СЖПРОБЕЛЫ(ПСТР(ПОДСТАВИТЬ(ПСТР(B$24;20;999);",";ПОВТОР(" ";99));СТРОКА($1:$99)*99-98;99));3)););СТОЛБЕЦ(A:ALK));СТРОКА(A1));"")
Думаю, что можно и покороче, если подумать еще )))
Изменено: _Boroda_ - 21.11.2022 14:51:42
Скажи мне, кудесник, любимец ба’гов...
 
webley,
bigorq,
С ходу не получилось, но думаю разберусь.

_Boroda_,  - тут всё  заработало сразу!

Ребята, огромное спасибо!
 
Добрый день, форумчане!
Задачка схожей тематики, что выше, но со своими нюансами. Решил я её опять не очень желательным способом - с использованием надстройки.
Пример прилагаю.
Прошу посмотреть, высказать мнение - можно ли добиться результата стандартными средствами. Как и прежде, макросы - крайний вариант...

Суть: Существует несколько горизонтальных списков Номенклатур (пример, стоки 2-5). Номенклатуры в разных строчках часто дублируются. Количество номенклатур в каждом списке не превышает 100.
Таких строк может быть до 900, в дальнейшем, количество скорее всего будет увеличиваться.

Из значений горизонтальных списков нужно сформировать один вертикальный список с уникальными значениями, отсортированный от "А" до "Я". Общее количество уникальных значений вертикального списка не превысит 5000.
Пример того как это получилось у меня, в области A13:B82.

Буду признателен за ваши мысли.
 
Ни каких мыслей?
На формулах получается что-то монструозно-невообразимое. Расчетный скрытый лист получился на 78`000 строк, с реальными перспективами прироста 500-600 строк ежемесячно.
 
Цитата
Олег Ирхин написал:
Ни каких мыслей?
Попробуйте на ВБА. Кстати, задача будет выступать побудителем к освоению, если еще не освоили. Я лично так и освоил, ну, т.е. ОСВАИВАЮ ...
 
Цитата
написал:
Цитата
Олег Ирхин написал:
Ни каких мыслей?
Попробуйте на ВБА. Кстати, задача будет выступать побудителем к освоению, если еще не освоили. Я лично так и освоил, ну, т.е. ОСВАИВАЮ ...
Осваиваю VBA и я помаленьку. Но есть жесткое указание руководства в некоторых файлах не применять макросы, вот как раз один из случаев...
Людей пугает тот факт, что с макросами работаю только я. Формулы худо-бедно могут и другие поправить в случае чего.
Вобщем на лицо обеспокоенность руководителя зависимостью..
 
пусть считает руками, голова будет постоянно занята расчетами и у него не останется времени на обеспокоенность
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
написал:
пусть считает руками, голова будет постоянно занята расчетами и у него не останется времени на обеспокоенность
:D  так то оно так... Но я ведь тоже хочу ночами спать, выходные хоть иногда устаивать. Да и отпуск... нее.., на счет отпуска, это я уже конечно замечтался..
Страницы: 1
Наверх