Архівація-Вилучення з архіву через VBA
У цій статті я спробую описати та показати, як можна засобамиVisual Basic for Applications створити архів та витягти дані з архіву (іншими словами архівувати та розархівувати файли).
-
Архівація через WinRAR:
Архівація вбудованими засобами Windows(у ZIP):
АРХІВАЦІЯ ЧЕРЕЗ WinRAR В принципі, все дуже просто. У функцію для архівації та вилучення використовується архіватор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
АРХІВАЦІЯ ТАКИ - WinRAR
'------------------------------------------------- -------------------------------------- ' 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
АРХІВАЦІЯ ФАЙЛУ - WinRAR
'------------------------------------------------- -------------------------------------- ' 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
ВИНЯТТЯ З АРХІВУ ТАПКИ/ФАЙЛУ - WinRAR
'------------------------------------------------- -------------------------------------- ' 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 'витягуємо дані з архіву у прихованому вікні(vbH , vbHide) End Function
Нічого складного – функції роблять одне – викликають за допомогою об'єктаShell архіватор WinRAR, передаючи йому зазначені параметри. Більшість завдань функції цілком підійдуть без будь-яких змін. Якщо ліньки розбиратися - можна просто послідовно скопіювати ВСІ коди цієї статті та вставити їх у стандартний модуль. А для тих, хто хоче заглибитися і поекспериментувати - можна почитати далі і дізнатися, які можна застосувати команди та ключі для більш гнучкого використання WinRAR разом з VBA. Синтаксис передачі параметрів WinRAR: WinRAR [команда ] -[ключ1 ] -[ключN ] [архів ] [файли… ] [@файл-список… ] [шлях для вилучення \]
ОПИС ПАРАМЕТРІВWinRAR
Після цього для архівування достатньо буде виконати команду: winrar a backup @backup.lst
В одному командному рядку дозволяється вказувати як звичайні імена або групи файлів для обробки, так і файли-списки. Якщо не вказано ні файли, ні файли-списки, то мається на увазі шаблон *.* (тобто WinRAR обробить усі файли).
В один рядок можна передати кілька команд і ключів. Головне, щоб їх порядок не суперечив синтаксису передачі параметрів. Спочатку необхідні команди, далі ключі тощо. Наприклад, у функціїFileToRAR я використовую команду і два параметри - "A-ep-df". Якщо все перевести в один рядок, замінивши всі змінні значеннями, то вийде такий рядок: Shell("C:\Program Files\WinRAR\WinRAR.exe A -ep -df" "C:\Temp\Test.rar" """C:\Temp\Test.xls"" ", vbHide) Спробуємо прочитати рядок: WinRAR повинен помістити в архів файл C:\Temp\Test.xls , ім'я створюваного архіву - C:\Temp \ Test.rar. Після успішного архівування вихідний файл C:\Temp\Test.xls буде видалено (ключ -df). Шляхи в іменах не відображаються (ключ -ep). Команду я записав з великої літери для візуального поділу, але цього не потрібно, ключі та команди не чутливі до регістру. Нижче наведено таблиці з перерахуванням та розшифровкою всіх команд і функцій, доступних у WinRAR. Також їх завжди можна подивитися у довідці самого WinRAR.
ТАБЛИЦЯ КОМАНД WinRAR [spoiler effect="blind" show="Розкрити таблицю"]
ТАБЛИЦЯ КЛЮЧІВ WinRAR Трохи докладніше варто зупинитися на ключах до WinRAR. Їх використання значно розширює можливостіархівування та подальшої обробки файлів. Навіщо вони потрібні і як застосувати? Дуже просто. Якщо подивитися на функції, наведені вище, можна побачити кілька прикладів використання ключів і команд. Нижче наведено повну таблицю ключів та їх опис: [spoiler effect="blind" show="Розкрити таблицю"]
ТАБЛИЦЯ ПАРАМЕТРІВ ВІКНА ДЛЯ Shell І таблиця параметрів та їх значень для команди Shell, через яку здійснюється виклик архіватора: [spoiler effect="blind" show="Розкрити таблицю"]
| vbNormalFocus | Буде показано хід виконання архівації |
| vbHide | Вікно архіватора буде приховано |
| vbMinimizedFocus | Вікно архіватора буде згорнуто |
| vbMinimizedNoFocus | Вікно архіватора буде згорнуто, а вікно програми, що викликала, активовано |
| vbMaximizedFocus | Вікно архіватора буде відкрито на весь екран та активовано |
АРХІВАЦІЯ ВБУДОВАНИМИ ЗАСОБИМИ Windows(в ZIP): ОСНОВНА ПРОЦЕДУРА СТВОРЕННЯ ПОРОЖНОГО ZIP-АРХІВУ
Дана процедура створює порожній 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) Створюємо порожній ZIP-архів, якщо його ще немає If Dir(sZIPFileName, 16) = "" Then CreateNewZip (sZIPFileName) = objShell.Namespace((sZIPFileName)).Items.Count 'поміщаємо файли з папки в архів objShell.Namespace((sZIPFileName)).CopyHere CStr(sFileToZIP) 'очікуємо закінчення архівації Do Until objShell.Namespace((sZIPFileName) .Count = lcnt + 1 DoEvents Loop End Function
Викликається функція так:
Sub ToRarExample() Call ZIPOneFile("C:\Documents\Архів\Test.zip", "C:\Test.xls") End Sub
При цьому використовуючи цю функцію можна помістити в один архів більше одного файлу, просто змінюючи повний шлях із файлом, який треба заархівувати. Може стати в нагоді, якщо потрібно створити архів не з заздалегідь створених у папці файлів, а додавати їх по одному на льоту.
АРХІВАЦІЯ ВИБРАНИХ ФАЙЛІВ
СТВОРЕННЯ ZIP-АРХІВУ З РЕЗЕРВНОЮ КОПІЄЮ АКТИВНОЇ КНИГИ
ВИМІТИ З ZIP-АРХІВУ КОНКРЕТНОГО ФАЙЛУ
ВИМІСТ ВСІХ ФАЙЛІВ З ZIP-АРХІВУ