Новости:

Теперь на форум можно залогиниться / зарегистрироваться с помощью ВКонтакте. Уже существующие пользователи могут связать свою учетную запись с аккаунтом ВКонтакте одним кликом в профиле пользователя http://forum.msexcel.ru/index.php?action=profile;area=account

Главное меню

Макрос для периодического сохранения файла

Автор Максим Пупкин, 12.02.2013, 11:43

« назад - далее »

Максим Пупкин

Добрый день, уважаемые форумчане!

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

Что нужно - чтобы в процессе работы с книгой Excel периодически выполнялось сохранение файла (текущей книги). Не автосохранение, которое можно прописать в Excel, а именно сохранение - эквивалент того, что происходит по Ctrl/S. Это нужно, чтобы Dropbox увидел изменившийся файл и создал новую версию файла - таким образом, мы получаем последовательность версий, отстоящих друг от друга, например, на 3 минуты, и если бухгалтер под действием выкуренной дури накосячит - чтобы можно было взять файл отчёта по состоянию на N минут назад. Всё бы хорошо, но автосохранение не трогает сам файл, с которым работают, - вместо этого некие данные пишутся в некие другие файлы, по которым Excel потом может что-то там восстановить - но это совсем не то, что нам требуется.

Порывшись немного в нете, сделал макрос (текст чуть ниже). Всё работает замечательно, каждые 3 минуты файл сохраняется, но теперь другая беда - кнопки "Отменить действие" и "Отменить отмену" при работе макроса неактивны.
Т.е., если я даже просто вношу число в ячейку, то удалить его можно только затерев вручную, отмены нет.

А теперь, собственно, вопросы...

1. Почему не работают кнопочки Undo / Redo, и как сделать, чтобы они работали?
2. Можно ли вызывать ActiveWorkbook.Save() по событиям таймера, программируя их с нужным интервалом, а не крутить в тесном цикле?
3. Возможно, проблему с регулярным сохранением файла можно решить вообще без макроса? (программировать бухгалтера на нажатие Ctrl/S каждые 3 минуты не предлагать )))

Sub Delay(dblSecs As Double)
Const OneSec As Double = 1# / (1440# * 60#)
Dim dblWaitTil As Date
dblWaitTil = Now + OneSec * dblSecs
Do Until Now > dblWaitTil
  DoEvents ' Allow windows messages to be processed
Loop
End Sub

Sub Auto_Open()
Do Until False
  Delay (180) ' Save the document every 180 seconds
  ActiveWorkbook.Save
Loop
End Sub



Poltava

Цитировать1. Почему не работают кнопочки Undo / Redo, и как сделать, чтобы они работали?
Я так понимаю это особенность метода .Save как бороться незнаю да и вообще сомневаюсь что возможно
Цитировать2. Можно ли вызывать ActiveWorkbook.Save() по событиям таймера, программируя их с нужным интервалом, а не крутить в тесном цикле?
Смотри пример в скрепке когда то увидел здесь у Шпец Докапыч и взял на заметку(). Да кстати использовать нужно не ActiveWorkbook (активная книга) а ThisWorkbook() (книга из которой запущен макрос) иначе у вас не всегда будет сохраняться та книга которая нужна, а та которая активна в данный момент, а это далеко не всегда нужно!
Цитировать3. Возможно, проблему с регулярным сохранением файла можно решить вообще без макроса? (программировать бухгалтера на нажатие Ctrl/S каждые 3 минуты не предлагать )))
Ну кроме того который вы просите не предлагать, я по крайне мере таких не знаю!

PS: проблему с Undo/Redo можно попробовать обойти использовав вместо Save (активировав нужную книгу  програмное нажатие ctrl+s и возврат к книге над которой работали) у меня это быстро реализовать не получилось, не складываються у меня отношения с программным нажатием. может метры помогут. Хотя думаю и этот вариант не без граблей!
Не пытайтесь спорить с дебилом. Иначе вы опуститесь до его уровня. Где он задавит вас своим опытом.

Максим Пупкин

ЦитироватьЯ так понимаю это особенность метода .Save как бороться незнаю да и вообще сомневаюсь что возможно

Не, это таки особенность тесного цикла. Вот в таком варианте - с Application.OnTime - всё работает, СПАСИБО! )
Но, естественно, работает до того момента, пока не сработает сохранение. После этого ничего откатить уже не удаётся.

Да, за идею с проверкой, что файл уже сохранен - отдельное спасибо!!

И ещё один вопросик возник - может, подскажешь? Есть идея сохранять файлы с разными именами - либо инкрементировать число, либо кусочек из даты добавлять в суффикс... проблема в том, что после SaveAs() имя текущего документа меняется. Т.е., если я работаю с aaa.xlsx и делаю ему SaveAs("aaa_001.xlsx"), то после этого я уже работаю с aaa_001.xlsx. А хотелось бы, чтобы просто сохранился файл с новым именем, а я продолжил бы работать с a.xlsx. Такое возможно?

Poltava

Как то так
Sub СохранитьКопию()
    Dim DefaultPath$, DefaultName$
    DefaultPath = "d:\"
    DefaultName = Format(Date, "YYMMDD") & Format(Time, "HHMM") & "_" & ThisWorkbook.Name
    ThisWorkbook.SaveCopyAs (DefaultPath & DefaultName)
End Sub

Я бы еще сюда заглянул Макрос создания копии файла Excel в виде архива ZIP. и к тому же обязательно добавил бы процендуру удаления файлов которым допустим больше 3 месяцев иначе ужасно захламишся уже проверено!
Не пытайтесь спорить с дебилом. Иначе вы опуститесь до его уровня. Где он задавит вас своим опытом.

Максим Пупкин

Спасибо, то что надо!
А удалять старые файлы - однозначно лучше отдельным скриптом, который запускается периодически по времени (раз в сутки, например), проверяет и удаляет. Я бы эту задачу на эксель не возлагал.

Poltava

ну почему! я возлагаю особенно если это архивы того же файла! то есть Вы запустили файл эксель он сделал резарвную копию и заодно проверил и почистил свои старые варианты!
Не пытайтесь спорить с дебилом. Иначе вы опуститесь до его уровня. Где он задавит вас своим опытом.

Alex_ST

С уважением, Алексей