Мое почтение, джентльмены... Делал для себя инструмент позволяющий хранить уже наработанный VBA код и его исполнять из XLL. Но тут случился Омикрон и проснулся сумрачный гений или случился сон разума... скорее второе... Сон прошел, но вот что осталось... Своим VBA-решением можно поделится с коллегами. Они смогут его использовать, но не смогут посмотреть код. Функционал: +Создана форма для загрузки и выполнения загруженного VBA-кода (загружаемый код - с Option Explicit и другими операторами). +Можно запускать прямо с главной панели (выбрав из списка нужный) +Можно задавать пароль на просмотр (по умолчанию это слово "Пароль") +Можно смотреть VBA-код, если знаешь пароль. +Можно выполнять VBA-код, даже если не знаешь пароль. +Код хранится зашифрованный в файле сохранения настроек библиотеки (BedvitXLL.bin). +Пароль не хранится, а хранится его хеш +VBA-код может загрузить любой пользователь и любой пользователь его использовать, при условии включенного доступа к объектной модели проектов VBA. -пока работает только один модуль VBA -выполняется только Sub() без аргументов, или с аргументами по умолчанию в качестве стартовой процедуры. В самом коде нет ограничений. Просто вызов с кнопки, аргументы сейчас не передаются. Но доработать можно при наличии интереса. -нельзя использовать Function(), другими словами UDF. -функционал скромный, обрисовал только концепцию (на большее просто нет времени) -кнопка "сохранить в файл" для сохранения кода в формате С++(доп.функционал для автора, для пользователя не нужная), все настройки сохраняются автоматически при загрузке.
В библиотеки предзагруженный тестовый код с паролем по умолчанию (можно посмотреть - кнопка "показать код")
Кому интересно, прошу протестировать. Автору так же интересен момент, есть ли дыры в защите. Пишите, заделаем бреши, если они есть (проект создан чисто из спортивного интереса)
bedvit, приветствую! Кодом создать/удалить/изменить код можно с помощью ActiveWorkbook.VBProject.VBComponents.CodeModule — в твоём решении тот же принцип (если не брать во внимание защиту) или что-то другое?
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Jack Famous, Алексей, мое решение в том, что любой пользователь может загрузить свой код и поделится с коллегой. Коллега сможет этот код выполнять, но не сможет посмотреть. Идеально для спецов зацикленных на защите своего кода.
Как работает: открыть форму, скопировать свой код из модуля VBA, вставить его в форму и нажать кнопку загрузить (предварительно задав пароль). Всё! Теперь этот код можно использовать на любой пк, если поставить там мою xll (вместе с файлом сохранений). Но код посмотреть без пароля нельзя.
Код и модули создаются с помощью объектной модели (COM) Excel
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
tutochkin, немного поправлюсь, нельзя в качестве первой - вызывающей процедуры, в самом модуле/коде можно. + Это первый набросок, ничего не ограничивает добавить аргументы в возов функции. Это возможно. Вопрос времени. Но для чего это нужно? Можно сделать несколько sub(), каждый с нужным вызовом. Считайте что каждый вызывающий sub() это кнопка. На кнопку вы же не вешаете sub() с аргументами.
bedvit, у нас немного разные задачи в Excel. У меня на 99,9% это именно функции с аргументами... И их очень много (тысячи две - три точно за год набирается...). И очень не хочется их просто так отдавать. Но приходится, ибо - а как не отдать? Переделать в Sub с привязкой к ячейкам не вариант...
Есть у меня одна идея, думаю обсудить здесь с участниками форума. В продолжении своей темы по хранению кода vba. Решил убрать такие недостатки как невозможность udf и все другие. Для этого решил хранить сразу всю xlam. Меры безопасности: 1. Хранение в зашифрованном виде 2. Сам файл запаролен случайным паролем, с открытия до закрытия. 3. Проект запаролен автором. 4. Внесён макрос на событие копирования книги, запрещающее это действие Private Sub workbook_BeforeSave +Правильно ли я понимаю что, скопировать кодом код из запароленного модуля нельзя? +Скопировать кодом файл тоже нельзя. Годно?
Попробовал так: открыл BedvitXLL(x64).xll, изменил код макроса Test, чтобы сохранить -создал книгу и сохранил. Открыл эту книгу и изменений в коде опять нет. Excel 2021 - Office LTSC
Какой файл? Данные хранятся в xll. Откройте форму, нажмите "Показать код" и посмотрите сохраняются ли там измененения. Ничего закрывать и открывать не нужно.
Код хранится в xll, и при изменениях он сохраняется, сразу при загрузке. Можно открыть форму и посмотреть изменения сразу. Никаких доп файлов не нужно.
bedvit написал: Откройте форму, нажмите "Показать код" и посмотрите сохраняются ли там измененения
Да, сохраняются. Что дальше делать? Выключил компьютер, включил компьютер, открыл надстройку, нажал "Показать код". В коде нет изменений(условных пробелов). Я извиняюсь конечно. Разве не должны сохранять изменения? Я еще в пятницу пробовал вместо макроса Test вставлять другой макрос, но при открытии файла там опять макрос Test. Может кто повторит мои действия и отпишется
Может я и вправду чего не понял) Рабочая ситуация: заказчик дает задание - нужно макросом перенести значение из ячейки A1 в ячейку D1 и отправляет файл F. Я создаю макрос A, который переносит значение. Открываю ХРАН, Показать код и вместо макроса Test вставляю макрос A. Выставляю пароль и жму Загрузить код. Далее что, я так понимаю отправляю надстройку с моего компьютера заказчику. Заказчик устанавливает надстройку, открывает файл F, открывает форму ХРАН, выбирает макрос A, жмет Выполнить. Макрос сработал. Заказчик рад, оплачивает, я ему отправляю код макроса. Так должно происходить отношения? Может я и вправду чего не понял
Михаил Л написал: и вместо макроса Test вставляю макрос A. Выставляю пароль и жму Загрузить код. Далее что, я так понимаю отправляю надстройку с моего компьютера заказчику
При этой ситуации что отправлять заказчику? Надстройку с файлом bin? Где находится файл bin?
Да два файла, xll и bin. Все два находятся рядом. При установке надстройки в папке надстроек, при простом открытии xll, в той же папке, что и xll. Если у заказчика уже стоит xll нужной версии, то можно переслать только bin. Все пользовательские настройки хранятся в bin, в т.ч. и зашифрованный код vba. Ему нужно будет просто положить в ту же папку, где и запускаемая xll.
Попробовал запустить файл на другом ноуте. Не сработало. На первом ноуте Excel 2021 64разряд, на втором Excel 2010 32разряд. Что я сделал? Отправил архив и bin. Причем bin нашел в папке - C:\Users\user\AppData\Roaming\Microsoft\AddIns На другом ноуте запустил Installer_...xlam . Нашел папку AppData\Roaming\Microsoft\AddIns и туда скопировал bin.
Завтра попробую на работе. Там тоже Excel 2021 64разряд
Проверьте во втором случае, что бы в папке были два файла (обычно папку настроек можно посмотреть через подключенные надстройки в Excel. + Должнен быть включен доступ к объектной модели проектов VBA. Проверьте. Разрядность xll не должна влиять на функционал и на файл bin. Это бинарный формат, он совместим с х86 и с х64. Т.е. в вашем случае должно работать. Попробуйте создать bin в x32 и использлвать на х64. Не могу проверить, дома х64 Excel. Если не сработает, можно вас попросить посмотреть размер создаваемых bin в Excel x32 и Excel x64?
Создал bin в Excel 2010 32 разряд и использовал этот bin в Excel 2021 64разряд. Все сработало! В папке Addlns можно сохранять хот сколько bin-ов. Надо только выбирать нужный.
А так размеры bin - 32разряд - 970b, 64разряд - 986b
А нельзя ли сделать версию надстройки только для этого дела - XLL хранение и выполнение VBA кода. То есть оставить только это:
Михаил, спасибо. Представлялось, что размер должен быть одинаков. Количество сохранений может быть любое. Но автоматически все изменения сохраняются в базовом варианте BedvitXLL.bin Он же используется при начальной загрузке xll (применяются сохраненные настройки). Вручную можно выгрузить/загрузить любое сохранение.
Михаил Л написал: А нельзя ли сделать версию надстройки только для этого дела - XLL хранение и выполнение VBA кода
Можно создать единичную отдельную версию, где почти весь остальной функционал можно отключить. Могу сделать лично для вас. Но в дальнейшем все обновления алгоритмов все равно будут происходить в основной версии. Какой смысл развивать несколько версий одной и той же библиотеки? Проще сделать список включаемых/отключаемых команд в основной версии (когда руки дойдут).
bedvit, здравствуйте На работе все отработало нормально
Цитата
bedvit написал: Проще сделать список включаемых/отключаемых команд в основной версии (когда руки дойдут
Ну это наверное не скоро будет. Может, не только мне лично, а в эту тему в пост 27 выложить, а через неделю удалить Мне это нужно чтобы у заказчика было меньше вопросов по остальным командам.
Работает - это хорошо. Внесение нового функционала зависит от свободного времени автора и уровнем интереса в реализации чего-то нестандартного. Выкладывать на неделю нет смысла, ибо потом тема будет, а решения не будет, это неправильно. Лучше приложить отдельной ссылкой по просьбе заинтересованных пользователей. Заказчику можно прокоментировать, что это свободно распространяемый, бесплатный набор инструментов и функций, используемый некоторыми спецами на разных форумах, в .т. на Этом, Киберфоруме и т.д. Им пожно пользоватся, при желании. Автор гарантирует отсутствие встроенного вредоносного кода в библиотеке, за исключением пользовательских сохранений (здесь заказчик на свой страх и риск использует данный функционал, подгружая сторонний bin, и запуская макрос). Полного описания фкнционала нет (не успел еще на сайте вики накидать), но есть отдельные темы по разбору: Планета Excel Киберфорум Оффиц. сайт Так же есть краткое описание функционала на каждой кнопке, в виде всплывающей подсказки.
bedvit, приветствую! Когда у меня какой-то большой проект и отдельные его части я могу использовать где-то ещё, то эти части имеет смысл вынести в отдельные программы. Я имею ввиду, что у тебя есть файловый менеджер, который может "вшить" в файл что угодно. Надо просто вшить в файл зашифрованный код, дать шифратор. Вроде как стало не сильно сложнее, зато гораздо проще в реализации (тебе), если я не ошибаюсь и достаточно будет отправлять только сам файл без пакета "сопроводительной документации" Что думаешь?
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄