Добавить файл в архив vba

Обновлено: 06.07.2024

Одной из важнейших составляющих любого языка программирования является способность считывать и записывать информацию из файлов. Стандартно это называется функциями низкого уровня (Low Level) и в полном объеме представлено в VBA. Кстати, именно эта особенность и является основой опасности макросов.

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

Доступ к этим материалам предоставляется только зарегистри­рован­ным пользователям!

P.S.! Завершение переработки материалов разработчика приводит к совершенно неутешительным выводам. Материала по этой теме всегда было очень мало, да и качество оставляло желать лучшего. Теперь же он стал «обструганным» под непонятный стандарт, разорванным в несвязанное словоизвержение и напичканным примерами, половина из которых только запутывает ситуацию, а вторая — ничего не иллюстрирует. Ну, или почти так.

Работа с файлами, дисками и папками, путь

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

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

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

CurDir

Определение текущей папки.

Из синтаксиса можно понять (или нет) достаточно многое.

Доступ к этим материалам предоставляется только зарегистри­рован­ным пользователям!

Перечисленное не дает однозначного ответа на возникающие вопросы, но является основой для таковых. Частичные решения есть в разделе Примеры.

ChDrive

Инструкция для смены текущего диска (ChDrive) работает довольно примитивно. Так, вариант

определит текущим диском диск «D:». Из примера видно, что приводится только литерал, без двоеточия.

ChDir

Изменяет текущий каталог или текущую папку

Внимание! Изменяется текущая папка на указываемом диске, а не сам диск. Для смены диска потребуется команда ChDrive.

В значении пути можно использовать обозначения относительного перемещения. Например,

Доступ к этим материалам предоставляется только зарегистри­рован­ным пользователям!

Функция возвращает строку (String) с именем обнаруженных на диске файла, папки или подпапки. Если объект файловой системы обнаружен не будет, возвратится пустая строка.

В имени можно использовать знаки подстановки маски файла (* и ?).

Передача в качестве аргумента пустой строки возвращает список всех файлов и папок.

Доступ к этим материалам предоставляется только зарегистри­рован­ным пользователям!

Атрибуты (копия из справки)

КонстантаЗначениеОписание
vbNormal0 Файлы без атрибутов (Значение по умолчанию.)
vbReadOnly1В дополнение к файлам без атрибутов определяет файлы, доступные только для чтения
vbHidden2В дополнение к файлам без атрибутов определяет скрытые файлы
vbSystem4В дополнение к файлам без атрибутов определяет системные файлы
vbVolume8Определяет метку тома, то есть имя логического диска (не букву!). Если указан какой-либо другой атрибут, параметр vbVolume игнорируется
vbDirectory16В дополнение к файлам без атрибутов определяет каталоги (папки)

Из контекста описания понятно, что атрибуты могут суммироваться.

Доступ к этим материалам предоставляется только зарегистри­рован­ным пользователям!

Оператор Name переименовывает файл или папку и/или перемещает их в новое место.

Name <oldpathname> As <newpathname>

  • Обрабатываются только уже существующие объекты.
  • Файл может быть перемещен на другой диск.
  • Файлы, открытые низкоуровневыми процедурами, надо предварительно закрыть.
  • Перемещение папок и подпапок возможно только в пределах логического диска.

MkDir

Создает новый каталог или папку.

Если диск не указан, новые каталог или папка создаются на текущем диске. Имя присваивается с учетом регистра символов.

Доступ к этим материалам предоставляется только зарегистри­рован­ным пользователям!

RmDir

Удаляет существующую директорию или папку.

Невозможно удалить папку, содержащую файлы, так что следует вначале удалить их, используя команду Kill. Также этой командой нельзя удалить файл.

Удаляет файлы с диска.

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

В имени можно использовать знаки подстановки маски файла (* и ?).

Так как команда удаляет только файлы, для удаления папок следует воспользоваться командой RmDir.

SetAttr

Устанавливает атрибуты файла.

SetAttr <имя файла>, <атрибуты>

Оба параметра являются обязательными. Имя файла может содержать путь.

Нельзя изменять атрибуты у открытых файлов!

Атрибуты:

КонстантаЗначениеОписание
vbNormal0Без атрибутов (по умолчанию)
vbReadOnly1Только для чтения (Read-only)
vbHidden2Скрытый файл (Hidden)
vbSystem4Системный файл (System)
vbArchive32Файл изменен после последнего резервного копирования

Атрибуты при указании могут суммироваться.

Доступ к этим материалам предоставляется только зарегистри­рован­ным пользователям!

Низкоуровневые функции

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

Идентификатор файла

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

где RangeNumber — 0 (1–255) или 2 (256–511).

Простейший вариант обращения (запроса) к функции выглядит так:

Далее по тексту будет использоваться именно выделенная красным переменная, содержащая получаемый ID (для упрощения записи). Если не будет заявлено другое или использовано явное указание.

Открывает файл для операций ввода/вывода (input/output, I/O).

Если указываемый на запись файл отсутствует, то он будет создан. Естественно, попытка чтения несуществующего файла закончится ошибкой (см. Dir).

Описание команды упрощено!

После завершения работы файл должен быть закрыт. Иначе какой-либо доступ к нему может быть заблокирован (в примитивном понимании и без дополнительного обсуждения). Для этого используется следующая команда:

В качестве параметра передается номер файла, номера файлов через запятую или ничего. В последнем случае закроются все открытые файлы.

Reset

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

По существу, дублирует команду Close без атрибутов.

Чтение и запись

  • Последовательный (Sequential) доступ (режимы Input, Output и Append) используется для записи в текстовые файлы, например, журналы ошибок и отчеты.
  • Прямой или произвольный доступ (Random) используется для считывания и записи данных в файле без его закрытия. Файлы с прямым доступом сохраняются данные в записях, что ускоряет нахождение требуемой информации.
  • Двоичный доступ (режим Binary) используется для считывания или записи любого байта в файле, например, при сохранении или отображении растрового рисунка.

Записывает данные в последовательный файл в структурированном виде.

Необязательный параметр OutputList представляет одно или несколько числовых, или строковых выражений через запятую, которые нужно записать в файл. В переводе на обыденный язык, каждая строка подобного результирующего файла является перечнем значений с разделителем, каждое из которых записано по строгим правилам. Фактически мы получаем известный большинству CSV-файл. Чтобы не возникало неожиданностей при считывании, следует очень четко придерживаться правил.

Отсутствие OutputList (запятая в команде остается!) приводит к записи пустой строки.

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

С другой стороны, набор множества таких строк представляет собой своего рода таблицу базы данных.

Записывает отформатированные данные в последовательный файл.

OutputList — выражение или список выражений, которые необходимо вывести.

Его синтаксис

С учетом специфического применения оператора, детали его действия опущены.

Параметр n указывает, сколько пробелов будет возвращено. При переполнении строки, излишек переходит на следующую.

Если не умничать, то функция будет работать только с моноширинным шрифтом.

Вставляет табулятор. Если параметр не указан, печать смещается к следующей позиции (шаг равен 14 символам). Наличие параметра перемещает к позиции с указанным номером. А если она уже была, то на эту позицию, но следующей строки.

Если значение width равно 0, длина строки является неограниченной. Оно используется по умолчанию.

Читает строку со структурированными данными из открытого последовательного файла и сохраняет эти данные в переменных.

Параметр VarList представляет собой перечисленный список переменных, в которые сохраняются считываемые данные.

Считывает одну строку из открытого последовательного файла и присваивает ее переменной типа String или Variant.

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

Считывает данные из открытого файла на диске в переменную.

Необязательный параметр RecNumber типа Variant (Long) указывает на номер записи (для файлов, открытых в режиме Random) или байтовое число (для файлов, открытых в режиме Binary), с которого начинается считывание. При его отсутствии, запятая сохраняется Результат сохраняется в переменную VarName.

Записывает данные из переменной в файл на диске.

  1. Параметр Len, задаваемый при открытии файла, играет ключевую роль. Во-первых, длина записи не может его превышать. Во-вторых, если запись меньше, то она дополняется пробелами до размера Len.
  2. Если записываемая переменная является строкой переменной длины, оператор Put записывает 2-байтовый дескриптор c длиной строки, а затем переменную. То есть длина записи, указанная предложением Len в операторе Open, должна быть по крайней мере на 2 больше, чем фактическая длина строки записываемых данных.
  3. Если записываемая переменная имеет числовой подтип Variant, оператор Put записывает дополнительно 2 байта, указывающие на тип. См. п.2.
  4. Если записываемая переменная имеет строковый подтип Variant, оператор Put записывает дополнительно 2 байта, указывающие на тип и еще 2 — на длину. Соответственно, значение Len должно быть увеличено на 4.
  5. Если записываемая переменная является динамическим массивом пользовательского типа, Put записывает дескриптор, длина которого равна 2 плюс в 8 раз больше числа измерений, то есть 2 + 8 * число измерений. То есть, для одномерного массива — 10 (2+8*1), для двумерного — 18 (2+8*2) и т.д. Плюс размер массива, описать который нормально сотрудники Microsoft не удосужились.
  6. Если записываемая переменная является массивом фиксированного размера, оператор Put записывает только данные, без дескриптора.
  7. При любом другом типе переменной все также, как и в п.6.
  • Параметр Len, задаваемый при открытии, не действует. Значения переменных записываются последовательно, без заполнителя.
  • Для любого другого массива, чем массив типа, определяемого пользователем, оператор Put записывает только данные, без дескриптора.
  • Оператор Put записывает строки переменной длины, не являющиеся элементами типов, определяемых пользователем, с числом байтов равных числу знаков в строке.

Параметр position указывает начальную точку чтения и должен располагаться в диапазоне 1—2 147 483 647.

По существу, оператор назван неудачно, так как ничего не ищет, а просто перемещается по команде.

Примеры

Здесь не стоит разговаривать о микроскопических программах, хотя из приводимых примеров можно извлекать блоки и использовать их в качестве заготовок.

Также не будет полноценных примеров для бездумного копирования.

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

В любом случае, все примеры полностью работоспособны.

Принципиально важен факт документирования функции с точки зрения возвращаемых значений. Равно как и описание передаваемых параметров.

  • Путь должен содержать литерал диска (C. ).
  • Путь не должен заканчиваться косой чертой: «C:\a\b».
  • Если путь и файл передаются отдельно, то имя файла не должно содержать пути.
  • Все параметры являются обязательными и не могут быть пустыми. Последнее обстоятельство не проверяется.

Создание файла

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

Доступ к этим материалам предоставляется только зарегистри­рован­ным пользователям!

Ещё один момент. Добавим программу (фрагмент), которая будет запускать процесс.

Доступ к этим материалам предоставляется только зарегистри­рован­ным пользователям!

Проверка существования файла

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

Доступ к этим материалам предоставляется только зарегистри­рован­ным пользователям!

Запись информации в новый файл

Разумеется, что в этой ситуации файл нужно не открыть, а создать.

Доступ к этим материалам предоставляется только зарегистри­рован­ным пользователям!

Добавление информации в существующий файл

Казалось бы. Но первым действием должна быть проверка его наличия, если это не было сделано в программе ранее.

Доступ к этим материалам предоставляется только зарегистри­рован­ным пользователям!

Построчное считывание файла

Доступ к этим материалам предоставляется только зарегистри­рован­ным пользователям!

Назначение текущей папки

Если работа с проектами так или иначе связана с файлами, хранящимися в одной папке, самым простым вариантом будет назначение ее текущей.

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

Доступ к размещенным в этом месте материалам ограничен и предоставляется следующим категориям:
1. Студент I/II курса ВХК РАН. 2. Бывший студент ВХК РАН. 3. Подготовка к ОГЭ. 4. Подготовка к ЕГЭ. 5. VIP-пользователь. 6. Благотворитель.

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


Copyright © 1993–2021 Мацкявичюс Д.А. Все права защищены.
Никакая часть сайта не может быть воспроизведена никаким способом без письменного разрешения правообладателя и явной ссылки на данный ресурс.

1. Наличие файла в архиве ?
2. Извлечения из архива ?
3. Добавление в архив ?

какие типы для этого использовать ZIP RAR COM TAR.

Добавлено через 25 минут
может это умеет делать Shell.Application ?

Добавлено через 1 час 13 минут

Работа с zip архивом
Заинтересовался вот чем: Как с помощью кода С++ разархивировать запароленую папку зная пароль.


Работа с архивом через ZipForge
Добрый день, вобщем проблема такая. на форме содержится канва и поле мемо, как можно всю.

JavaScript. Работа с архивом - распаковка
Доброго времени суток. Ищу уже 2-й день работу с архивом. Примеров тьма, но я так и не могу понять.

Решение

Вот мой довольно старый код получения оглавления zip-архива:

Запись в архив !

Добавлено через 11 минут
Так можно узнать имена фойлов в ZIP-архиве !

Добавлено через 4 минуты
И з в л е ч е н и е ! (всё вопрос я снимаю ! )

Решение

Спасибо, а какой способ лучше Arj или Zip
тоесть
1 совместимость в OS
2 скорость
3 эфективность ? Какой архиватор лучше? Это - тема для холивара!
Zip есть везде. По остальным параметрам затрудняюсь ответить.

Я допишу в своём модуле файловых операций, и вcтавлю дополнительные флаги

Добавлено через 7 минут
% ? кстате почему вы используете интегры а не Long &

Этот код работал еще в DOS. А integer вдвое короче long. Я читал статью что процессоры X86 наоборот с Long быстрее работают, ну тоесть 32бит Да, быстрее, но 640K памяти в DOS-е не всегда хватало.

Решение

JoraVoenyjHaker, спасибо, и особенно Catstail - шикарно!

Из интернетов еще - VBScript Class:

Спасибо, а какой способ лучше Arj или Zip
тоесть
1 совместимость в OS
2 скорость
3 эфективность ? Ну архив ZIP открывается по-умолчанию средствами XP, поэтому лично для меня выбор очевиден.
Остальные обсуждения - да, тема для холиваров. '/// Открываем новый архив
Zip.CreateArchive DestFilePath с ним ещё и как с объектом можно работать ! Неожиданное для меня познание

Да, я тоже раньше не знал, что VBScript поддерживает классы.

Помощь в написании контрольных, курсовых и дипломных работ здесь.

ZipFile распаковка в директорию с архивом
Мне надо сделать так, что архив распаковывался в папку с архивом (Архив находится в папке с.


Передача файлов по сети архивом
Добрый день. Пишу что-то вроде своей системы обновления версий. Мне надо скопировать файлы на.

Как заставить PS работать с архивом EventLog'a?
Доброго времени суток. Имеется некоторые сервер на котором генерируется туча событий в минуту.

Не могу воспользоваться архивом Хорстманна, подскажите
Не могу воспользоваться архивом Хорстманна, подскажите, пожалуйста Посмотрел по запросу Google.

В данной статье я постараюсь описать и показать, как можно средствами Visual Basic for Applications создать архив и извлечь данные из архива(иными словами архивировать и разархивировать файлы).

Архивация встроенными средствами 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"

ОБЩАЯ ПРОЦЕДУРА ВЫЗОВА ФУНКЦИЙ АРХИВАЦИИ/РАЗАРХИВАЦИИ

АРХИВАЦИЯ ПАПКИ - WinRAR

АРХИВАЦИЯ ФАЙЛА - WinRAR

ИЗВЛЕЧЕНИЕ ИЗ АРХИВА ПАПКИ/ФАЙЛА - WinRAR

Ничего сложного - функции делают одно - вызывают посредством объекта Shell архиватор WinRAR, передавая ему указанные параметры. Для большинства задач функции вполне подойдут без каких-либо изменений. Если лень разбираться - можно просто последовательно скопировать ВСЕ коды данной статьи и вставить их в стандартный модуль.
А для тех, кто хочет углубиться и поэкспериментировать - можно почитать дальше и узнать какие можно применить команды и ключи для более гибкого использования WinRAR вместе с VBA.
Синтаксис передачи параметров WinRAR:
WinRAR [команда] -[ключ1] -[ключN] [архив] [файлы…] [@файл-список…] [путь для извлечения\]

ОПИСАНИЕ ПАРАМЕТРОВ WinRAR

После этого для архивирования достаточно будет выполнить команду:
winrar a backup @backup.lst

В одну строку можно передать сразу несколько команд и ключей. Главное, чтобы порядок их не противоречил синтаксису передачи параметров. Сначала необходимые команды, далее ключи и т.д. Например, в функции 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

Команда Описание
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
Чуть подробнее стоит остановиться на ключах к WinRAR. Их использование значительно расширяет возможности архивирования и дальнейшей обработки файлов. Для чего они нужны и как применить? Очень просто. Если взглянуть на функции, приведенные выше, то можно увидеть пару примеров использования ключей и команд.
Ниже приведена полная таблица ключей и их описание:

ТАБЛИЦА ПАРАМЕТРОВ ОКНА ДЛЯ Shell
И таблица параметров и их значений для команды Shell, через которую осуществляется вызов архиватора:

Параметр Значение параметра
vbNormalFocus Будет показан ход выполнения архивации
vbHide Окно архиватора будет скрыто
vbMinimizedFocus Окно архиватора будет свернуто
vbMinimizedNoFocus Окно архиватора будет свернуто, а окно вызвавшей программы активировано
vbMaximizedFocus Окно архиватора будет раскрыто на весь экран и активировано

АРХИВАЦИЯ ВСТРОЕННЫМИ СРЕДСТВАМИ Windows(в ZIP):

ОСНОВНАЯ ПРОЦЕДУРА СОЗДАНИЯ ПУСТОГО ZIP-АРХИВА

Данная процедура создает пустой ZIP-архив, в который далее и помещаются необходимые файлы. Эту процедуру необходимо обязательно копировать вместе с процедурами создания ZIP-архивов, приведенными ниже(Zip_File_Or_Files, Zip_All_Files_in_Folder, Zip_ActiveWorkbook).


АРХИВАЦИЯ ОДНОГО УКАЗАННОГО ФАЙЛА

Вызывается функция следующим образом:

Sub ToRarExample() Call ZIPOneFile("C:\Documents\Архив\Test.zip", "C:\Test.xls") End Sub

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

Во вложении - файл, при запуске которого автоматически срабатывает такой макрос
При открытии этого файла, если включены макросы, в папке My Program Backups будет сохранена копия книги в формате ZIP (архив)
Папка, если таковая не существует, будет автоматически создана макросом.

Функция для разархивирования (извлечения файлов из архива ZIP)

Комментарии

Ни разу с таким не сталкивался (не делал многотомные архивы), так что не могу подсказать

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

Подскажите пожалуйста а как добавить к имени архива путь исходного файла - это нужно например в том случае если имена документов одинаковые? а расположение разное (с учетом того что архив создается не в текущей папке как в примере, а в одну конкретную папку - например D:\backup). Используя приведенный пример(с изменением папки назначения) невозможно отличить резервную копию файла "отчет1" из папки "декабрь" от "отчет1" из папки "ноябрь"

Функция Zip_File ругается если в пути архивируемого файла есть символы «». Есть ли способ обойти это ограничение?

Дмитрий, да, так и должен делать этот код.
Так устроена работа с ZIP в windows
Для распаковки можно использовать WinRAR - быстрее будет. Примеры кода вроде были у меня на сайте.

Подскажите, это только у меня при использовании функции UnZip_File в момент, когда исполняется оператор
oApp.Namespace(DestinationFolder).CopyHere oApp.Namespace(FileNameZip).Items
система автоматически создает в TEMP (c:\Documents and Settings\User\Local Settings\Temp\) папку "Временная папка 1 для имя.zip"
куда параллельно распаковывает архив. Из-за чего извлечение происходит значительно медленнее архивации

При использовании ThisWorkbook.SaveCopyAs FileNameXls
все гиперссылки на папки в сетевом окружении в текущем файле изменяют своё значение с Папка1\Папка2 на ..\Папка1\Папка2
Причем количество "..\" зависит от места копирования, прописанного в FileNameXls (чем глубже папка сохранения относительно текущего файла, тем больше "..\").
Соответственно, все ссылки в текущем файле перестают работать.

Программа продолжает работу с оригинальным файлом

Если нужна копия листа - нужен немного другой код:
1) создаете копию 4-го листа методом Copy
например, ThisWorkbook.worksheets(4).copy

2) сохраняете активную книгу (которая создалась при копировании листа) под заданным именем
например: ActiveWorkbook.SaveAs FileNameXls

3) закрываете книгу-бекап без повтороного сохранения:
ActiveWorkbook.Close False

PS: если сами не разберетесь - всегда можно оформить заказ на сайте

Подскажите пожлста, у меня 2 вопроса. Первый-с каким файлом будет продолжена работа после сохранения, с тем который забэкапился или с оригиналом? И второй- можно ли как то сохранять не всю книгу, а определенный лист от нее? Например-программа состоит из 4 листов, на 4 листе сводная информация. Нужно чтобы создалась копия файла, только с этим единственным 4 листом.

[quote]но код приведён в другой статье.[/quote]
Не подскажете в какой?
Поиском по сайту не могу найти.

А зачем прописывать в коде какую-то задержку.
Команды ведь последовательно выполняются, - пока архив не создастся, письмо не начнёт формироваться.

И вообще, - в каком формате-то вы архив создаете?
Вы пишете комментарий в статье, где пример кода только для ZIP архивов, - они создаются медленно, средствами Windows.
А изначально вы писали про архив RARб - там совсем другой макрос используется, более надежный и быстрый, - но код приведён в другой статье.

Спасибо за разьяснения.
Тут собственно из папки размером 42мб получается архивный файл 5,6 мб и задержка во времени вот пока эти 5,6 мб пишутся на диск.
У меня сделано сейчас с задержкой времени на 8 сек перед отправкой файла, а на другом компе оказывается этого времени мало, нужно увеличивать.
Вот и думал, может как-то можно этот момент проскочить:).

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

Сделал на основе Ваших кодов архивирование и отправку на почту рабочей папки с помощью WinRar.
Все получается, но возник вопрос:
Есть-ли возможность не создавать(не писать на диск) файл .rar, т.е. создавать его в памяти?
Сейчас у меня работает все классически - создается папка, из нее файл архива пишется на диск, затем удаляется исходная папка (командой rar), файл архива отправляется на почту и затем удаляется. Самое ненужное здесь - это запись на файла на диск перед отправкой, да и время занимает, приходится как-то выкручиваться, ждать перед отправкой файла на почту.

Если запускать на жестком диске (даже подключенном по USB) - работает. При запуске с флэшки ищет новые тома архива (? :) ) (w7x64 office2k10 x64)

Здравствуйте, Дмитрий.
Конечно, это возможно.
Оформляйте заказ на сайте, прикрепляйте свой файл с макросом,
подробно опишите, что, куда, под каким именем, и как часто, должно сохраняться.

Для создания архивов RAR нужна программа WinRAR - она у вас установлена?

Это конечно все хорошо, у меня такой вопрос, у меня имеется макрос который сохраняет книгу, дубликат, с последующей замены его, и создает дубликат на каждый месяц, суть в чем, мне бы хотелось видоизменить этот макрос, что бы сохранял в архив.rar, возможно ли такое?
С Уважением Дмитрий!

  • Номер_файла – обязательный параметр, представляющий из себя номер, присвоенный файлу при открытии с помощью оператора Open.
  • Переменные – обязательный параметр, представляющий из себя список переменных, разделенных запятой, которым присваиваются значения, считанные из файла.
  • Номер_файла – обязательный параметр, представляющий из себя номер, присвоенный файлу при открытии с помощью оператора Open.
  • Переменная – обязательный параметр, представляющий из себя имя переменной, объявленной как String или Variant, которой присваивается строка, считанная из файла.
  • Номер_файла – обязательный параметр, представляющий из себя номер, присвоенный файлу при открытии с помощью оператора Open.
  • Данные – необязательный параметр, представляющий из себя одно или несколько числовых или строковых выражений, разделенных запятой, которые нужно записать в файл.

Функция EOF

Функция EOF возвращает логическое значение True, когда достигнут конец файла, открытого для последовательного (Input) или произвольного (Random) доступа.

Синтаксис функции EOF:

Номер_файла – это номер, присвоенный файлу при открытии с помощью оператора Open.

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

Примеры чтения и записи в файл

Пример 1
Открытие (или создание, если он не существует) текстового файла для чтения и записи и запись в него одной строки, состоящей из двух текстовых и одного числового значений. Файл с именем myFile1.txt будет создан в той же папке, где расположен файл Excel с кодом VBA.

Open ThisWorkbook . Path & "\myFile1.txt" For Output As ff

Пример 2
Открытие (или создание, если он не существует) файла без расширения для чтения и записи и запись в него трех строк: двух текстовых и одной в числовом формате. Файл с именем myFile2 будет создан в той же папке, где расположен файл Excel с кодом VBA.

Так как у файла нет расширения, Windows выведет диалоговое окно для выбора открывающей его программы. Выберите любой текстовый редактор или интернет-браузер.

Пример 3
Считываем строку, разделенную на отдельные элементы, из файла myFile1.txt и записываем в три переменные, по типу данных соответствующие элементам.

Open ThisWorkbook . Path & "\myFile1.txt" For Input As ff 'Считываем строку из файла и записываем в переменные

Пример 4
Считываем поочередно три строки из файла myFile2 и записываем в три элемента массива, объявленного как Variant, так как в этот файл ранее были записаны две строки с текстом и одна с числом.

Читайте также: