Создание резервных копий ценных файлов

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

Если у вас Excel 2010, то кроме стандартного автосохранения у вас должна работать система версий - каждый раз при автосохранении Excel делает отдельную копию вашего текущего файла и (даже!) при выходе из программы и отрицательном ответе на вопрос "Сохранить изменения в файле?" все равно сохраняет временную копию. Добраться до этих временных копий можно через вкладку Файл - Сведения - Версии (File - Properties - Versions):

autobackup1.png

 Для своих проектов я в итоге пришел к другому решению - написал макрос, который сохраняет текущую книгу в заданную папку, добавляя к имени книги текущую дату и время в формате ДД-ММ-ГГ  ЧЧ-ММ (например Мой проект 12-10-12 07-35). Периодически запуская этот макрос на ключевых этапах работы с файлом, я получаю список из энного количества файлов-версий рабочей книги и, соответственно, легко могу откатиться к нужному варианту в прошлом.

Откройте редактор Visual Basic, выбрав на вкладке Разработчик - Редактор Visual Basic (Developer - Visual Basic Editor) или нажав ALT+F11. Вставьте через меню Insert - Module новый пустой модуль и скопируйте туда текст этого макроса:

Sub Backup_Active_Workbook()
    Dim x As String
    strPath = "c:\TEMP"     'папка для сохранения резервной копии
    On Error Resume Next
    x = GetAttr(strPath) And 0
    If Err = 0 Then ' если путь существует - сохраняем копию книги, добавляя дату-время
        strDate = Format(Now, "dd-mm-yy hh-mm")
        FileNameXls = strPath & "\" & "Мой проект" & " " & strDate & ".xls"   'или xlsm
        ActiveWorkbook.SaveCopyAs Filename:=FileNameXls
    Else 'если путь не существует - выводим сообщение
        MsgBox "Папка " & strPath & " недоступна или не существует!", vbCritical
    End If
End Sub

Естественно, путь к папке (C:\TEMP) и имя файла (Мой проект) надо заменить на свои.

Если ваша папка для сохранения находится на сетевом диске, то ее адрес можно прописать, используя IP-адрес сервера, например:

strPath = "\\192.168.1.1\Папка для бэкапов"

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

FileNameXls = strPath & "\" & Sheets("Лист1").Range("A1").Value & " " & strDate & ".xls"

Предполагается, что имя файла берется с листа Лист1 из ячейки А1.

Ссылки по теме

 



04.06.2013 00:31:03
Доброго времени суток!

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

Спасибо!
21.11.2013 12:14:28
А можно сделать так, чтобы этот маркос автоматически запускался 1 раз в день при первом запуске, а при повторном запуске в этот день сохранение не происходило (просто долго ждать сохранение файла в 200 мегабайт)?
24.12.2013 22:40:50
Который раз захожу на этот форум и почти всегда нахожу ответы на свои вопросы. А если и не нахожу сам, то в созданной теме оперативно получаю советы как решить проблему.
За это огроменная благодарность создателю сайта и модерам.
24.02.2014 15:05:23
Добрый день!
Спасибо за макрос. Повесил на Auto_open() и пользуюсь не первый месяц - уже не раз макрос спасал от потери данных.
Но недавно обратил внимание, что если документ уже открыт другим пользователем (файл на сервере), то Backup делается во всякие разные папки (логику выбора папок пока не понял) и приходится раз в неделю пользоваться поиском и удалять не нужные. Можно как-то это обойти, чтобы если файл уже открыт, то макрос бы не запускался?
01.10.2014 20:59:24
Спасибо - очень помогло! Дома в Эксель 2007 - все работает отлично!,  но на работе Эксель 2003 и работаю с расширением *.dbf (накладные приходят в этом формате) - сохраняет некорректно - приходится сперва сохранить в xls. Возможно что-то подправить? Нов любом случае спасибо за удобство!:)
29.12.2014 10:12:20
Здравствуйте, Николай. Очень полезная предложенная вами функция автосохранения, но у меня не получается. Excel у меня десятый.                            1. Расширение в коде сменил на
FileNameXlsm = strPath & "\" & "Автосохранение" & " " & strDate & ".xlsm"  
 ActiveWorkbook.SaveCopyAs Filename:=FileNameXlsm
в трех местах (выделил красным цветом).
2. Для пробы создал папку тоже на диске С и назвал Автосохранение (как и сам файл).
strPath = "C:\Автосохранение"
3. Не сохраняет. Пробовал удалить папку - нет сообщения "недоступна или не существует!".
Скажите, пожалуйста, где я не прав. Хочется, чтобы код работал.
С наступающим Новым годом!
05.02.2015 16:02:34
Добрый вечер!

Если будет возможность, можете прокомментировать вопрос от Вадима Холькина?

Просто у меня аналогичная проблема :(

Заранее большое спасибо!
05.02.2015 16:08:48
аа нет, исправил Temp на TEMP и все заработало))

В любом случая спасибо!
12.02.2015 14:59:46
Чингиз, привет. Я писал Temp и TEMP - не сохраняет. Я насколько понял дело не в названии. Главное, что-бы наименование папки для сохранения совпадало с наименованием в коде (в макросе). Аналогично с наименованием файла, который сохраняешь. Или я не прав? Но при любых раскладах у меня не работает сохранение. Что подскажешь? Ты Xlsm менял тоже в 3-х местах?
13.02.2015 11:57:32
Работать сохранение стало после установки кнопки на лист и установки макроса для неё. Я думал, что при закрытии книги будет автосохранение, но работает пока только с кнопки.
13.02.2015 12:06:38
Чтобы этот макрос автоматически запускался при закрытии книги, его надо прописать в обработчике события закрытия файла. Для этого откройте редактор Visual Basic (Alt+F11), откройте двойным щелчком в левом верхнем углу модуль ЭтаКнига или ThisWorkbook и вставьте туда код запуска нашего макроса:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
   Call Backup_Active_Workbook()
End Sub
14.02.2015 08:53:05
Спасибо, Николай. Все отлично получилось.
19.02.2015 20:01:16
Не за что, Вадим!
08.04.2015 16:19:13
А как изменить вышеуказанный код, чтобы в сохраненной копии файлов не работали кнопки запускающие макросы?
09.04.2015 09:09:43
Сохраняйте в формате XLSX без поддержки макросов - они все умрут автоматически.
11.04.2015 15:39:51
И так пробовал, но они не умирают. :)
28.04.2016 15:01:17
Спасибо за макрос! Великолепно работает!
06.10.2016 12:47:35
Добрый день, Николай.
Вопрос возник по данному макросу. Прошу помощи. Хотел бы сохранить не одну копию рабочего файла ,а размножить его. Количество копий файла  должно браться из диапазона.
1. как сделать, чтобы информацию о сохраняемых именах можно было брать не из одной ячейки (A1 в данном случае), а из диапазона? Пробовал поставить вместо A1 диапазон A1:A10. не получилось сохранить несколько файлов.
Догадываюсь, что надо назначить какую-то переменную для диапазона. Но, к сожалению, с макросами пока на Вы
Здравствуйте. Большое спасибо за макрос!
Подскажите пожалуйста можно ли автоматизировать процесс сохранения? Например 1 раз в сутки и т.д.
Наверх