В данной статье я постараюсь описать и показать, как можно средствами Visual Basic for Applications создать архив и извлечь данные из архива(иными словами архивировать и разархивировать файлы).
-
Архивация через WinRAR:
- Общая процедура вызова функций архивации/разархивации
- Архивация папки - WinRAR
- Архивация файла - WinRAR
- Извлечение из архива папки/файла - WinRAR
- Описание параметров WinRAR
- Таблица команд WinRAR
- Таблица ключей WinRAR
- Таблица параметров окна для Shell
- Основная процедура создания пустого ZIP-архива
- Архивация одного указанного файла
- Архивация выбранных файлов
- Создание архива из всех файлов в указанной папке
- Создание архива с резервной копией активной книги
- Извлечение из архива конкретного файла
- Извлечение всех файлов из архива
Архивация встроенными средствами Windows(в ZIP):
В принципе, все очень даже просто. В функция для архивации и извлечения используется архиватор WinRAR, т.к. он является самым распространенным и есть почти на каждом ПК. Процедура CallRARFunction показывает как можно вызвать функции работы с WinRAR-ом. Остальные функции выполняют непосредственно всю "грязную" работу. Я специально решил привести пример с процедурой вызова и отдельными функциями. Чтобы при необходимости можно было функции записать, а вызов выполнять уже где угодно.
Первое обязательное условие для вызова всех функций - необходимо объявить константу с путем к исполняемому файлу архиватора WinRAR:
Option Explicit Const sWinRarAppPath As String = "C:\Program Files\WinRAR\WinRAR.exe" |
Данные две строки помещаются в самый верх модуля, в котором будут описаны функции работы с архивами. Указывается полный путь к файлу WinRAR.exe. В строке выше указан путь, по которому WinRAR устанавливается по умолчанию. Однако если WinRAR установлен в другую папку - необходимо указать её. Например: "C:\Обязательные программы\WinRAR\WinRAR.exe"
Sub CallRARFunction() 'Архивируем папку "C:\Temp\Тест" If FolderToRAR("C:\Temp\Тест") Then MsgBox "Папка успешно заархивирована!", vbInformation, "www.excel-vba.ru" ' End If 'Архивируем файл C:\Temp\Test.xls If FileToRAR("C:\Temp\", "Test.xls", "Test.rar") Then MsgBox "Файл успешно заархивирован!", vbInformation, "www.excel-vba.ru" ' End If 'Извлекаем из архива "C:\Temp\Test" файлы в папку с архивом "C:\Temp\" ' If UnRAR("C:\Temp\Test", "Test.rar") Then MsgBox "Файлы успешно распакованы!", vbInformation, "www.excel-vba.ru" ' End If End Sub |
'--------------------------------------------------------------------------------------- ' Procedure : FolderToRAR ' Author : The_Prist(Щербаков Дмитрий) ' WebMoney - R298726502453; Яндекс.Деньги - 41001332272872 ' http://www.excel-vba.ru ' Purpose : Функция архивирует указанную папку ' sPath - путь к папке для архивации '--------------------------------------------------------------------------------------- Function FolderToRAR(sPath As String) Dim sArhiveName As String Dim sWinRarApp As String sWinRarApp = sWinRarAppPath & " A -ep " ' sArhiveName = sPath & ".rar" ' 'добавляем двойные кавычки, что позволит нам работать с именем файла и путём, которые содержат пробелы. 'без кавычек пробелы недопустимы FolderToRAR = Shell(sWinRarApp & " """ & sArhiveName & """ """ & sPath & """ ", vbHide) End Function |
'--------------------------------------------------------------------------------------- ' Procedure : FileToRAR ' Author : The_Prist(Щербаков Дмитрий) ' WebMoney - R298726502453; Яндекс.Деньги - 41001332272872 ' http://www.excel-vba.ru ' Purpose : Функция архивирует указанный файл ' sPath - путь к файлу для архивации ' sFileName - имя файла для архивации ' sArhiveName - имя результирующего архива '--------------------------------------------------------------------------------------- Function FileToRAR(sPath As String, sFileName As String, ByVal sArhiveName As String) Dim sWinRarApp As String 'архивируем файл с удалением самого файла после архивации(за это отвечает параметр -df ) sWinRarApp = sWinRarAppPath & " A -ep -df " 'добавляем двойные кавычки, что позволит нам работать с именем файла и путём, которые содержат пробелы. 'без кавычек пробелы недопустимы FileToRAR = Shell(sWinRarApp & " """ & sPath & sArhiveName & """ """ & sPath & sFileName & """ ", vbHide) End Function |
'--------------------------------------------------------------------------------------- ' Procedure : UnRAR ' Author : The_Prist(Щербаков Дмитрий) ' WebMoney - R298726502453; Яндекс.Деньги - 41001332272872 ' http://www.excel-vba.ru ' Purpose : Функция извлекает данные из указанного архива в папку с файлом архива ' sPath - путь к архиву ' sArhiveName - имя архива '--------------------------------------------------------------------------------------- Function UnRAR(sPath As String, sArhivName As String) Dim sWinRarApp As String 'извлекаем данные из архива в скрытом окне(vbHide) 'с перезаписью существующих файлов (-o+) sWinRarApp = sWinRarAppPath & " E -o+ " 'добавляем двойные кавычки, что позволит нам работать с именем файла и путём, которые содержат пробелы. 'без кавычек пробелы недопустимы UnRAR = Shell(sWinRarApp & " """ & sPath & "\" & sArhivName & """ """ & sPath & """ ", vbHide) End Function |
Ничего сложного - функции делают одно - вызывают посредством объекта Shell архиватор WinRAR, передавая ему указанные параметры. Для большинства задач функции вполне подойдут без каких-либо изменений. Если лень разбираться - можно просто последовательно скопировать ВСЕ коды данной статьи и вставить их в стандартный модуль.
А для тех, кто хочет углубиться и поэкспериментировать - можно почитать дальше и узнать какие можно применить команды и ключи для более гибкого использования WinRAR вместе с VBA.
Синтаксис передачи параметров WinRAR:
WinRAR [команда] -[ключ1] -[ключN] [архив] [файлы…] [@файл-список…] [путь для извлечения\]
ОПИСАНИЕ ПАРАМЕТРОВ WinRAR
| Параметр | Описание |
|---|---|
| команда | Комбинация символов, определяющая действие, которое будет выполнять WinRAR. |
| ключ | Ключи используются для определения специфических действий, степени сжатия, типа архива и пр. |
| архив | Имя обрабатываемого архива. |
| файлы | Имена обрабатываемых файлов. |
| файл-список | Файлы-списки - это обычные текстовые файлы, содержащие имена файлов для обработки. Каждое имя файла должно быть указано на отдельной строке и начинаться с первой позиции строки. В файл-список допускается помещать комментарии, признак начала комментария - символы //. Например, для архивирования файлов *.txt из папки c:\work\doc, файлов *.bmp из папки c:\work\image и всех файлов из папки c:\work\misc можно создать backup.lst, содержащий следующие строки:c:\work\doc\*.txt//резервная копия текстов
После этого для архивирования достаточно будет выполнить команду: В одной командной строке разрешается указывать как обычные имена или группы файлов для обработки, так и файлы-списки. Если не указаны ни файлы, ни файлы-списки, то подразумевается шаблон *.* (т.е. WinRAR обработает все файлы). |
| путь для извлечения | Используется только с командами e и x и указывает папку, в которую нужно извлекать файлы. Если эта папка не существует, то она будет создана. |
В одну строку можно передать сразу несколько команд и ключей. Главное, чтобы порядок их не противоречил синтаксису передачи параметров. Сначала необходимые команды, далее ключи и т.д. Например, в функции FileToRAR я использую команду и два параметра -
Попробуем прочитать строку:
WinRAR должен поместить в архив файл
Команду я записал с большой буквы для визуального разделения, но этого не требуется, ключи и команды не чувствительны к регистру. Ниже я привожу таблицы с перечислением и расшифровкой всех команд и функций, доступных в WinRAR. Так же их всегда можно посмотреть в справке самого WinRAR.
| Команда | Описание |
|---|---|
| A | Добавить файлы в архив |
| C | Добавить архивный комментарий |
| CH | Изменить параметры архива |
| CV | Преобразовать архивы |
| CW | Записать в файл комментарий архива |
| D | Удалить файлы из архива |
| E | Извлечь файлы из архива, игнорируя пути |
| F | Освежить имеющиеся файлы в архиве |
| I | Найти строку в архивах |
| K | Заблокировать архив |
| M | Переместить файлы и папки в архив |
| R | Восстановить повреждённый архив |
| RC | Воссоздать недостающие тома |
| RN | Переименовать файлы в архиве |
| RR[N] | Добавить информацию для восстановления |
| RV[N] | Создать тома для восстановления |
| S[имя] | Преобразовать архив в самораспаковывающийся |
| S- | Удалить SFX-модуль |
| T | Протестировать файлы в архиве |
| U | Обновить файлы в архиве |
| X | Извлечь файлы из архива с полными путями |
Чуть подробнее стоит остановиться на ключах к WinRAR. Их использование значительно расширяет возможности архивирования и дальнейшей обработки файлов. Для чего они нужны и как применить? Очень просто. Если взглянуть на функции, приведенные выше, то можно увидеть пару примеров использования ключей и команд.
Ниже приведена полная таблица ключей и их описание:
| Ключ | Описание ключа |
|---|---|
| -ac | Снять атрибут "архивный" после архивации или извлечения |
| -ad | Добавить к пути назначения имя архива |
| -af<тип> | Указать формат архива |
| -ag[формат] | Добавить к имени архива текущую дату и время |
| -ao | Добавить файлы с установленным атрибутом "архивный" |
| -ap<путь> | Установить путь внутри архива |
| -as | Синхронизировать содержимое архива |
| -av | Добавить электронную подпись |
| -av- | Запретить добавление/проверку электронной подписи |
| -cfg- | Игнорировать профиль по умолчанию и переменную окружения |
| -cl | Преобразовать имена файлов в нижний регистр |
| -cu | Преобразовать имена файлов в верхний регистр |
| -df | Удалить файлы после архивации |
| -dh | Открывать совместно используемые файлы |
| -ds | Не сортировать файлы при архивации |
| -ed | Не добавлять пустые папки |
| -en | Не добавлять блок "конец архива" |
| -ep | Исключить пути из имён |
| -ep1 | Исключить из пути базовую папку |
| -ep2 | Сохранять полные пути файлов |
| -ep3 | Сохранять полные пути, включая букву диска |
| -e[+]<атр> | Задать исключение или включение файлов из/в обработку по маске атрибутов |
| -f | Освежить имеющиеся файлы |
| -hp[пароль] | Шифровать и данные, и заголовки файлов |
| -iadm | Запрашивать административный доступ для SFX-архива |
| -ibck | Запустить WinRAR как фоновый процесс в системном лотке |
| -ieml[.][адрес] | Отправить архив по электронной почте |
| -iicon<имя > | Указать значок для SFX-модуля |
| -iimg<имя> | Указать логотип для SFX-модуля |
| -ilog[имя] | Записывать протокол ошибок в файл |
| -inul | Не выводить сообщения об ошибках |
| -ioff | Выключить компьютер |
| -k | Заблокировать архив |
| -kb | Сохранять на диске файлы, извлечённые с ошибками |
| -m<n> | Установить метод сжатия |
| -mc<параметры> | Указать дополнительные параметры сжатия |
| -md<n> | Установить размер словаря |
| -ms[список] | Указать типы файлов для архивирования без сжатия |
| -mt<потоки> | Установить число потоков |
| -n<файл> | Включить в обработку только указанный файл |
| -n@<файл-список> | Включить в обработку только файлы, указанные в файле-списке |
| -oc | Установить NTFS-атрибут "сжатый" |
| -or | Переименовывать файлы автоматически |
| -os | Сохранить потоки NTFS |
| -ow | Обработать информацию о правах доступа к файлам |
| -o+ | Перезаписывать существующие файлы |
| -o- | Не перезаписывать существующие файлы |
| -p[пароль] | Установить пароль |
| -r | Обрабатывать вложенные папки |
| -r0 | Обрабатывать вложенные папки по шаблону |
| -ri | Установить приоритет и время простоя |
| -rr[N] | Добавить информацию для восстановления |
| -rv[N] | Создать тома для восстановления |
| -s | Создать непрерывный архив |
| -s<N> | Создать непрерывные группы, используя счётчик файлов |
| -sc<набор символов>[объекты] | Указать набор символов (и объекты) |
| -se | Создать непрерывные группы, используя расширения файлов |
| -sfx[имя] | Создать самораспаковывающийся архив |
| -sl<размер> | Обрабатывать файлы размером меньше указанного |
| -sm<размер> | Обрабатывать файлы размером больше указанного |
| -sv | Создать независимые непрерывные тома |
| -sv- | Создать зависимые непрерывные тома |
| -s- | Запретить создание непрерывных архивов |
| -t | Протестировать файлы после архивирования |
| -ta<дата> | Обрабатывать файлы, изменённые после указанной даты |
| -tb<дата> | Обрабатывать файлы, изменённые до указанной даты |
| -tk | Сохранять исходное время архива |
| -tl | Установить время архива по самому новому файлу |
| -tn<время> | Обрабатывать файлы не старее, чем указанный период времени |
| -to<время> | Обрабатывать файлы более старые, чем указанный период времени |
| -ts<m,c,a> | Сохранить/восстановить время файлов (модификации, создания, последнего доступа) |
| -u | Обновить файлы |
| -v<n>[k |b|f|m|M|g|G] | Создать многотомный архив |
| -vd | Очищать сменный диск перед архивацией на него |
| -ver[n] | Управление версиями файлов |
| -vn | Использовать старую схему именования томов |
| -vp | Делать паузу перед каждым томом |
| -x<файл > | Не обрабатывать указанный файл |
| -x@<файл-список > | Не обрабатывать файлы, указанные в файле-списке |
| -y | Подразумевать ответ "Да" на все запросы |
| -z<файл> | Прочитать комментарий архива из файла |
| -- | Прервать дальнейший поиск ключей в командной строке |
И таблица параметров и их значений для команды Shell, через которую осуществляется вызов архиватора:
| Параметр | Значение параметра |
|---|---|
| vbNormalFocus | Будет показан ход выполнения архивации |
| vbHide | Окно архиватора будет скрыто |
| vbMinimizedFocus | Окно архиватора будет свернуто |
| vbMinimizedNoFocus | Окно архиватора будет свернуто, а окно вызвавшей программы активировано |
| vbMaximizedFocus | Окно архиватора будет раскрыто на весь экран и активировано |
'--------------------------------------------------------------------------------------- ' Procedure : CreateNewZip ' DateTime : 03.08.2014 21:55 ' Author : The_Prist(Щербаков Дмитрий) ' http://www.excel-vba.ru ' Purpose : Основная процедура создания пустого ZIP-архива '--------------------------------------------------------------------------------------- Sub CreateNewZip(sPath As String) If Dir(sPath) <> "" Then Kill sPath Open sPath For Output As #1 Print #1, Chr$(80) & Chr$(75) & Chr$(5) & Chr$(6) & String(18, 0) Close #1 End Sub |
Данная процедура создает пустой ZIP-архив, в который далее и помещаются необходимые файлы. Эту процедуру необходимо обязательно копировать вместе с процедурами создания ZIP-архивов, приведенными ниже(Zip_File_Or_Files, Zip_All_Files_in_Folder, Zip_ActiveWorkbook).
'--------------------------------------------------------------------------------------- ' Procedure : ZIPOneFile ' Author : The_Prist(Щербаков Дмитрий) ' http://www.excel-vba.ru ' Purpose : Создание архива из одного файла или добавление в уже существующий архив нового файла ' sZIPFileName - полный путь к файлу создаваемого архива ' sFileToZIP - полный путь к файлу для архивации '--------------------------------------------------------------------------------------- Function ZIPOneFile(sZIPFileName As String, sFileToZIP As String) Dim objShell As Object Dim lcnt As Long Set objShell = CreateObject("Shell.Application") 'создаем пустой ZIP-архив, если его еще нет If Dir(sZIPFileName, 16) = "" Then CreateNewZip (sZIPFileName) End If lcnt = objShell.Namespace((sZIPFileName)).Items.Count 'помещаем файлы из папки в архив objShell.Namespace((sZIPFileName)).CopyHere CStr(sFileToZIP) 'дожидаемся окончания архивации Do Until objShell.Namespace((sZIPFileName)).Items.Count = lcnt + 1 DoEvents Loop End Function |
Вызывается функция следующим образом:
Sub ToRarExample() Call ZIPOneFile("C:\Documents\Архив\Test.zip", "C:\Test.xls") End Sub |
При этом используя данную функцию можно поместить в один архив более одного файла, просто изменяя полный путь с файлом, который надо заархивировать. Может пригодиться в случае, если требуется создать архив не из заранее созданных в папке файлов, а добавлять их по одному на лету.
'--------------------------------------------------------------------------------------- ' Procedure : Zip_File_Or_Files ' DateTime : 03.08.2014 21:54 ' Author : The_Prist(Щербаков Дмитрий) ' http://www.excel-vba.ru ' Purpose : Архивация выбранных файлов '--------------------------------------------------------------------------------------- Sub Zip_File_Or_Files() Dim sDate As String, sZIPPath As String, sZIPFileName As String, sWBName As String Dim objShell As Object, lf As Long, lZIPCnt As Long Dim avFiles 'Выбираем файл/файлы, которые необходимо поместить в архив 'чтобы выбирать не только файлы Excel:"All Files (*.*), *.*" avFiles = Application.GetOpenFilename("Excel Files (*.xl*), *.xl*", , "Выбрать файлы для архивации", , True) If VarType(avFiles) = vbBoolean Then Exit Sub 'создаем путь для создания архива(папка с выбранными файлами) sZIPPath = Replace(avFiles(1), Dir(avFiles(1), 16), "") If Right(sZIPPath, 1) <> "\" Then sZIPPath = sZIPPath & "\" End If sDate = Format(Now, " dd-mm-yy h-mm-ss") sZIPFileName = sZIPPath & "VBAZip " & sDate & ".zip" 'создаем пустой ZIP-архив CreateNewZip (sZIPFileName) Set objShell = CreateObject("Shell.Application") lZIPCnt = 0 For lf = LBound(avFiles) To UBound(avFiles) sWBName = Dir(avFiles(lf), 16) If IsBookOpen(sWBName) Then MsgBox "Невозможно поместить книгу '" & avFiles(lf) & "' в архив!" & vbNewLine & _ "Закройте книгу и повторите попытку." Else 'помещаем файл в архив lZIPCnt = lZIPCnt + 1 objShell.Namespace((sZIPFileName)).CopyHere CStr(avFiles(lf)) 'дожидаемся окончания архивации(особенно актуально для больших файлов) Do Until objShell.Namespace((sZIPFileName)).Items.Count = lZIPCnt DoEvents Loop End If Next lf If lZIPCnt Then MsgBox "Архив создан по пути: " & sZIPFileName, vbInformation, "www.excel-vba.ru" End If End Sub '--------------------------------------------------------------------------------------- ' Procedure : IsBookOpen ' Purpose : функция проверяет, отрыта ли книга в данный момент. ' Если открыта - её невозможно поместить в архив ' http://www.excel-vba.ru/chto-umeet-excel/kak-proverit-otkryta-li-kniga/ '--------------------------------------------------------------------------------------- Function IsBookOpen(wbName As String) As Boolean Dim wbBook As Workbook: On Error Resume Next Set wbBook = Workbooks(wbName) IsBookOpen = Not wbBook Is Nothing End Function |
'--------------------------------------------------------------------------------------- ' Procedure : Zip_All_Files_in_Folder ' DateTime : 03.08.2014 21:53 ' Author : The_Prist(Щербаков Дмитрий) ' http://www.excel-vba.ru ' Purpose : Создание архива из всех файлов в указанной папке '--------------------------------------------------------------------------------------- Sub Zip_All_Files_in_Folder() Dim sFolderName As String, oFolder As Object Dim sDate As String, sZIPPath As String, sZIPFileName As String Dim objShell As Object sZIPPath = Application.DefaultFilePath If Right(sZIPPath, 1) <> "\" Then sZIPPath = sZIPPath & "\" End If sDate = Format(Now, " dd-mm-yy h-mm-ss") sZIPFileName = sZIPPath & "VBAZip " & sDate & ".zip" Set objShell = CreateObject("Shell.Application") 'Выбираем папку With Application.FileDialog(msoFileDialogFolderPicker) If .Show = False Then Exit Sub sFolderName = .SelectedItems(1) End With 'создаем пустой ZIP-архив CreateNewZip (sZIPFileName) If Right(sFolderName, 1) <> "\" Then sFolderName = sFolderName & "\" End If 'помещаем файлы из папки в архив objShell.Namespace((sZIPFileName)).CopyHere objShell.Namespace((sFolderName)).Items 'дожидаемся окончания архивации Do Until objShell.Namespace((sZIPFileName)).Items.Count = objShell.Namespace((sFolderName)).Items.Count DoEvents Loop MsgBox "Архив создан по пути: " & sZIPFileName, vbInformation, "www.excel-vba.ru" End Sub |
'--------------------------------------------------------------------------------------- ' Procedure : Zip_ActiveWorkbook ' DateTime : 03.08.2014 21:54 ' Author : The_Prist(Щербаков Дмитрий) ' http://www.excel-vba.ru ' Purpose : Создание архива с резервной копией активной книги '--------------------------------------------------------------------------------------- Sub Zip_ActiveWorkbook() Dim sDate As String, sZIPPath As String Dim sZIPFileName, sBackupFileName Dim objShell As Object Dim sEx As String, lp As Long sZIPPath = Environ("TEMP") 'путь по умолчанию к папке временных файлов 'можно указать любой, например 'sZIPPath = "C:\temp" 'путь должен существовать If Right(sZIPPath, 1) <> "\" Then sZIPPath = sZIPPath & "\" End If 'получаем расширение активной книги lp = InStrRev(ActiveWorkbook.Name, ".") If lp > 0 Then sEx = Mid(ActiveWorkbook.Name, lp) End If If Not sEx Like ".xl*" Then MsgBox "Неизвестный формат активной книги", vbInformation, "www.excel-vba.ru" Exit Sub End If sDate = Format(Now, " yyyy-mm-dd h-mm-ss") 'имя архива sZIPFileName = sZIPPath & Left(ActiveWorkbook.Name, _ Len(ActiveWorkbook.Name) - Len(sEx)) & sDate & ".zip" 'имя временного файла sBackupFileName = sZIPPath & Left(ActiveWorkbook.Name, _ Len(ActiveWorkbook.Name) - Len(sEx)) & sDate & sEx 'если файла архива и такой же книги еще нет в папке If Dir(sZIPFileName) = "" And Dir(sBackupFileName) = "" Then 'создаем копию активной книги 'т.к. открытую книгу нельзя поместить в архив ActiveWorkbook.SaveCopyAs sBackupFileName 'создаем пустой ZIP-архив CreateNewZip (sZIPFileName) 'помещаем файл в архив Set objShell = CreateObject("Shell.Application") objShell.Namespace((sZIPFileName)).CopyHere sBackupFileName 'дожидаемся окончания архивации Do Until objShell.Namespace((sZIPFileName)).Items.Count = 1 DoEvents Loop 'удаляем временный файл Kill sBackupFileName MsgBox "Резервная копия книги создана по пути: " & sZIPFileName, vbInformation, "www.excel-vba.ru" Else MsgBox "Невозможно создать архив, т.к. такая книга или архив уже присутствуют в папке", vbInformation, "www.excel-vba.ru" End If End Sub |
'--------------------------------------------------------------------------------------- ' Procedure : ExtractFileFromZip ' DateTime : 03.08.2014 22:02 ' Author : The_Prist(Щербаков Дмитрий) ' http://www.excel-vba.ru ' Purpose : Извлечение из архива конкретного файла '--------------------------------------------------------------------------------------- Sub ExtractFileFromZip() 'C:\Documents - папка для извлечения файла из архива 'C:\Documents\VBAZip.zip - имя ZIP-архива, из которого необходимо извлечь файл 'Книга1.xls - имя файла в ZIP-архиве, который необходимо извлечь With CreateObject("Shell.Application").Namespace(("C:\Documents")) .CopyHere "C:\Documents\VBAZip.zip" & "\" & "Книга1.xls" End With End Sub |
'--------------------------------------------------------------------------------------- ' Procedure : ExtractFromZipToFolder ' DateTime : 03.08.2014 21:55 ' Author : The_Prist(Щербаков Дмитрий) ' http://www.excel-vba.ru ' Purpose : Извлечение всех файлов из архива '--------------------------------------------------------------------------------------- Sub ExtractAllFilesFromZip() '"C:\Documents" - папка для извлечения файлов из архива '"C:\Documents\VBAZip.zip" - имя ZIP-архива, из которого необходимо извлечь файлы With CreateObject("Shell.Application") .Namespace(("C:\Documents")).CopyHere .Namespace(("C:\Documents\VBAZip.zip")).Items End With End Sub |
![]()

Добрый день!
Спасибо за создание такого мануала. Реально все работает.
Я использую Zip_All_Files_in_Folder. Можно узнать как запаролить созданных архив?
А если архив необходимо создавать другой программой, например "Atlansys", где можно узнать её ключи?
Ольга, попробуйте поискать на сайте программы или в справке. Для каждой программы ключи разные, хоть и могут совпадать. Это все зависит от разработчиков программы.
Доброго времени суток,
Function ZIPOneFile
Dim l
'дожидаемся окончания архивации
Do Until
l = l + 1
objShell.Namespace((sZIPFileName)).Items.Count = lcnt + 1
If l > 300 Then Exit Do
DoEvents
Loop
На мой взгляд, будет вернее, чтобы выйти из вечного цикла, при помещении файла в Zip с заменой, а не как новый.
Может кто уже столкнулся.
Спасибо.
Здравствуйте!
Использую код UnRAR = Shell(sWinRarApp & " """ & sPath & "\" & sArhivName & """ """ & sPath & """ ", vbHide) для распаковки всех архивов в папке, проблема в том, что во всех архивах файлы с типовыми названиями (1,2,3...) и при наличии в 15 архивах файла "1" в результате распаковки останется только 1. Подскажите, пожалуйста, как переименовать файлы в архиве или другой вариант решения вопроса. Заранее спасибо!
Перечисление имен файлов как в строке указывать необходимо? Через запятую, с кавычками или др. например надо извлечь только файлы .DOC и .PDF
Дмитрий, доброго дня! Пользовался вашим скриптом. Спасибо.
Есть проблемный вопрос - при записи файла в архив можно ли поставить ключ на перезапись файла если он уже присутствует в архиве с другой датой или размером. Например к строке:
objShell.Namespace((sZIPFileName)).CopyHere objShell.Namespace((sFolderName)).Items