Уважаемы формучане, здравствуйте ! На одном из сайтов я нашел макрос, который из указанной папки добавляет в архив .zip все файлы. Макрос работает на ура. Я не могу придумать как на этот архив поставить пароль. Код в файле....
Уважаемы формучане, здравствуйте ! На одном из сайтов я нашел макрос, который из указанной папки добавляет в архив .zip все файлы. Макрос работает на ура. Я не могу придумать как на этот архив поставить пароль. Код в файле....A_3485
Есть, естественно. Вызов любого внешнего архиватора (например, 7-Z, WinRar, WinZip) через шелл ОС с нужными параметрами... Почитайте там же то, что относится к WinRar.
Есть, естественно. Вызов любого внешнего архиватора (например, 7-Z, WinRar, WinZip) через шелл ОС с нужными параметрами... Почитайте там же то, что относится к WinRar.AndreTM
Skype: andre.tm.007 Donate: Qiwi: 9517375010
Сообщение отредактировал AndreTM - Четверг, 01.10.2015, 10:38
Sub Запаковка_зип() Dim MyPath As String, Suffix As String, MyName As String, Password As String, ShellArgument As String, ZipPathComand As String MyPath = "C:\Desktop\Файл\" ZipFullName = "C:\install\7-ZipPortable\7-ZipPortable.exe" ZipPathComand = ZipPathCommand = ZipFullName & " a "
Suffix = "*.doc" Password = "111" MyName = Dir(MyPath & Suffix) Do Until MyName = "" MyName = MyPath & MyName ShellArgument = ZipPathComand & Left(MyName, Len(MyName) - 4) & ".zip " & MyName & " -p" & Password Shell (ShellArgument) MyName = Dir Loop End Sub
[/vba] При пошагой отработке кода, после строчки ZipPathComand = ZipPathCommand = ZipFullName & " a " выдает что ZipPathComand = false, т.е что по указанному пути у меня неть zip.exe. Но через total именно по указанному пути я заупскаю 7-zip.exe. Как быть я не знаю.
На просторах инета нашел код: [vba]
Код
Sub Запаковка_зип() Dim MyPath As String, Suffix As String, MyName As String, Password As String, ShellArgument As String, ZipPathComand As String MyPath = "C:\Desktop\Файл\" ZipFullName = "C:\install\7-ZipPortable\7-ZipPortable.exe" ZipPathComand = ZipPathCommand = ZipFullName & " a "
Suffix = "*.doc" Password = "111" MyName = Dir(MyPath & Suffix) Do Until MyName = "" MyName = MyPath & MyName ShellArgument = ZipPathComand & Left(MyName, Len(MyName) - 4) & ".zip " & MyName & " -p" & Password Shell (ShellArgument) MyName = Dir Loop End Sub
[/vba] При пошагой отработке кода, после строчки ZipPathComand = ZipPathCommand = ZipFullName & " a " выдает что ZipPathComand = false, т.е что по указанному пути у меня неть zip.exe. Но через total именно по указанному пути я заупскаю 7-zip.exe. Как быть я не знаю.A_3485
Сообщение отредактировал A_3485 - Четверг, 01.10.2015, 11:01
[/vba] [p.s.]и пробел после -p не нужен - я вас прошлый раз дезинформировал, а сейчас посмотрел описание параметров командной строки (сам 7-zip не пользуюсь)[/p.s.]
UPD А какой исполняемый файл вы указали в ZipFullName? Нужно указывать именно консольную версию (т.е. 7z.exe, а не 7zFM.exe) а судя по вашему описанию
[/vba] [p.s.]и пробел после -p не нужен - я вас прошлый раз дезинформировал, а сейчас посмотрел описание параметров командной строки (сам 7-zip не пользуюсь)[/p.s.]
UPD А какой исполняемый файл вы указали в ZipFullName? Нужно указывать именно консольную версию (т.е. 7z.exe, а не 7zFM.exe) а судя по вашему описанию
Пробелов в именах файлов нет. Запускаю 7zip.exe. Чтобы пока на время облегчить мою участь, может есть способ открывать 7zip сразу по нужному адресу где находятся файлы для архивации, в моем случае это: [vba]
Код
MyPath = "C:\Desktop\Файл\"
[/vba]
Пробелов в именах файлов нет. Запускаю 7zip.exe. Чтобы пока на время облегчить мою участь, может есть способ открывать 7zip сразу по нужному адресу где находятся файлы для архивации, в моем случае это: [vba]
может есть способ открывать 7zip сразу по нужному адресу где находятся файлы для архивации
это не поможет, у вас проблема в том, что вместо консольной утилиты вы запускаете графическую оболочку архиватора. Пошаговая инструкция: 1. качаете архиватор с оф. сайта 7-zip.org 2. устанавливаете (если не хотите устанавливать - просто распакуйте в какую-нибудь папку) 3. прописываете путь к 7z.exe в переменной ZipFullName 4. запускаете код [vba]
Код
Sub Запаковка_зип() Dim MyPath As String, Suffix As String, MyName As String, Password As String, ShellArgument As String, ZipFullName As String, ZipPathComand As String MyPath = "C:\Desktop\Файл\" ZipFullName = "C:\Tools\7-Zip\7z.exe" ' здесь пропишите свой путь ZipPathComand = ZipFullName & " a "
Suffix = "*.doc" Password = "111" MyName = Dir(MyPath & Suffix) Do Until MyName = "" MyName = MyPath & MyName ShellArgument = ZipPathComand & """" & Left(MyName, Len(MyName) - 4) & ".zip"" """ & MyName & """ -p" & Password Shell ShellArgument, vbMinimizedNoFocus MyName = Dir Loop End Sub
может есть способ открывать 7zip сразу по нужному адресу где находятся файлы для архивации
это не поможет, у вас проблема в том, что вместо консольной утилиты вы запускаете графическую оболочку архиватора. Пошаговая инструкция: 1. качаете архиватор с оф. сайта 7-zip.org 2. устанавливаете (если не хотите устанавливать - просто распакуйте в какую-нибудь папку) 3. прописываете путь к 7z.exe в переменной ZipFullName 4. запускаете код [vba]
Код
Sub Запаковка_зип() Dim MyPath As String, Suffix As String, MyName As String, Password As String, ShellArgument As String, ZipFullName As String, ZipPathComand As String MyPath = "C:\Desktop\Файл\" ZipFullName = "C:\Tools\7-Zip\7z.exe" ' здесь пропишите свой путь ZipPathComand = ZipFullName & " a "
Suffix = "*.doc" Password = "111" MyName = Dir(MyPath & Suffix) Do Until MyName = "" MyName = MyPath & MyName ShellArgument = ZipPathComand & """" & Left(MyName, Len(MyName) - 4) & ".zip"" """ & MyName & """ -p" & Password Shell ShellArgument, vbMinimizedNoFocus MyName = Dir Loop End Sub
KSV, спасибо за оказываемую помощь. Установил с сайта архиватор 7zip. Код отрабатывает и архивирует каждый файл в отдельности. Я сейчас пробую архивировать все файлы с расширением *.doc, *.xls а потом их удаляю. Программа отрабатывает но как-то криво. Если запускаю пошаговою отработку кода через F8 то все ОК, если запускаю программу целико через F5 то выпадают глюки типа: 1). Формируется пустой архив; 2). Из 3 файлов формируется только 1 или 2; 3). формируется архив zip с 1 или двумя файлами и побочный файл с расширением .zip.tmp1 Данные глюки формируются циклично, т.е. первый архив пустой, второй архив с одним xls, третий архив с одним doc и т.д. [vba]
Код
Sub Запаковка_зип() Dim MyPath As String, Suffix As String, MyName As String, Password As String, ShellArgument As String, ZipFullName As String, ZipPathComand As String MyPath = "C:\Desktop\Файл\" ZipFullName = "C:\install\7ZIP\7-zip\7z.exe" ZipPathComand = ZipFullName & " a "
Do Until MyName = "" If Right(MyName, 3) = "doc" Or Right(MyName, 3) = "xls" Then MyName = MyPath & MyName ShellArgument = ZipPathComand & """" & MyPath & sZIPFileName & """ """ & MyName & """ -p" & Password Shell ShellArgument, vbMinimizedNoFocus MyName = Dir Kill (MyName) Else: MyName = Dir End If Loop
End Sub
[/vba]
KSV, спасибо за оказываемую помощь. Установил с сайта архиватор 7zip. Код отрабатывает и архивирует каждый файл в отдельности. Я сейчас пробую архивировать все файлы с расширением *.doc, *.xls а потом их удаляю. Программа отрабатывает но как-то криво. Если запускаю пошаговою отработку кода через F8 то все ОК, если запускаю программу целико через F5 то выпадают глюки типа: 1). Формируется пустой архив; 2). Из 3 файлов формируется только 1 или 2; 3). формируется архив zip с 1 или двумя файлами и побочный файл с расширением .zip.tmp1 Данные глюки формируются циклично, т.е. первый архив пустой, второй архив с одним xls, третий архив с одним doc и т.д. [vba]
Код
Sub Запаковка_зип() Dim MyPath As String, Suffix As String, MyName As String, Password As String, ShellArgument As String, ZipFullName As String, ZipPathComand As String MyPath = "C:\Desktop\Файл\" ZipFullName = "C:\install\7ZIP\7-zip\7z.exe" ZipPathComand = ZipFullName & " a "
Это происходит из-за асинхронного вызова Shell (архиватор еще не успел запаковать, а файл уже удален следующей командой). Если после архивирования файл нужно удалять, то архиватор и сам умеет это делать, просто ему нужно об этом сказать (ключ -sdel). И в последнем варианте кода вы наделали кучу ошибок! Если вам нужно архивировать все файлы в один архив, то так:
[vba]
Код
' все файлы в один архив Sub Запаковка_зип() Dim MyPath As String, Password As String, ZipPathCommand As String, MyName As String, sFiles As String
MyName = Dir$(MyPath & "*.*") Do While Len(MyName) If InStr(".doc.xls", LCase$(Right$(MyName, 4))) Then sFiles = sFiles & " """ & MyPath & MyName & """" MyName = Dir$ Loop If Len(sFiles) Then Shell ZipPathCommand & sFiles, vbMinimizedNoFocus End Sub
[/vba]
а если каждый файл нужно архивировать отдельно, то так:
[vba]
Код
' каждый файл в отдельный архив Sub Запаковка_зип() Dim MyPath As String, Password As String, ZipPathCommand As String, MyName As String
MyName = Dir$(MyPath & "*.*") Do While Len(MyName) If InStr(".doc.xls", LCase$(Right$(MyName, 4))) Then MyName = MyPath & MyName Shell ZipPathCommand & " """ & Left$(MyName, Len(MyName) - 3) & "zip"" """ & MyName & """", vbMinimizedNoFocus End If MyName = Dir$ Loop End Sub
[/vba]
Это происходит из-за асинхронного вызова Shell (архиватор еще не успел запаковать, а файл уже удален следующей командой). Если после архивирования файл нужно удалять, то архиватор и сам умеет это делать, просто ему нужно об этом сказать (ключ -sdel). И в последнем варианте кода вы наделали кучу ошибок! Если вам нужно архивировать все файлы в один архив, то так:
[vba]
Код
' все файлы в один архив Sub Запаковка_зип() Dim MyPath As String, Password As String, ZipPathCommand As String, MyName As String, sFiles As String
MyName = Dir$(MyPath & "*.*") Do While Len(MyName) If InStr(".doc.xls", LCase$(Right$(MyName, 4))) Then sFiles = sFiles & " """ & MyPath & MyName & """" MyName = Dir$ Loop If Len(sFiles) Then Shell ZipPathCommand & sFiles, vbMinimizedNoFocus End Sub
[/vba]
а если каждый файл нужно архивировать отдельно, то так:
[vba]
Код
' каждый файл в отдельный архив Sub Запаковка_зип() Dim MyPath As String, Password As String, ZipPathCommand As String, MyName As String
KSV, огромнейшее спасибо за помощь. Разобрал каждую срочку в отдельности, оказалось что все очень просто. Теперь буду знать как используется функция InStr. Еще раз спасибо
KSV, огромнейшее спасибо за помощь. Разобрал каждую срочку в отдельности, оказалось что все очень просто. Теперь буду знать как используется функция InStr. Еще раз спасибоA_3485
Сообщение отредактировал A_3485 - Четверг, 08.10.2015, 09:58