2016-08-18 2 views
0

В настоящее время у меня есть макросетка с поддержкой макросов, которая выполняет различные функции, включая обновление, создание и удаление сотен строк. Если по какой-либо причине одна из этих функций переходит в haywire и удаляет информацию, предназначенную для хранения, я хотел бы реализовать кнопку «Отменить», которая восстанавливает версию этой таблицы, которая была просто изменена макросом.Кнопка «Отменить» в VBA, которая восстанавливает всю версию рабочего листа

Я предполагаю, что это будет выглядеть следующим образом:

Public InstanceOfWorksheet As Range 

Sub Button_Click() 
    InstanceOfWorksheet = CurrentWorksheet.UsedRange 'Or something like this 
    'Macro functionality here 
    CurrentWorksheet.Update() 'Worksheet has now been updated 
    End Sub 

Sub Button2_Click() 
    InstanceOfWorksheet = CurrentWorksheet.UsedRange 'Or something like this 
    'Second Macro functionality here 
    CurrentWorksheet.Update() 'Worksheet has now been updated 
    End Sub 

Sub UndoLastMacro_Click() 
    CurrentWorksheet = InstanceOfWorksheet 
    End Sub 

Таким образом, в этом случае, когда вы активировали команду UndoLastMacro, вы бы эффективно «восстановить» версию рабочего листа вы имели до последнего Macro называется.

Мой вопрос: какой тип переменной должен быть InstanceOfWorksheet, и каким будет самый простой способ скопировать содержимое InstanceOfWorksheet в текущий рабочий лист?

Заранее благодарен! :)

+0

Вам нужно больше, чем одну переменные для этого, переменного диапазона и переменного массив с типом данными 'Variant' для хранения значений целевого диапазона. Это предполагает, что ваши изменения относятся только к значениям. Если формулы, форматирование и т. Д. Также изменены, это намного сложнее. – Miqi180

+1

С другой стороны, более простой и безопасный подход состоял бы в том, чтобы сделать временную копию рабочего листа, который удаляется, если при внесении изменений ошибок не возникает. Используйте 'On error resume next' и удалите временную копию, если в конце' Err.Number = 0'. – Miqi180

+0

Возможно, вам лучше создать новый лист для хранения '.UsedRange.Formula'. VBA трудно отменить, если каждое изменение не регистрируется. Или просто сохраните копию рабочей книги в папку Temp? – PatricK

ответ

0

Я хотел бы сделать что-то вроде этого в коде

Sub Button_Click() 
    Dim TemporaryFileName as String 
    TemporaryFileName = "FileName" 'You can include a path here too like "C:\Wherever\FileName" 
    ThisWorkbook.SaveAs(TemporaryFileName) 
    ... (code to be run 
End Sub 

Sub Restore_Button_Click() 
    Workbooks.Open(TemporaryFileName) 
    ThisWorkbook.Close False ' Won't save. Maybe set to true if you don't want to lose it just yet 

End Sub 

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

Надеется, что это помогает

+2

SaveAs изменяет книгу на новое имя. SaveCopyAs было бы лучше, потому что он сохраняет копию без изменения имени книги. –

Смежные вопросы