Не так давно мне очень сильно помогли два человека, в написании макроса, причем задача одна, но выполнена двумя разными способами (это SLAVICKпост, и видимо параллельно изучавший суть вопроса предложил вариант без рекурсии miverпост), оба варианта работают в разных документах, отлично справляются с поставленной задачей спасибо огромное за помощь. В процессе работы появилась необходимость добавления ещё одного листа "Остатки" и соответственно библиотеки в код. Думаю людям кто не участвовал в разработке этих документов будет трудно разобраться что и куда, почему и зачем, хотя всё может быть и я кого-то недооцениваю - прошу прощенья! На своём так сказать уровне создал библиотеку, но как её использовать так и не понял, и задался вопросом - А возможно ли то, что я делаю или сломаю то что есть! Пришёл в выводу - надо посоветоваться в профи. Коротко: Макрос берёт имя детали(узла) и его кол-во на листе "Перечень", затем идет на лист "Состав узлов" и берёт от туда состав этого узлов и кол-во (перемножает соответственно), проверяет номера на наличие первой цифры 3 или 6 (на них начинаются узлы которые в свою очередь состоят из нескольких деталей) и разузловывают эти детали, процесс идёт до последнего узла. Суть: Добавлен лист "Остатки" от туда по имени из столбца (I) забираем число из столбца (M) это остаток этой детали на складе. Пример: если надо детали Х - 5шт., а на складе её 2-е значит, на лист "итог" должно попасть 3шт, или на складе её 100шт. значит она вообще не должна попадать на лист "итог" В коде имеем две библиотеки это: arr - с листа "Перечень", и masiv - с листа "Состав узлов". Вопрос как добавить 3-ю с листа "Остатки" и какое имя ей присвоить? Приветствуются любые предложения. Да библиотеку что я пытался всунуть я убрал - дабы не запутать людей понимающих :D, Да и вообще возможно ли добавление без крутых изменений кода?
Не так давно мне очень сильно помогли два человека, в написании макроса, причем задача одна, но выполнена двумя разными способами (это SLAVICKпост, и видимо параллельно изучавший суть вопроса предложил вариант без рекурсии miverпост), оба варианта работают в разных документах, отлично справляются с поставленной задачей спасибо огромное за помощь. В процессе работы появилась необходимость добавления ещё одного листа "Остатки" и соответственно библиотеки в код. Думаю людям кто не участвовал в разработке этих документов будет трудно разобраться что и куда, почему и зачем, хотя всё может быть и я кого-то недооцениваю - прошу прощенья! На своём так сказать уровне создал библиотеку, но как её использовать так и не понял, и задался вопросом - А возможно ли то, что я делаю или сломаю то что есть! Пришёл в выводу - надо посоветоваться в профи. Коротко: Макрос берёт имя детали(узла) и его кол-во на листе "Перечень", затем идет на лист "Состав узлов" и берёт от туда состав этого узлов и кол-во (перемножает соответственно), проверяет номера на наличие первой цифры 3 или 6 (на них начинаются узлы которые в свою очередь состоят из нескольких деталей) и разузловывают эти детали, процесс идёт до последнего узла. Суть: Добавлен лист "Остатки" от туда по имени из столбца (I) забираем число из столбца (M) это остаток этой детали на складе. Пример: если надо детали Х - 5шт., а на складе её 2-е значит, на лист "итог" должно попасть 3шт, или на складе её 100шт. значит она вообще не должна попадать на лист "итог" В коде имеем две библиотеки это: arr - с листа "Перечень", и masiv - с листа "Состав узлов". Вопрос как добавить 3-ю с листа "Остатки" и какое имя ей присвоить? Приветствуются любые предложения. Да библиотеку что я пытался всунуть я убрал - дабы не запутать людей понимающих :D, Да и вообще возможно ли добавление без крутых изменений кода?ZamoK
'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Dim os_dic As New Dictionary arr = Лист2.Range("I3:M" & Лист2.Cells(Rows.Count, 9).End(xlUp).Row).Value For i = 1 To UBound(arr) arr(i, 1) = Trim(arr(i, 1)) If Len(arr(i, 1)) Then If Not os_dic.Exists(arr(i, 1)) Then os_dic.Add arr(i, 1), arr(i, 5) End If Next i Erase arr '++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
[/vba] [vba]
Код
For Each key In d.Keys '++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ If os_dic.Exists(key) Then If os_dic(key) < d(key)(3) Then p = p + 1 rez(p, 1) = p For i = 1 To 2 rez(p, i + 1) = d(key)(i) Next i rez(p, 4) = d(key)(3) - os_dic(key) End If Else '++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ p = p + 1 rez(p, 1) = p For i = 1 To 3 rez(p, i + 1) = d(key)(i) Next i End If Next key
[/vba]
ZamoK, Проверяйте Что добавил [vba]
Код
'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Dim os_dic As New Dictionary arr = Лист2.Range("I3:M" & Лист2.Cells(Rows.Count, 9).End(xlUp).Row).Value For i = 1 To UBound(arr) arr(i, 1) = Trim(arr(i, 1)) If Len(arr(i, 1)) Then If Not os_dic.Exists(arr(i, 1)) Then os_dic.Add arr(i, 1), arr(i, 5) End If Next i Erase arr '++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
[/vba] [vba]
Код
For Each key In d.Keys '++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ If os_dic.Exists(key) Then If os_dic(key) < d(key)(3) Then p = p + 1 rez(p, 1) = p For i = 1 To 2 rez(p, i + 1) = d(key)(i) Next i rez(p, 4) = d(key)(3) - os_dic(key) End If Else '++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ p = p + 1 rez(p, 1) = p For i = 1 To 3 rez(p, i + 1) = d(key)(i) Next i End If Next key
В первой части создается словарь остатка. Ключ = столбику (I), а значение столбику (M) Во второй части проверяется наличие Ключа в словаре остатка Если есть проверяем больше ли то что нужно и выводим разницу в массив rez Если ключа нет, то выводим все Во всех других случаях ничего не делаем
Как бы все
В первой части создается словарь остатка. Ключ = столбику (I), а значение столбику (M) Во второй части проверяется наличие Ключа в словаре остатка Если есть проверяем больше ли то что нужно и выводим разницу в массив rez Если ключа нет, то выводим все Во всех других случаях ничего не делаем
ZamoK, У SLAVICK нет перебора массива в явной форме. rez создается динамически. Поэтому реализация будет сложнее и должна учитывать, что некоторые элементы повторяются несколько раз.
ZamoK, У SLAVICK нет перебора массива в явной форме. rez создается динамически. Поэтому реализация будет сложнее и должна учитывать, что некоторые элементы повторяются несколько раз.miver
miver, Спасибо за разъяснения! Нехотелось бы уходить от варианта SLAVICK т.к. скорость обработки в его варианте быстрее я его привязал в очень большом документе, Ваш вариант работает в документе, где база данных немого меньше, времени прошло уже не мало, все работает отлично! Всетаки хочется дождаться ответа SLAVICK может, что можно доработать и в его варианте (без серьёзных изменений конечно.)
miver, Спасибо за разъяснения! Нехотелось бы уходить от варианта SLAVICK т.к. скорость обработки в его варианте быстрее я его привязал в очень большом документе, Ваш вариант работает в документе, где база данных немого меньше, времени прошло уже не мало, все работает отлично! Всетаки хочется дождаться ответа SLAVICK может, что можно доработать и в его варианте (без серьёзных изменений конечно.)ZamoK
Я не Гуру, но стремлюсь!
Сообщение отредактировал ZamoK - Вторник, 01.12.2015, 08:19
miver, УПС не совсем корректно работает, не учитывает узлы входящие в узлы. Видимо надо проверку делать перед формированием строк и минусовать "k" при умножении кол-ва деталей входящих в узел который есть в остатках (т.е. если узел уже есть, то его составляющие надо убрать из потребности)
miver, УПС не совсем корректно работает, не учитывает узлы входящие в узлы. Видимо надо проверку делать перед формированием строк и минусовать "k" при умножении кол-ва деталей входящих в узел который есть в остатках (т.е. если узел уже есть, то его составляющие надо убрать из потребности)ZamoK
начинается на 7 - это не узел. Я приложил файл 222-3 там всё выделено. В составе швеллера 301314.044 есть узел "Плита 301313.085-01" (узел потому, что начинается на 3), код понимает его как узел и разузловывает, кол-во деталей входящих в Плиту умножается на кол-во Плиты в Швеллере и на кол-во самих Швеллеров (схематично показал в файле на листе перечень) Файл перезалил. Так как на остатках Пластины 715111.080 - 3шт и Плиты 301313.085-01 - 2шт вычитаем их как реализовано в твоём коде, но убрать надо было и Плиту и входящие в неё детали, которые нужны для изготовления самой Плиты Сегодня день убил чтоб доработать, но притерпел фиаско :D Если подставить -2 после k, то результат есть, но надо ставить аргумент а не -2 [vba]
Код
If Left(s, 1) = 3 Or Left(s, 1) = 6 Then p = p + 1 st(p, 0) = s st(p, 1) = struct(i, 5) * k - 2 st(p, 2) = 1
начинается на 7 - это не узел. Я приложил файл 222-3 там всё выделено. В составе швеллера 301314.044 есть узел "Плита 301313.085-01" (узел потому, что начинается на 3), код понимает его как узел и разузловывает, кол-во деталей входящих в Плиту умножается на кол-во Плиты в Швеллере и на кол-во самих Швеллеров (схематично показал в файле на листе перечень) Файл перезалил. Так как на остатках Пластины 715111.080 - 3шт и Плиты 301313.085-01 - 2шт вычитаем их как реализовано в твоём коде, но убрать надо было и Плиту и входящие в неё детали, которые нужны для изготовления самой Плиты Сегодня день убил чтоб доработать, но притерпел фиаско :D Если подставить -2 после k, то результат есть, но надо ставить аргумент а не -2 [vba]
Код
If Left(s, 1) = 3 Or Left(s, 1) = 6 Then p = p + 1 st(p, 0) = s st(p, 1) = struct(i, 5) * k - 2 st(p, 2) = 1
Верно не сходится именно на 741125.005 Плита и 758491.115 Шайба обе они входят в 301313.085-01Плита, а их на складе 2, значит в варианте SLAVICK есть действительно недочёт :( Блин, благо, что в большую сторону, а то уже документ в работу отдал больше не меньше!
Верно не сходится именно на 741125.005 Плита и 758491.115 Шайба обе они входят в 301313.085-01Плита, а их на складе 2, значит в варианте SLAVICK есть действительно недочёт :( Блин, благо, что в большую сторону, а то уже документ в работу отдал больше не меньше!ZamoK
Я не Гуру, но стремлюсь!
Сообщение отредактировал ZamoK - Воскресенье, 06.12.2015, 19:43
Шайба обе они входят в 301313.085-01Плита, а их на складе 2, значит в варианте SLAVICK есть действительно недочёт :(
Дело в том, что я делаю проверку на наличие на складе уже в конце, когда все раскомплектовано. Если не ошибаюсь(давно я это делал) - то по идее на листе итог ВСЕ узлы разкомплектовываются, т.е. по сути все узлы не нужны там, поскольку они уже есть в разобранном виде ниже . Например: 301313.085-01 Плита 10 741125.005 Плита 10 758491.115 Шайба 10 Так вот нужно 10 шт 301313.085-01 - а мы ее разобрали на комплектующие, и кроме этого показываем саму плиту 10шт ... т.е. в итоге получается 20 плит
Как по мне - вообще не правильный подход в одном виде хранить данные по разным иерархиям. Возможно конечно специфика такая.... я бы сделал базу остатков с перечнем всех деталей(именно конечных,а не узлов), и в отдельном столбце указывал бы в составе какого узла они уже есть. Или же при формировании итога - нужно сразу смотреть на наличие на складе узлов, в случае если они там есть - то дальше их не разбирать... но это уже совсем другая история
Шайба обе они входят в 301313.085-01Плита, а их на складе 2, значит в варианте SLAVICK есть действительно недочёт :(
Дело в том, что я делаю проверку на наличие на складе уже в конце, когда все раскомплектовано. Если не ошибаюсь(давно я это делал) - то по идее на листе итог ВСЕ узлы разкомплектовываются, т.е. по сути все узлы не нужны там, поскольку они уже есть в разобранном виде ниже . Например: 301313.085-01 Плита 10 741125.005 Плита 10 758491.115 Шайба 10 Так вот нужно 10 шт 301313.085-01 - а мы ее разобрали на комплектующие, и кроме этого показываем саму плиту 10шт ... т.е. в итоге получается 20 плит
Как по мне - вообще не правильный подход в одном виде хранить данные по разным иерархиям. Возможно конечно специфика такая.... я бы сделал базу остатков с перечнем всех деталей(именно конечных,а не узлов), и в отдельном столбце указывал бы в составе какого узла они уже есть. Или же при формировании итога - нужно сразу смотреть на наличие на складе узлов, в случае если они там есть - то дальше их не разбирать... но это уже совсем другая история SLAVICK