Можно ли прикрепить (вложить) произвольные файлы в обычную книгу Excel?
А потом извлечь эти файлы в заданную папку, и работать с ними?
Казалось бы, Excel такого не позволяет. (а если и позволяет, то извлечь вложенные файлы без из запуска - весьма проблематично)
Но, при помощи макросов, можно реализовать что угодно (и сохранение\извлечение файлов в том числе)
Теперь прикрепить к книге Excel любой файл, а затем извлечь его в любую папку под заданным именем, можно при помощи нескольких строк кода!
В прикреплённом к статье файле находятся 2 модуля класса (AttachedFiles и AttachedFile), а также примеры их использования в виде макросов, позволяющих управлять вложениями в книге Excel.
Пример использования функционала модулей класса для сохранения в книге Excel исполняемого файла, с последующим извлечением:
Sub ПрикрепитьФайл() ' прикрепляем файл к книге Excel
Dim FileManager As New AttachedFiles, res As Boolean
res = FileManager.AttachNewFile("C:\WINDOWS\notepad.exe")
End Sub
Sub ИзвлечьФайл() ' из книги Excel на диск
Dim FileManager As New AttachedFiles, res As Boolean
On Error Resume Next ' на случай, если среди вложений нет файла notepad.exe
res = FileManager.GetAttachment("notepad.exe").SaveAs("C:\MyProgram.exe")
End Sub
Sub ЗапуститьВложенныйФайл() ' из книги Excel на диск
Dim FileManager As New AttachedFiles
On Error Resume Next ' на случай, если среди вложений нет файла notepad.exe
FileManager.GetAttachment("notepad.exe").Run
End Sub
Если вам требуется прикрепить к книге Excel лишь один небольшой файл (например, маленькую картинку или иконку),
воспользуйтесь возможностью сохранения файлов в виде VBA-функций
Рассмотрим доступные свойства и методы классов, используемых для работы со вложениями.
Класс AttachedFiles позволяет управлять вложенными файлами.
Функция GetAllFilenames() возвращает коллекцию имён файлов, прикреплённых к документу Excel
(если нет ни одного прикреплённого файла, возвращается пустая коллекция)
Функция GetAllFiles() возвращает коллекцию объектов типа AttachedFile (прикреплённый файл)
(если нет ни одного прикреплённого файла, возвращается пустая коллекция)
Свойства и методы объекта AttachedFile см. ниже.
Функция AttachmentExist (ByVal filename$) позволяет проверить наличие вложения с именем файла filename$
(если книга содержит вложенный файл с таким именем, возвращается TRUE, иначе - FALSE)
Функция AttachNewFile (Optional ByVal filepath$, Optional ByVal filename$, Optional Overwrite As Boolean = True)
предназначена для добавления (прикрепления) нового файла, полный путь к которому задан в параметре filepath$.
Если параметр filepath$ не задан, то будет выведено диалоговое окно, позволяющее выбрать прикрепляемый файл.
Параметр filename$ служит для указания имени файла, под которым он будет храниться в книге Excel. Если этот параметр не задан, файл сохраняется под тем именем, которое он имел в момент загрузки.
Парамерт Overwrite, если он равен TRUE (по-умолчанию), позволяет заменять старые вложения новыми без лишних вопросов. При его значении FALSE будет выведено диалоговое окно с вопросом, заменить старый вложенный файл на новый, или нет.
Функция MaxFileSize() возвращает максимальный допустимый размер прикрепляемого файла
(для файлов Excel 97, 2000, XP, 2003 можно прикрепить файлы размером до 31 мегабайта , а для Excel 2007б 2010, 2013 - максимальный размер прикрепляемого файла составляет 500 МБ)
Функция GetAttachment (ByVal filename$) возвращает вложение с именем filename$ в виде объекта типа AttachedFile
Таким способом, мы получаем возможность обратиться по имени к любому из вложенных файлов (чтобы его запустить, сохранить, удалить, и т.д.)
Метод DeleteAllAttachments удаляет ВСЕ вложенные файлы из книги Excel
У класса AttachedFiles есть и некоторые свойства, доступные для чтения и изменения:
Свойство WB (As Workbook) - ссылка на книгу Excel, с которой производятся манипуляции.
По-умолчанию, WB ссылается на текущую книгу Excel (ThisWorkbook), но можно работать и с любой другой открытой книгой, - для этого достаточно добавить строку кода типа
Set FileManager.WB = ActiveWorkbook или Set FileManager.WB = Workbooks("test.xls")
Свойство AutoSaveWorkbook (As Boolean, по умолчанию = FALSE) - при установке в TRUE позволяет автоматически сохранять изменения в книге при добавлении или удалении вложенных файлов
Свойство SilentMode (As Boolean, по умолчанию = FALSE) - при установке в TRUE запрещает вывод информации о процессе извлечения или добавления файла в строку состояния Excel, а также блокирует все уведомления. Таким образом, извлекать и запускать файлы можно в скрытом режиме - пользователь ничего не заметит.
По-умолчанию (при SilentMode = FALSE), в строке состояния Excel отображается ход выполнения действий с файлами (своего рода прогресс-бар)
Второй модуль класса - AttachedFile - позволяет работать с конкретным вложенным файлом.
Метод SaveAs (Optional ByVal filepath$) позволяет извлечь (сохранить) вложенный файл по заданному пути filepath$.
Если путь filepath$ не задан, макрос выдаёт диалоговое окно сохранения файла, где можно указать папку, куда будет извлекаться файл, и задать имя создаваемого файла.
Метод Delete безвозвратно удаляет вложенный в Excel файл
Метод Run - позволяет запустить (открыть в программе по-умолчанию) вложенный файл.
Для этого, файл автоматически извлекается во временную папку Windows, и оттуда уже выполняется запуск созданного файла.
Функция IsCorrect возвращает TRUE, если размер области данных файла соответствует значению длины файла (которое сохранено при добавлении файла в книгу Excel)
Если часть данных на скрытом листе (где хранятся вложенные файлы) затерта, функция вернёт значение FALSE, что говорит о нарушении целостности файла.
Внимание: проверка производится медленно, т.к. при этом производится извлечение данных с листа (аналогично извлечению файла на диск). И, если прикреплённые файлы большие (сотни килобайтов и больше), то проверка каждого файла может длиться от нескольких секунд до минут (для многомегабайтных файлов)
Функция FileSizeTXT возвращает размер файла в доступном ткестовом виде. Например, 129 Кб, 3.4 Кб, 12.7 Мб
Свойства класса AttachedFiles предназначены только для чтения (хотя их изменение возможно, но нежелательно):
Свойство filename (As String) содержит имя вложенного файла с расширением
Свойство AttachDate (As Date) хранит дату и время добавления файла в книгу Excel
Свойство FileSize (As Long) возвращает размер файла в байтах. Результат возвращается в виде числа, в отличии от функции FileSizeTXT, выдающей текстовое значение.
Принципы работы программы:
файлы сохраняются на «очень скрытом» листе с названием «SheetForAttachedFiles»
при загрузке, файлы считываются в бинарном виде, и каждый байт преобразуется в 16-ричное представление.
Например, файл, состоящий из 5 байтов, будет преобразован в текстовую строку длиной 10 символов примерно такого вида: 3395B3D7FF
Каждому файлу отводится отдельный столбец на листе:
(щелкните на картинке для увеличения)
В каждой ячейке хранится 500 байтов данных. (1000 символов)
Это значение можно изменить в строке Private Const BYTES_PER_CELL& = 500 модуля класса AttachedFiles
Количеством данных в одной ячейке вызвано ограничение на размер файла.
Для Excel 2003 оно составляет (65536 - 6) строк * 500 байтов в ячейке = 32765000 байтов = 31,24 Мб
В Excel 2007 и более новых версиях строк намного больше, поэтому там можно прикреплять файлы размером для 500 МБ (правда, очень сомневаюсь, что Excel выдержит такое издевательство над собой)
Максимальное число прикрепляемых файлов ограничено числом столбцов на листе Excel.
В большинстве случаев, 255 файлов - это более чем достаточно. В Excel 2007-2010-2013 можно прикрепить более 16 тысяч файлов.
Данные файлов не шифруются, но при необходимости это несложно реализовать.
Вложение |
Размер |
Загрузки |
Последняя загрузка |
AttachFiles.xlsb - файл с модулями класса и примерами работы со вложенными файлами |
272.49 КБ |
33 |
1 год 1 неделя назад |
AttachFiles.zip - тот же файл, но в формате XLS для Excel 97-2003 |
93.39 КБ |
3 |
3 года 33 недели назад |
42391 просмотр |