Страница 1 из 2

резервное копирование в процессе работы

Добавлено: 31 окт 2006, 20:58
VictorM
Опять, проблеммы :(
Во время работы программы (в которой в течение дня накапливаются данные) происходит сбой, или просто девочка-оператор не ту "пыпочку" нажала. Понятно, данным хана.
Вопрос такого порядка, как можно в течение рабочего дня сохранять какую-то резервную копию, что ли? Ничего путного в голову не приходит. Может кто сталкивался? Подскажите. Спасибо!

Добавлено: 31 окт 2006, 21:29
Pavel55
Я использую следующий код.
Данный код сохраняет текущий файл с утра (при первом открытии файла сегодня) в указанную папку и добавляет вчерашнюю дату к концу файла
Данный код надо разместить в модуле ЭтаКнига (ThisWorkbook), т.к. используется процедура Workbook_Open()

Код: Выделить всё

Option Explicit
Private Sub Workbook_Open()
'каждый день сохраняет копию файла со вчерашней датой
Dim wb As Workbook, wbName, Today, Yesterday As String
    If Date <> DateValue(ThisWorkbook.BuiltinDocumentProperties("Last Save Time")) Then
        Set wb = Excel.Application.ActiveWorkbook
        wbName = wb.Name
        'для подстановки вчерашней даты к имени файла
        Today = Date
        Yesterday = DateAdd("d", -1, Today)
        'для проверки существования такого же файла
        If Dir("C:\Temp\" + Left(wbName, Len(wbName) - 4) + "_" + Yesterday + ".xls") <> "" Then
            MsgBox "Копия файла c датой " & Yesterday & " уже существует!"
            Exit Sub
        End If
        'сохранение копии файла
        wb.SaveCopyAs ("C:\Temp\" + Left(wbName, Len(wbName) - 4) + "_" + Yesterday + ".xls")
        MsgBox "Копия файла c датой " & Yesterday & " сохранена!", vbInformation
    End If
End Sub
А в течение дня, я думаю, можно сохранять текущий файл методом Application.OnTime Например, так:

Код: Выделить всё

Application.OnTime TimeValue("15:00:00"), "Save_copy"
а в этой процедуре Save_copy сохраняй копию файла куда-нибудь

Добавлено: 31 окт 2006, 22:00
VictorM
Pavel55, спасибо за совет, ща буду пробовать. Только в моем случае нужно будет попытаться сделать сохранение в архивированном виде, несколько раз в день с заменой предыдущего архива. Мраки...

Добавлено: 31 окт 2006, 22:13
pashulka
Вот так будет немного проще, к тому же не используются вариантные переменные :wink:

Код: Выделить всё

Dim wb As Workbook, wbName As String, Yesterday As String

Yesterday = CStr(Date - 1) 'Date - 1
Что касается сути вопроса, то в MS Excel есть возможность создания резервной копии без использования макросов, но сохранение копии будет происходить только при сохранении самой книги. Но если использовать надстройку Автосохранение (MS Excel 97, 2000) то рабочую книгу можно сохранять с определённым интервалом и не полагаться на авось. Что касается потери данных, то в версии MS Excel XP уже существует возможность восстановления данных : Сервис/Параметры/Сохранение

P.S. Всё вышесказанное не относится к архивации данных.

Добавлено: 31 окт 2006, 22:50
Pavel55
спасибо, а почему не CDate?

Добавлено: 31 окт 2006, 23:25
pashulka
Date - 1 и так возвращает дату, нам же необходимо получить строку, ибо Вы об'явили переменную Yesterday как String, отсюда, собственно говоря, и CStr. Кстати, без переменной wb также можно обойтись, но это уже дело вкуса, если можно так выразиться.

Добавлено: 01 ноя 2006, 21:39
Avsha
Есть еще вариант с bat-файлами, удобен тогда,
когда место расположения .xls-файлов пользователя фиксировано.

1. Пусть пользователь работает в папке C:\Work\*.xls и производит
сохранение файла .xls по необходимости или с помощью механизма Автосохранения.

2. Параллельно работает файл - Архивное_копирование_XLS.bat, который формирует
сдвигающиеся последние две копии файла в определенном месте:

Код: Выделить всё

-----------------------------------------
rem Удаление предыдущей копии BAK
rd /S /Q C:\Temp\Arxiv_BAK

rem Переименовани папки Текущий_Архив --> BAK
rename C:\Temp\Arxiv Arxiv_BAK

rem Создание папки Текущий_Архив
mkdir C:\Temp\Arxiv

rem Копирование архивированных файлов в папку Текущий_Архив
xcopy C:\Work\*.xls C:\Temp\Arxiv\Work\  /E /F /Y
--------------------------------------------
3. Можно создать расписание в Windows - для периодического запуска bat-ника.
4. Можно создать более 3,4 и т.д. сдвигающиеся копии.
5. Время создания папок-копий можно смотреть в Проводнике в режиме \Вид\Таблица\поле Изменен.

Добавлено: 01 ноя 2006, 23:03
VictorM
Всем спасибо, интересные решения. Буду пробовать все, пока не знаю, что подойдет лучше. Только вот еще попутный вопрос - как запустить архиватор (например zip), чтобы получить архивный файл?

Re: резервное копирование в процессе работы

Добавлено: 11 фев 2009, 10:10
VictorM
В начале работы, при открытии файла, создается его копия вот таким образом:

Код: Выделить всё

Private Sub Workbook_Open()
    ph = ActiveWorkbook.Path
    Dim wb As Workbook, wbName, Today, Yesterday As String
    Set wb = Excel.Application.ActiveWorkbook
    wbName = wb.Name
    Today = Date
    Yesterday = DateAdd("d", -1, Today)
    wb.SaveCopyAs (ph & "\Архив\" + Left(wbName, Len(wbName) - 4) + "_" + Yesterday + ".xls")
End Sub
все нормально, все работает, но вот теперь возникает 2 вопроса:
1. Как всеже создать заархивированный .zip файл? Что-то так и не получилось у меня((
2. В папке несколько файлов .xls относящиеся к одному проекту, и хотелось бы создавать архивную копию всех этих файлов в один . zip файл.
Кто может подсказать?
Спасибо!

Re: резервное копирование в процессе работы

Добавлено: 17 фев 2009, 21:34
EducatedFool
А обязательно создавать ZIP - архив?

Может, подойдёт SFX - архив:

Код: Выделить всё

Sub [B]СозданиеSFXархива[/B]()
    ' имя создаваемого архива будет иметь вид  [B]Мой архив 17-Feb-2009.exe[/B]
    WinRAR_Path = """C:\Program Files\WinRAR\WinRAR.exe"""
    WinRAR_Keys = " a -r -sfx -ep -agDD-MMM-YYYY "

    FolderPath = "C:\Documents and Settings\Игорь\Рабочий стол\" ' папка с файлами
    ArchieveFileName = Chr(34) & FolderPath & "Мой архив .exe" & Chr(34) ' имя и путь создаваемого архива
    Mask = Chr(34) & FolderPath & "*.xls" & Chr(34) ' добавляем только файлы Excel
    Icon = " -iicon" & Chr(34) & "C:\Program Files\Microsoft Office\OFFICE11\MSN.ICO" & Chr(34) ' иконка

    CommandLine = WinRAR_Path & WinRAR_Keys & ArchieveFileName & " " & Mask & Icon
    'MsgBox CommandLine
    [B]Shell[/B] CommandLine
End Sub
Впрочем, в приведённом коде несложно изменить ключи командной строки WinRAR так, чтобы формировался именно ZIP (или RAR)

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