Хранение файлов и файловый менеджер в файле(листе) Excel, Бинарное хранение данных в CustomProperty листа (Open FileName As Binary и Get, Put через байт-массив)
Всем привет! Хочу поделится наработками, которые получились в процессе реализации своих задач. Отдельная благодарность! Андрей VG, за любезно предоставленные исходники!, которые были несколько доработаны и дополнены для этих целей.
Хранение файлов и простенький файловый менеджер в листе Excel. Сделал все максимально просто, для максимальной переносимости - переносим лист в другой файл, готово! Нет форм, модулей уровня проекта, классов и т.д., все в модуле листа. Работает стандартно через менеджер макросов или используя функции напрямую в вашем проекте/надстройке, обычном фале, поддерживающим макросы.
Андрей, сделал возможность подключить к любой книге, отключив в References ->microsoft scripting runtime (по умолчанию она выключена на обычных ПК, не хочу подключать через .GUID)
Функционал: 1.Загрузка любых файлов (в т.ч. архивов, которые можно распаковать автоматом при выгрузке) 2.Просмотр загруженных (имя, размер), при удалении, выгрузке. 3.Удаление 4.Выгрузка с параметрами (папка, файл, распаковка из zip (архиватор не нужен, средствами винды), открыть файл после выгрузки, перезаписать еще раз при распаковке) Все эти параметры Optional, если их нет выполняется с параметрами по умолчанию.
Все исходники и пример прилагаю (с авто-распаковкой библиотеки из zip-архива и её запуска). В загруженных файлах секретных данных и вирусов нет.
Можно накрутить всяких плюшек, но я решил - чем проще - тем лучше, главное основной функционал есть (еще подумаю на авто-архивирование при загрузке, как опциональный параметр) - но не знаю, лучше ли zip виндовый пакует, к примеру, чем мой RAR. Здесь если архив - значит с макс плотностью упаковки нужен. Нужно потестировать - как время будет (есно на zip архивах). RAR думал подключить, но есть малая доля вероятности, что не на всех машинах он есть.
Исправил некоторые логические последствия, к примеру библиотеку ставим на распаковку, но указываем функции - безопасный режим (не переписываем файлы, последний параметр) - библиотека будет распакована в таком случае - только если нет такого файла или папки в выбираемом месте (или в папке по умолчанию). А при распаковке создается папка с названием архива. При запуске файлов, распаковке, в безопасном режиме - надо проверять сочетание этих факторов, наличие папок, файлов с одинаковыми названиями. Что оставлять, что заменять. Проверил - пока не нашел видимых отклонений от алгоритма.
bedvit, интересно! А пробовали найти пределы - какая может быть максимальная длина массива в CustomProperty и сколько их может быть в листе? Я когда-то касался подобной темы - упаковки файлов в коллекцию Variables Ворда: http://www.cyberforum.ru/vba/thread713657.html Там обнаружились пределы: 32767 переменных и ~130000 байт в одной переменной. Правда, это для Word 2000.
bedvit, Андрей VG — спасибо вам большое, Сэнсеи, за проделанную работу!!! А можно ли (если да, то как грамотно это сделать) добавить данную функцию в свою надстройку (файл .xlam), чтобы можно было вызывать на листе, как стандартную функцию/UDF?
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Казанский, Пробовал до 30 файлов и до 100 МБ в один массив. Суммарно до 250МБ выходило на лист - работает. Нужен тест или загуглить. Jack Famous, Очень просто, переносите лист в свою настройку и все, можете пользоваться. Можно ещё проще, копируете весь код на нужный лист и он становится байтовым хранилищем, в т.ч. и в надстройке. Если через функцию листа, нужно оформить Sub как Функцию, и возвращать к примеру 1 если все прошло штатно (нужно посмотреть на ограничения для функций листа), если все ОК - переименовать , вернуть 1.
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
bedvit, пока нет - я не пробовал( отпишусь сюда, как попробую. Надо сначала разобраться, что это за зверь)))
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Все просто, просматривается 2 варианта: 1. Оборачиваем SUB листа - функцией в стандартном модуле или в модуле книги и готово. Пример приложил. При успешной загрузке - возвращается 1. 2. Переносим весь функционал из листа в стандартный модуль или модуль книги, меняем SUB на Function, возвращаем 1, при успешном выполнении.
21/11/2017 Обновление версии: Loader_02 1.Процедуры переписаны в функции, которые возвращают при успешном выполнении, количество загруженных, удаленных, выгруженных файлов. 2.Добавлена пакетная загрузка файлов (выгрузка и удаление всех файлов уже было в первой версии) с корректным счетчиком. 3.Добавлено описание к коду и аргументам функций. 4.Добавлен запуск файлов как "приложением по умолчанию" так и через Excel. 5.Добавлен обработчик ошибок, с выводом сообщений об ошибке. 6.Добавлен запрос/вопрос пользователю на перезапись выгружаемых и загружаемых файлов, если они уже есть.
22/03/2018 Обновление версии: Loader_03 1.Добавил стартовое меню. 2.Добавил поддержку командной строки (на примере расчета числа Пи - программа упакована моя, вирусов нет.). 3.Изменил порядок параметров для функций на более логичный.
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Jack Famous написал: я так и не понял, что эта штука делает и как работает,
все просто: зайдите в модуль листа запустите первую процедуру (стартовое меню), далее выбирайте нужное действие. В модуле обычном написан тест распаковки и запуск файла упакованного в листе. В данном случае расчёт числа Пи. Запустите тест и посмотрите результат. Т.е. можно использовать в вашей программе функции на загрузку, просмотр, удаления и выгрузку/запуск загруженных файлов в Excel. Или использовать стартовое меню, что бы делать все вышеназванное через диалог (кроме запуска, запуск сейчас только программно). Для этого достаточно кода, который написан в листе с хранимыми данными. Лист можно перемещать в другие проекты без потери данных (не копировать!), а можно скопировать сам код, вставить на ваш лист и он станет хранилищем (нужные данные сами зальете).
bedvit, спасибо!))) а для чего она, если подробно?)) что может заменить, например? я вот прямо не могу без примеров))))
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Например можно добавить такой лист в свою надстройку, загрузить библы на С++ или другом языке, распаковывать и пользоваться прямо из VBA, вызывая при необходимости. Все в одном файле xlam. Плюсом - такой код быстрее, тяжелее скопипастить, чем на VBA, легче разворачивать - один файл - открыл и пользуйся. Механизм похож на загрузку бинарных данных в ресурсы dll. К примеру в xll ресурсах упакована com.dll в моём, недавно выложенном, решении. В общем можно положить в ресурсы что угодно и использовать по мере необходимости.
bedvit, когда-нибудь я до этого дойду))) или же предложу своё решение))) в любом случае — огромное спасибо вам за проделанную работу! У меня есть особенная закладка на этот случай
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
22/04/2018 Обновление версии: Loader_04 1.Добавил команду "ОТКРЫТЬ" в стартовом меню с поддержкой командной строки (скриншот прилагаю). Zip-файлы, при этом, сначала распаковываются, потом запускается первый файл в распакованной папке (поэтому рекомендуется хранить по одному файлу в архивах). 2.Изменил переход по листам с символов "<", ">" на "-","+" - удобно использовать цифровой блок клавиатуры. 3.Добавил возврат в меню при неверно введенных данных.
bedvit написал: Нужно ли соблюдать размер до 100Кб?
нет - новый лимит в 300кб
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
07/06/2018 Обновление версии: Loader_05 1. Добавил проверку при запуске файла, открыт ли он в другом процессе с возможностью открыть повторно или не открывать (по умолчанию) 2. Исправил ошибку, возникающих в случаях когда имя выгружаемого файла совпадало с папкой и папку нужно было удалять. 3. Исправил ошибку, возникающих в случаях когда распаковывается один и тот же архив с обновлением данных (удалением старых) в целевой папке. 4. Исправлена ошибка возникающая при загрузке файлов размером в нечетное количество байтов. 5. Добавлена возможность указать при загрузке папку (добавил новый параметр в функцию загрузки), без указания фалов, тогда загружаются все файлы из папки.
Пример использования: модуль "Test", макрос "Test"
Функционал распаковки и запуска файлов (Функция UnloadF): 'PathName - папка для выгрузки, по умолчанию: Environ$("TEMP") 'FileName - нужный файл для выгрузки, по умолчанию: выгружаются все 'UpdateFile - обновляем ли файл в папке при распаковки, если он там уже есть (выгружен ранее или есть с совпадающим именем), по умолчанию: нет 'UnZip - распаковка из архива (True - да, False - нет), по умолчанию: нет 'ExcelOpenFile - открыть файл в Excel после распаковки, по умолчанию: нет 'RunFile - запустить файл после распаковки приложением "по умолчанию" (для архива - один файл в один архив, в обратном случае, загрузится первый попавшийся из распакованного архива), по умолчанию: нет 'RunFileParametrs - параметры выполнения файла используется вместе с RunFile (аналогично командной строке с параметрами, без указания самого файла - полный путь к файлу автоматом подставляется) 'RunFileAgain - запускать файл, даже если он открыт в каком либо процессе (запускать еще раз), по умолчанию: нет
Все эти параметры Optional, если их нет - функция выполняется с параметрами по умолчанию (распаковка в пользовательский "TEMP")
Андрей, Привет! Да, ошибки поисправлял в основном, в разных сочетаниях параметров, при тестировании. Думаю оставлю пока так, т.к. вполне работоспособен (на тех задачах, которые были в тесте) и функционал, оценочно, достаточен для широкого спектра задач. Опять же максимальная простота и переносимость моя главная цель.