Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Добавление библиотеки - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Добавление библиотеки (Макросы/Sub)
Добавление библиотеки
ZamoK Дата: Понедельник, 30.11.2015, 14:31 | Сообщение № 1
Группа: Проверенные
Ранг: Обитатель
Сообщений: 268
Репутация: 4 ±
Замечаний: 0% ±

Excel 2003-2016
Не так давно мне очень сильно помогли два человека, в написании макроса, причем задача одна, но выполнена двумя разными способами (это SLAVICK пост, и видимо параллельно изучавший суть вопроса предложил вариант без рекурсии miver пост), оба варианта работают в разных документах, отлично справляются с поставленной задачей спасибо огромное за помощь.
В процессе работы появилась необходимость добавления ещё одного листа "Остатки" и соответственно библиотеки в код. Думаю людям кто не участвовал в разработке этих документов будет трудно разобраться что и куда, почему и зачем, хотя всё может быть и я кого-то недооцениваю - прошу прощенья!
На своём так сказать уровне создал библиотеку, но как её использовать так и не понял, и задался вопросом - А возможно ли то, что я делаю или сломаю то что есть! Пришёл в выводу - надо посоветоваться в профи.
Коротко: Макрос берёт имя детали(узла) и его кол-во на листе "Перечень", затем идет на лист "Состав узлов" и берёт от туда состав этого узлов и кол-во (перемножает соответственно), проверяет номера на наличие первой цифры 3 или 6 (на них начинаются узлы которые в свою очередь состоят из нескольких деталей) и разузловывают эти детали, процесс идёт до последнего узла.
Суть: Добавлен лист "Остатки" от туда по имени из столбца (I) забираем число из столбца (M) это остаток этой детали на складе.
Пример: если надо детали Х - 5шт., а на складе её 2-е значит, на лист "итог" должно попасть 3шт, или на складе её 100шт. значит она вообще не должна попадать на лист "итог"
В коде имеем две библиотеки это: arr - с листа "Перечень", и masiv - с листа "Состав узлов". Вопрос как добавить 3-ю с листа "Остатки" и какое имя ей присвоить?
Приветствуются любые предложения.
Да библиотеку что я пытался всунуть я убрал - дабы не запутать людей понимающих :D, Да и вообще возможно ли добавление без крутых изменений кода?
К сообщению приложен файл: SLAVICK.xlsm (98.2 Kb)


Я не Гуру, но стремлюсь!

Сообщение отредактировал ZamoK - Понедельник, 30.11.2015, 14:32
 
Ответить
СообщениеНе так давно мне очень сильно помогли два человека, в написании макроса, причем задача одна, но выполнена двумя разными способами (это SLAVICK пост, и видимо параллельно изучавший суть вопроса предложил вариант без рекурсии miver пост), оба варианта работают в разных документах, отлично справляются с поставленной задачей спасибо огромное за помощь.
В процессе работы появилась необходимость добавления ещё одного листа "Остатки" и соответственно библиотеки в код. Думаю людям кто не участвовал в разработке этих документов будет трудно разобраться что и куда, почему и зачем, хотя всё может быть и я кого-то недооцениваю - прошу прощенья!
На своём так сказать уровне создал библиотеку, но как её использовать так и не понял, и задался вопросом - А возможно ли то, что я делаю или сломаю то что есть! Пришёл в выводу - надо посоветоваться в профи.
Коротко: Макрос берёт имя детали(узла) и его кол-во на листе "Перечень", затем идет на лист "Состав узлов" и берёт от туда состав этого узлов и кол-во (перемножает соответственно), проверяет номера на наличие первой цифры 3 или 6 (на них начинаются узлы которые в свою очередь состоят из нескольких деталей) и разузловывают эти детали, процесс идёт до последнего узла.
Суть: Добавлен лист "Остатки" от туда по имени из столбца (I) забираем число из столбца (M) это остаток этой детали на складе.
Пример: если надо детали Х - 5шт., а на складе её 2-е значит, на лист "итог" должно попасть 3шт, или на складе её 100шт. значит она вообще не должна попадать на лист "итог"
В коде имеем две библиотеки это: arr - с листа "Перечень", и masiv - с листа "Состав узлов". Вопрос как добавить 3-ю с листа "Остатки" и какое имя ей присвоить?
Приветствуются любые предложения.
Да библиотеку что я пытался всунуть я убрал - дабы не запутать людей понимающих :D, Да и вообще возможно ли добавление без крутых изменений кода?

Автор - ZamoK
Дата добавления - 30.11.2015 в 14:31
ZamoK Дата: Понедельник, 30.11.2015, 14:31 | Сообщение № 2
Группа: Проверенные
Ранг: Обитатель
Сообщений: 268
Репутация: 4 ±
Замечаний: 0% ±

Excel 2003-2016
+ Вариант miver без рекурсии
К сообщению приложен файл: miver.xlsm (99.2 Kb)


Я не Гуру, но стремлюсь!
 
Ответить
Сообщение+ Вариант miver без рекурсии

Автор - ZamoK
Дата добавления - 30.11.2015 в 14:31
miver Дата: Понедельник, 30.11.2015, 16:17 | Сообщение № 3
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 190
Репутация: 37 ±
Замечаний: 0% ±

Excel 2010
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
[/vba]
К сообщению приложен файл: 222.xlsm (50.4 Kb)
 
Ответить
Сообщение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
[/vba]

Автор - miver
Дата добавления - 30.11.2015 в 16:17
ZamoK Дата: Понедельник, 30.11.2015, 16:23 | Сообщение № 4
Группа: Проверенные
Ранг: Обитатель
Сообщений: 268
Репутация: 4 ±
Замечаний: 0% ±

Excel 2003-2016
miver, Все отлично работает! а можно немного пояснить в добавленном что где происходит. Спасибо!


Я не Гуру, но стремлюсь!
 
Ответить
Сообщениеmiver, Все отлично работает! а можно немного пояснить в добавленном что где происходит. Спасибо!

Автор - ZamoK
Дата добавления - 30.11.2015 в 16:23
miver Дата: Понедельник, 30.11.2015, 16:35 | Сообщение № 5
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 190
Репутация: 37 ±
Замечаний: 0% ±

Excel 2010
В первой части создается словарь остатка. Ключ = столбику (I), а значение столбику (M)
Во второй части проверяется наличие Ключа в словаре остатка
Если есть проверяем больше ли то что нужно и выводим разницу в массив rez
Если ключа нет, то выводим все
Во всех других случаях ничего не делаем

Как бы все B)
 
Ответить
СообщениеВ первой части создается словарь остатка. Ключ = столбику (I), а значение столбику (M)
Во второй части проверяется наличие Ключа в словаре остатка
Если есть проверяем больше ли то что нужно и выводим разницу в массив rez
Если ключа нет, то выводим все
Во всех других случаях ничего не делаем

Как бы все B)

Автор - miver
Дата добавления - 30.11.2015 в 16:35
ZamoK Дата: Понедельник, 30.11.2015, 17:26 | Сообщение № 6
Группа: Проверенные
Ранг: Обитатель
Сообщений: 268
Репутация: 4 ±
Замечаний: 0% ±

Excel 2003-2016
В принципе тоже самое можно применить и в пост SLAVICK, или я ошибаюсь?


Я не Гуру, но стремлюсь!
 
Ответить
СообщениеВ принципе тоже самое можно применить и в пост SLAVICK, или я ошибаюсь?

Автор - ZamoK
Дата добавления - 30.11.2015 в 17:26
miver Дата: Понедельник, 30.11.2015, 18:02 | Сообщение № 7
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 190
Репутация: 37 ±
Замечаний: 0% ±

Excel 2010
ZamoK, У SLAVICK нет перебора массива в явной форме. rez создается динамически. Поэтому реализация будет сложнее и должна учитывать, что некоторые элементы повторяются несколько раз.
 
Ответить
СообщениеZamoK, У SLAVICK нет перебора массива в явной форме. rez создается динамически. Поэтому реализация будет сложнее и должна учитывать, что некоторые элементы повторяются несколько раз.

Автор - miver
Дата добавления - 30.11.2015 в 18:02
ZamoK Дата: Понедельник, 30.11.2015, 18:25 | Сообщение № 8
Группа: Проверенные
Ранг: Обитатель
Сообщений: 268
Репутация: 4 ±
Замечаний: 0% ±

Excel 2003-2016
miver, Спасибо за разъяснения! Нехотелось бы уходить от варианта SLAVICK т.к. скорость обработки в его варианте быстрее я его привязал в очень большом документе, Ваш вариант работает в документе, где база данных немого меньше, времени прошло уже не мало, все работает отлично!
Всетаки хочется дождаться ответа SLAVICK может, что можно доработать и в его варианте (без серьёзных изменений конечно.)


Я не Гуру, но стремлюсь!

Сообщение отредактировал ZamoK - Вторник, 01.12.2015, 08:19
 
Ответить
Сообщениеmiver, Спасибо за разъяснения! Нехотелось бы уходить от варианта SLAVICK т.к. скорость обработки в его варианте быстрее я его привязал в очень большом документе, Ваш вариант работает в документе, где база данных немого меньше, времени прошло уже не мало, все работает отлично!
Всетаки хочется дождаться ответа SLAVICK может, что можно доработать и в его варианте (без серьёзных изменений конечно.)

Автор - ZamoK
Дата добавления - 30.11.2015 в 18:25
ZamoK Дата: Среда, 02.12.2015, 14:19 | Сообщение № 9
Группа: Проверенные
Ранг: Обитатель
Сообщений: 268
Репутация: 4 ±
Замечаний: 0% ±

Excel 2003-2016
miver, УПС не совсем корректно работает, не учитывает узлы входящие в узлы.
Видимо надо проверку делать перед формированием строк и минусовать "k" при умножении кол-ва деталей входящих в узел который есть в остатках (т.е. если узел уже есть, то его составляющие надо убрать из потребности)
К сообщению приложен файл: 222-3-.xlsm (45.5 Kb)


Я не Гуру, но стремлюсь!

Сообщение отредактировал ZamoK - Среда, 02.12.2015, 20:44
 
Ответить
Сообщениеmiver, УПС не совсем корректно работает, не учитывает узлы входящие в узлы.
Видимо надо проверку делать перед формированием строк и минусовать "k" при умножении кол-ва деталей входящих в узел который есть в остатках (т.е. если узел уже есть, то его составляющие надо убрать из потребности)

Автор - ZamoK
Дата добавления - 02.12.2015 в 14:19
miver Дата: Среда, 02.12.2015, 17:43 | Сообщение № 10
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 190
Репутация: 37 ±
Замечаний: 0% ±

Excel 2010
если узел уже есть
А где он есть?
Беру "741125.005" и ищу на вкладке "Остатки", а его там нет <_<
 
Ответить
Сообщение
если узел уже есть
А где он есть?
Беру "741125.005" и ищу на вкладке "Остатки", а его там нет <_<

Автор - miver
Дата добавления - 02.12.2015 в 17:43
ZamoK Дата: Среда, 02.12.2015, 20:40 | Сообщение № 11
Группа: Проверенные
Ранг: Обитатель
Сообщений: 268
Репутация: 4 ±
Замечаний: 0% ±

Excel 2003-2016
Беру "741125.005"
начинается на 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
[/vba]


Я не Гуру, но стремлюсь!

Сообщение отредактировал ZamoK - Среда, 02.12.2015, 20:41
 
Ответить
Сообщение
Беру "741125.005"
начинается на 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
[/vba]

Автор - ZamoK
Дата добавления - 02.12.2015 в 20:40
miver Дата: Четверг, 03.12.2015, 15:22 | Сообщение № 12
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 190
Репутация: 37 ±
Замечаний: 0% ±

Excel 2010
ZamoK, Не уверен что получилось.
Смотрите
К сообщению приложен файл: 222-3-1-.xlsm (51.1 Kb)
 
Ответить
СообщениеZamoK, Не уверен что получилось.
Смотрите

Автор - miver
Дата добавления - 03.12.2015 в 15:22
ZamoK Дата: Четверг, 03.12.2015, 16:22 | Сообщение № 13
Группа: Проверенные
Ранг: Обитатель
Сообщений: 268
Репутация: 4 ±
Замечаний: 0% ±

Excel 2003-2016
miver, все замечания наглядны в файле.
К сообщению приложен файл: 4061680.xlsm (49.7 Kb)


Я не Гуру, но стремлюсь!
 
Ответить
Сообщениеmiver, все замечания наглядны в файле.

Автор - ZamoK
Дата добавления - 03.12.2015 в 16:22
SLAVICK Дата: Четверг, 03.12.2015, 16:36 | Сообщение № 14
Группа: Модераторы
Ранг: Старожил
Сообщений: 2290
Репутация: 766 ±
Замечаний: 0% ±

2019
Так?
К сообщению приложен файл: SLAVICK.zip (65.7 Kb)


Иногда все проще чем кажется с первого взгляда.
 
Ответить
СообщениеТак?

Автор - SLAVICK
Дата добавления - 03.12.2015 в 16:36
ZamoK Дата: Пятница, 04.12.2015, 08:45 | Сообщение № 15
Группа: Проверенные
Ранг: Обитатель
Сообщений: 268
Репутация: 4 ±
Замечаний: 0% ±

Excel 2003-2016
SLAVICK, Да именно так. :D вроде всё точно. Спасибо. +


Я не Гуру, но стремлюсь!
 
Ответить
СообщениеSLAVICK, Да именно так. :D вроде всё точно. Спасибо. +

Автор - ZamoK
Дата добавления - 04.12.2015 в 08:45
miver Дата: Пятница, 04.12.2015, 11:28 | Сообщение № 16
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 190
Репутация: 37 ±
Замечаний: 0% ±

Excel 2010
ZamoK, Вот кажись доделал
С SLAVICK, не сходится по 741125.005, Вам виднее
К сообщению приложен файл: 1485531.xlsm (51.8 Kb)


Сообщение отредактировал miver - Пятница, 04.12.2015, 11:28
 
Ответить
СообщениеZamoK, Вот кажись доделал
С SLAVICK, не сходится по 741125.005, Вам виднее

Автор - miver
Дата добавления - 04.12.2015 в 11:28
ZamoK Дата: Воскресенье, 06.12.2015, 19:30 | Сообщение № 17
Группа: Проверенные
Ранг: Обитатель
Сообщений: 268
Репутация: 4 ±
Замечаний: 0% ±

Excel 2003-2016
Верно не сходится именно на 741125.005 Плита и 758491.115 Шайба обе они входят в 301313.085-01Плита, а их на складе 2, значит в варианте SLAVICK есть действительно недочёт :(
Блин, благо, что в большую сторону, а то уже документ в работу отдал :D больше не меньше!


Я не Гуру, но стремлюсь!

Сообщение отредактировал ZamoK - Воскресенье, 06.12.2015, 19:43
 
Ответить
СообщениеВерно не сходится именно на 741125.005 Плита и 758491.115 Шайба обе они входят в 301313.085-01Плита, а их на складе 2, значит в варианте SLAVICK есть действительно недочёт :(
Блин, благо, что в большую сторону, а то уже документ в работу отдал :D больше не меньше!

Автор - ZamoK
Дата добавления - 06.12.2015 в 19:30
SLAVICK Дата: Понедельник, 07.12.2015, 10:30 | Сообщение № 18
Группа: Модераторы
Ранг: Старожил
Сообщений: 2290
Репутация: 766 ±
Замечаний: 0% ±

2019
Шайба обе они входят в 301313.085-01Плита, а их на складе 2, значит в варианте SLAVICK есть действительно недочёт :(

Дело в том, что я делаю проверку на наличие на складе уже в конце, когда все раскомплектовано.
Если не ошибаюсь(давно я это делал) - то по идее на листе итог ВСЕ узлы разкомплектовываются, т.е. по сути все узлы не нужны там, поскольку они уже есть в разобранном виде ниже :) .
Например:
301313.085-01 Плита 10
741125.005 Плита 10
758491.115 Шайба 10
Так вот нужно 10 шт 301313.085-01 - а мы ее разобрали на комплектующие, и кроме этого показываем саму плиту 10шт ... т.е. в итоге получается 20 плит :o

Как по мне - вообще не правильный подход в одном виде хранить данные по разным иерархиям. Возможно конечно специфика такая.... я бы сделал базу остатков с перечнем всех деталей(именно конечных,а не узлов), и в отдельном столбце указывал бы в составе какого узла они уже есть. Или же при формировании итога - нужно сразу смотреть на наличие на складе узлов, в случае если они там есть - то дальше их не разбирать... но это уже совсем другая история :D


Иногда все проще чем кажется с первого взгляда.
 
Ответить
Сообщение
Шайба обе они входят в 301313.085-01Плита, а их на складе 2, значит в варианте SLAVICK есть действительно недочёт :(

Дело в том, что я делаю проверку на наличие на складе уже в конце, когда все раскомплектовано.
Если не ошибаюсь(давно я это делал) - то по идее на листе итог ВСЕ узлы разкомплектовываются, т.е. по сути все узлы не нужны там, поскольку они уже есть в разобранном виде ниже :) .
Например:
301313.085-01 Плита 10
741125.005 Плита 10
758491.115 Шайба 10
Так вот нужно 10 шт 301313.085-01 - а мы ее разобрали на комплектующие, и кроме этого показываем саму плиту 10шт ... т.е. в итоге получается 20 плит :o

Как по мне - вообще не правильный подход в одном виде хранить данные по разным иерархиям. Возможно конечно специфика такая.... я бы сделал базу остатков с перечнем всех деталей(именно конечных,а не узлов), и в отдельном столбце указывал бы в составе какого узла они уже есть. Или же при формировании итога - нужно сразу смотреть на наличие на складе узлов, в случае если они там есть - то дальше их не разбирать... но это уже совсем другая история :D

Автор - SLAVICK
Дата добавления - 07.12.2015 в 10:30
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Добавление библиотеки (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!