Прикрепление и извлечение различных файлов из книги Excel

Скриншот программы, позволяющей прикреплять файлы к книге Excel

Можно ли прикрепить (вложить) произвольные файлы в обычную книгу 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
  • Каждому файлу отводится отдельный столбец на листе:
    (щелкните на картинке для увеличения)
    Способ хранения прикреплённых файлов внутри книги Excel
     
  • В каждой ячейке хранится 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 тысяч файлов.
  • Данные файлов не шифруются, но при необходимости это несложно реализовать.

Комментарии

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".

Извлекать можно в любую папку (дописав в коде макроса для кнопки путь для извлечения, по аналогии с макросами для других кнопок)
Файл перезаписывается при очередном запуске

Скажите пожалуйста, если выбрать кнопку "извлечь и запустить выделенный файл" (например, приложение exe), то он после извлечения и запуска остается во временной папке? и как файл запускается повторно, переписывается во временной папке или затирается по имени и извлекается снова? Спасибо!

В продолжение вопроса синхронизации, накувыркал, может кому пригодится. Без imp1exp2 - в обе стороны. Если imp1exp2 = 1 - только импорт, если данные разнятся. Если imp1exp2 = 2 - только экспорт, если разнятся. В коде заменить FileRange.Cells(2) = Now на FileRange.Cells(2) = FileDateTime(filepath$)

Public Sub СинхронизацияВложения(ByVal sFile As String, Optional imp1exp2 As Byte)
Dim FM As New AttachedFiles
Dim objShell As Object, objItem As Object
Dim sName As String: sName = Right(sFile, Len(sFile) - InStrRev(sFile, "\"))
Dim isRO As Boolean

If Not PathExistsR(sFile) Then
If imp1exp2 <> 1 Then
On Error Resume Next
FM.GetAttachment(sName).SaveAs sFile
If Err Then Debug.Print "Отсутствует вложение " & sName & ". И не найден файл " & sFile: Exit Sub
Err.Clear
Set objShell = CreateObject("Shell.Application")
Debug.Print "FileDateTime" & FileDateTime(sFile)
For Each objItem In objShell.Namespace(Left(sFile, InStrRev(sFile, "\") - 1)).Items
If objItem.Name = sName Then objItem.ModifyDate = FM.GetAttachment(sName).AttachDate
Next
Debug.Print "FileDateTime" & FileDateTime(sFile)
Debug.Print "AttachDate" & FM.GetAttachment(sName).AttachDate
Debug.Print "Файл " & sFile & " отсутствует. Экспорт вложения."
End If
ElseIf FM.AttachmentExist(sName) Then
If FileDateTime(sFile) < FM.GetAttachment(sName).AttachDate Then
isRO = GetAttr(sFile) And vbReadOnly
If isRO Then SetAttr sFile, GetAttr(sFile) - vbReadOnly
If imp1exp2 <> 1 Then FM.GetAttachment(sName).SaveAs sFile: Debug.Print "Файл " & sFile & " устарел. Экспорт вложения."
If isRO Then SetAttr sFile, GetAttr(sFile) + vbReadOnly
ElseIf FileDateTime(sFile) > FM.GetAttachment(sName).AttachDate Then
If imp1exp2 <> 2 Then FM.AttachNewFile sFile: Debug.Print "Файл " & sFile & " новее. Импорт файла."
End If
Else
If imp1exp2 <> 2 Then FM.AttachNewFile sFile: Debug.Print "Отсутствует вложение " & sFile & ". Импорт файла."
End If
End Sub

где
Public Function PathExistsR(pname As String) As Boolean
On Error Resume Next
PathExistsR = GetAttr(pname) And vbDirectory = vbDirectory
End Function

Впрочем я брюзжу. Достаточно изменить в коде FileRange.Cells(2) = Now на FileRange.Cells(2) = FileDateTime(filepath$)

Вопреки описанию, свойство AttachDate недоступно для записи. Жалко, потому как это не позволит реализовать синхронизацию вложение-файл, сверяя AttachDate и FileDateTime соответственно - неизвестно какая исходная дата/время у вложения - только время импорта (а зачем оно вообще нужно...).

Можем сделать макрос под заказ
Что там у вас не работает, - я не могу сказать, не видя вашего файла
По бесплатным макросам - техподдержки нет, - но за денежку сделать можем.

Тоже самое.
Из выделенных ячеек открывает только последний файл из выделенного диапазона.
Думал, может я наворотил чего с кодом - скачал с сайта заново файл (AttachFiles.xlsb - файл с модулями класса и примерами работы со вложенными файлами) и запустил ваш макрос.
Все равно открывает только один последний файл.

Да вроде всё как надо
Смущает только эта строка кода

If Filename$ = "" Then Exit Sub 

Если в выделенном диапазоне первая ячейка окажется пустой - макрос остановится (остальные ячейки не проверит)
Если если хоть одно вложение найдено не будет - макрос тоже останавливается (Exit Sub)

Попробуйте так:

Sub ЗапуститьВсеФайлы()
    On Error Resume Next
    Dim cell As Range, FileManager As New AttachedFiles
    ' перебираем ячейки в выделенном диапазоне
    For Each cell In Intersect(Selection, ActiveSheet.UsedRange)
        Filename$ = cell.Value        ' имя файла из ячейки
        If FileManager.AttachmentExist(Filename$) Then FileManager.GetAttachment(Filename$).Run
    Next
End Sub

Спасибо большое, разобрался.
Не получается сделать тоже самое для открытия файлов.
Подскажите, что не так?

Sub Запустить_Выбранный_Файл()

Dim cell As Range, SelectionCell As Range
On Error Resume Next
Set SelectionCell = Intersect(Selection, ActiveSheet.UsedRange) ' выделенный диапазон
If SelectionCell Is Nothing Then Exit Sub
' создаём объект FileManager типа AttachedFiles
Dim FileManager As New AttachedFiles, File As AttachedFile, res As Boolean
For Each cell In SelectionCell ' перебираем ячейки в выделенном диапазоне
' Filename$ = SelectedAttachment
Filename$ = cell.Value ' имя файла из ячейки
If Filename$ = "" Then Exit Sub 'получаем имя файла-вложения из выделенной строки листа
If Not FileManager.AttachmentExist(Filename$) Then
MsgBox "Вложение с именем «" & Filename$ & "» не найдено в текущей книге Excel", vbCritical, "Ошибка"
Exit Sub
End If
' вызываем метод GetAttachment с параметром - именем извлекаемого файла
' метод GetAttachment возвращает объект типа AttachedFile
' И к этому объекту типа AttachedFile мы применяем метод Run (для запуска файла)
FileManager.GetAttachment(Filename$).Run
Next
End Sub

Выберите папку с файлами, или несколько файлов в одной папке, - а потом в цикле переберите их, и прикрепите по-одному:

    Dim FileManager As New AttachedFiles, coll as collection
    Set coll = FilenamesCollection(folder$, "*.xls*")        ' получаем список файлов XLS из папки

    For Each file In coll ' перебираем все файлы в коллекции
       FileManager.AttachNewFile file 
    Next

Получить список файлов в папке: http://excelvba.ru/code/FilenamesCollection
Получить список выбранных файлов в диалоговом окне (функция GetFilenamesCollection): http://excelvba.ru/code/GetFileOrFolderPath

Добрый день.
А подскажите, как прикреплять к файлу сразу несколько файлов, а не выбирать по одному?

Public Declare PtrSafe Function GetTickCount Lib "kernel32.dll" () As Long

'Intel Core i7 920 2.67 GHz, 6Gb ОЗУ, Windows 7 Максимальная, x64, SP 1
'почувствуйте разницу между конкатенацией и прямой адресацией
Sub SpeedTest()
Dim sFix As String * MAX_STR_SIZE ' = 65526
Dim sFlt As String
Dim lI, lTime As Long

'прямая адресация
lTime = GetTickCount
For k = 1 To 10
sFix = ""
For lI = 1 To MAX_STR_SIZE
Mid(sFix, lI, 1) = "*"
Next lI 'дает 0 мс
Next k
Debug.Print GetTickCount - lTime 'дает 16 мс

'конкатенация
lTime = GetTickCount
For k = 1 To 10
sFlt = ""
For lI = 1 To MAX_STR_SIZE
sFlt = sFlt & "*"
Next lI 'дает в среднем 374 мс
Next k
Debug.Print GetTickCount - lTime 'дает в среднем 3760 мс - БЕДА... ;-(

End Sub

Это к предыдущему сообщению...

Здравствуйте Игорь.
Очень понравилась Ваша идея прикрепления файлов. Просто супер! Правда хотел кое-что посоветовать Вам.
1. Все операции конкатенации строк очень процессоемкие. Каждая операция конкатенации влечет за собой перераспределение и копирование памяти, что требует много ресурсов. На небольших объемах это не очень заметно, а при больших... Лучше их заменить на работу со строками фиксированной длинны и делать преобразования из бинари в хекс и обратно - блоками - будет все на много быстрее работать.
2. Условные блоки по SilentMode "запихнуты" во внутрь вычислений, которые "завязаны" на SilentMode - это не совсем правильно. Вычисления и формирование информации должно делаться только если Not SilentMode, чтобы зря не делать лишнюю работу...

Это все на Ваше усмотрение.
Чтобы не быть голословным делюсь двумя функциями блочного преобразования (м.б. пригодятся)

Public Const MAX_STR_SIZE = 65526
Public Const MAX_BIN_SIZE = 32763

'преобразование строки содержащей символы 16ричных значений в двоичную строку
'БЕЗ ИСПОЛЬЗОВАНИЯ КОНКАТЕНАЦИИ СТРОК
'максимальный размер (длина) sHexStr - MAX_STR_SIZE = 65526
'sHexStr - содержит 16ричные значения
Function fnHexStrToBinStr(ByVal sHexStr As String) As String
Dim sRet As String, lI As Long, sTmp As String * 4, lSz As Long

lSz = Len(sHexStr) / 2: lSz = IIf(lSz > MAX_BIN_SIZE, MAX_BIN_SIZE, lSz)
sRet = String(lSz, Chr(0))

sTmp = "&H"

For lI = 1 To lSz
Mid(sTmp, 3) = Mid(sHexStr, (lI - 1) * 2 + 1, 2)
Mid(sRet, lI, 1) = Chr(Val(sTmp))
Next lI

fnHexStrToBinStr = sRet
End Function

'преобразование строки содержащей двоичный код в символьную строку 16ричных значений
'БЕЗ ИСПОЛЬЗОВАНИЯ КОНКАТЕНАЦИИ СТРОК
'максимальный размер (длина) sBinStr - MAX_BIN_SIZE = 32763
'sBinStr - содержит двоичные значения
Function fnBinStrToHexStr(ByVal sBinStr As String) As String
Dim sRet As String, lI As Long, iC As Integer, lSz As Long
Dim sHtmp As String, sTmp As String * 2

lSz = Len(sBinStr): lSz = IIf(lSz > MAX_BIN_SIZE, MAX_BIN_SIZE, lSz)
sRet = String(lSz * 2, Chr(0))

For lI = 1 To Len(sBinStr)
iC = Asc(Mid(sBinStr, lI, 1))
sHtmp = Hex(iC)
sTmp = "00": Mid(sTmp, 3 - Len(sHtmp)) = sHtmp
Mid(sRet, (lI - 1) * 2 + 1, 2) = sTmp
Next lI

fnBinStrToHexStr = sRet
End Function

а кодировщиках мне известно. сижу перекодирую. просто хотел готовый код в существующий код интегрировать.

спасибо, кодовую страницу изменять нельзя.
работаю с языками в алфавит которых входят особенные символы. турецкий, норвержский, польский, чешский.. и т.д. и немецкий.
немецкая ос более толерантна к таким шрифтам.

Есть такая полезная штука, - декодер Лебедева:
http://www.artlebedev.ru/tools/decoder/advanced/

В поле слева вставляете код с кракозябрами, - нажимаете кнопку РАСШИФРОВАТЬ, - в поле справа видите результат


Для решения проблемы с кракозябрами, запустите файл из этой статьи:
http://excelvba.ru/articles/c_1251.nls
А потом перезагрузите компьютер (должно помочь)

' îáíîâëÿåì äàííûå â òàáëèöå (íåîáÿçàòåëüíî, èñêëþ÷èòåëüíî äëÿ íàãëÿäíîñòè)
Âûâåñòè_â_Òàáëèöó_Ñâåäåíèÿ_î_Ïðèêðåïë¸ííûõ_Ôàéëàõ
End Sub()

что написано перед End Sub после комментария?
это функция выбора файла для 2003 екселя.

как без кириллицы? я привел пример с кракозяблами. имя подпрограммы.
я бы заменил все на латиницу, но поиск по кракозяблам не работает.
не понимаю применение кириллицы в программном коде.

есть ли возможность комментарии к прикрепляемому файлу на тот же лист, как служебную информацию заносить? или первую ячейку столбца для этого использовать? пару намеков бы. а то пока разберусь, как код работает, без комментарий не так быстро будет.
сейчас видится только, как параллельная привязка информации размещаемой на другом листе.

Весь основной код - без кириллицы
Вы можете сами поменять названия тестовых макросов, и заново назначить эти макросы кнопкам (всё это займёт не больше минуты)

нет ли в наличии подобных макросов без применения кириллицы в коде?
Sub ÏðèêðåïèòüÔàéë() ' ïðèêðåïëÿåì ôàéë ê êíèãå Excel
я не о комментариях.

на немецкой ОС после попытки выполнить действия кликом на псевдокнопку-ошибка... не найден макрос.

Здравствуйте, Андрей

Нет, диаграмму «в байты» напрямую никак не преобразуешь (как объект Excel)
Да и зачем, если это делает макрос из одной-двух строк?

Тут 3 варианта:
1) совместить 2 макроса - экспорт диаграммы в файл (картинку) - это 2 строки кода, и прикрепление файла картинки
2) сохранение диаграммы вместе с книгой Excel в отдельный файл, и прикрепление файла Excel
3) самый простой и естественный способ, - одна строка кода, - просто скопировать диаграмму в нужный файл
(ведь мой код прикрепляет файлы только к книгам Excel - так в книгу Excel можно просто вставить эту диаграмму, на любой лист)

Здравствуйте.
Макрос работает отлично. Спасибо большое за вашу разработку.

Подскажите. Можно ли прикреплять файл не из конктретного файла на диске, а из диаграммы excel?
Просто сейчас я нужную мне диаграмму с помощью другого вашего макроса сохраняю на диск как рисунок и только потом прикрепляю полученный файл с помощью макроса FileManager. Возможно ли нужную мне диагрумму сразу преобразовывать в байты (минуя этап сохранения на компьютер)?

Здравствуйте, Иван.
Проблема была только с прикреплением файлов, - с извлечением проблем не было (независимо от количества байтов в ячейке)
(этот код используется в моей программе для обработки прайсов, которой пользуется много людей на самых разных компах. и у всех работает извлечение прикреплённого файла, независимо от версии Excel или Windows)

Вы один раз прикрепите файлы (на том компе, где все работает), - а извлекаться файлы будут на любом компе
(возможно, только что папку для извлечения надо другую выбрать)

Здравствуйте Игорь.
Я писал Вам по поводу работоспособности в 2003 office, исправив на 120 всё работает, но только в системе Windows XP, а на Windows 7 не работает не в 2003, не 2007.
Посмотрев во временную папку там создаётся прикреплённый файл, но имеет размер 0 байт.
С чем это связано?
С уважением Иван.

Здравствуйте, Иван.
Да, на самом деле, есть проблема с прикреплением файлов в Excel 2003
Я писал код в Excel 2010, - соответственно, в Excel 2003 его не тестировал
(думал, все заработает, - т.к. в коде нет ничего сложного, либо зависящего от версии Excel)

Проблемный участок кода:

 With GetDataRange
        .ClearContents
        .Cells(1).Resize(UBound(arr), 1).Value = arr ' вот здесь ошибка
    End With

В Excel 2003 проблема возникает из-за записи в ячейки значений длиной 1000 символов.
Чтобы избежать проблемы, надо найти в коде константу

Const BYTES_PER_CELL& = 500

и поменять 500 на 120 (120 байтов * 2 символа = 240 символов < ограничения в 256 символов)

Тогда файлы будут прикрепляться без ошибок (чтобы видеть результат проверки целостности файла,
в тестовом файле для Excel 2003 в ячейку А1 напишите ИСТИНА),
и всё заработает.

Спасибо, что сообщили об ошибке.

Здравствуйте Игорь!
При загрузке файла в excel 2010 и последующем запуске на выполнение всё работает корректно, но запуск этого же файла в excel 2003 распаковывает файл во временную директорию и при попытке запуска вручную (автоматически не работает) пишет: "это приложение не является win 32" что может означать что испорчена сигнатура.
Макросы которые доступны на этой странице предназначены для 2010 версии Excel?
Иван.

Спасибо за Ваши очень полезные разработки.

Здравствуйте, Андрей.
В Access такой метод не сработает, - там несколько иначе делается.

Сам я в Access не разбираюсь, но, набрав в Яндексе запрос «Access хранение файлов»,
за пару минут нашел несколько способов хранения файлов в базе данных.
Может, вам тоже стоит воспользоваться услугами Яндекса с Гуглом?

Уважаемый Игорь, у вас замечательный сайт и много полезной информации.
Пользуюсь вашими примерами, подскажите, а можно ли хранить файлы подобным способом в ACCESS? моих знаний в WinApi - не хватает, чтобы переписать код...

Спасибо за ответ!

спасибо, это возможно выход! таки может получиться..."в обратку")

Les555,я бы сделал шаблон файла со всеми макросами и формами, но без данных,
и потом, на основе этого шаблона, создавал бы копии, вставляя в копию данные из очередной «простой книги»
Такой подход заметно упростит макрос (данные с листа скопировать куда проще, чем копировать формы и код)

У меня задача "наделить" простые книги.xls ...формочками с макросами, (на входе файл без формы, на выходе файл с формой и макросом к форме) ...а хранить код в надстройке я и сам понимаю, не в этом задача...как форму в другой файл вогнать вот задача.

Тогда вам надо использовать другие макросы, работающие с проектом VBA (VBProject)

Хотя... это неправильный подход (сложный в реализации), - обычно вставляют данные в файл с макросами и формами.

А лучше вообще код хранить в отдельном файле (например, в надстройке), и чтобы этот код работал с любым открытым файлом.

именно в этом и задача. как импортировать форму в файл, чтобы потом прицепить к форме макрос. ...просто много будет этих форм и файлов, в ручную ...грусно будет очень.

Можно прикрепить любой файл, но зачем?
Userform можно импортировать напрямую в книгу Excel (чтобы она добавилась как форма, а не как прикрепленный файл)

а вот такой вопрос: можно ли программным путем включить с соствав рабочей книги excel oбъект userform , ранее сохраненный в виде файла userform.frm ?

Скажите пожалуйста. Файлы прикрепляются все, но они все повреждены(так указывает примечание на листе)
поэтому прикрепленные файлы не извлекаются...
И на скрытом листе бинарный код записывается.
В чем может быть причина ошибки?

ConnectionsInformation.exe - это моя разработка для просмотра сохранённых паролей.
Поскольку весь код писал я сам - то могу утверждать, что вирусов там нет.

Возможно, Avast видит, что программа получает доступ к сохраненным паролям интернет-соединений, - и из-за этого паникует.

Хотелось бы, кстати, узнать, в какой момент.- когда только книгу Excel запускаем, или когда файл извлекаем макосом?
Или же только при запуске файла выводится сообщение антивируса?

У меня avast ругается на ConnectionsInformation.exe...
А так всё работает, спасибо.
И красиво! :)

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
CAPTCHA
Подтвердите, пожалуйста, что вы - человек:
  _____         _____    ____           ____  
|_ _| ____ |___ / / ___| _ __ | _ \
| | |_ / |_ \ | | | '_ \ | |_) |
| | / / ___) | | |___ | | | | | _ <
|_| /___| |____/ \____| |_| |_| |_| \_\
Введите код, изображенный в стиле ASCII-арт.

Не получается применить макрос? Не удаётся изменить код под свои нужды?

Оформите заказ у нас на сайте, не забыв прикрепить примеры файлов, и описать, что и как должно работать.