Как вернуть исходный файл после выполнения всех операций над файлом Excel с помощью VBA? - PullRequest
4 голосов
/ 09 августа 2011

Может ли кто-нибудь сказать мне, как мне отменить все мои изменения в моей книге?У меня есть файл excel1.xlsx, и я сделал сортировку и много операций над excel.xlsx, используя vba.Но в конце я хочу, чтобы файл excel1.xlsx был таким же, какой был в начале.Как мне отменить все мои изменения с помощью vba?

 activeworkbook.saved = True

Я обнаружил, что он сохраняет все содержимое, как в начале, но он не работает. Есть ли какая-либо команда, где я могу вернуть свой оригиналфайл после выполнения операций над ним.Хорошо, да

              wb1.Sheets(1).Activate
              ActiveWorkbook.Close savechanges:=False

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

Ответы [ 4 ]

4 голосов
/ 09 августа 2011

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

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

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

Как проверить: Поместите некоторые данные и значение в исходный лист, затем запустите подпрограмму Test ()!

Public backupSheet As Worksheet
Public originalSheet As Worksheet
Public originalSheetName As String

Sub CreateBackup()
    Set originalSheet = Application.ActiveSheet
    originalSheetName = originalSheet.Name
    originalSheet.Copy After:=Sheets(Application.Worksheets.Count)
    Set backupSheet = Application.ActiveSheet
    backupSheet.Name = "backup"
    originalSheet.Activate
End Sub

Sub RestoreBackup()
    Application.DisplayAlerts = False
    originalSheet.Delete
    backupSheet.Name = originalSheetName
    Application.DisplayAlerts = True
End Sub

Sub ZerosFromHell()
    Range("A1:Z100").Select
    Cells.Value = 0
End Sub

Sub Test()
    Call CreateBackup
    Call ZerosFromHell
    MsgBox "look at all those darn 0s!"
    Call RestoreBackup
End Sub
3 голосов
/ 09 августа 2011

Краткий ответ: вы не можете. К сожалению.

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

Может показаться, что правильно сделать: выполнить работу на основе VBA на копии листа и удалить / не сохранять эту копию, если вы не хотите сохранять изменения (и снова открыть оригинал). если вам нужно это сделать). Но из твоего вопроса звучит так, будто ты не хочешь этого делать.

Ваша единственная альтернатива - написать собственную процедуру VBA, которая отслеживает все сделанные вами изменения. В зависимости от того, какие операции вы выполняли, их отмена может быть смехотворно сложной задачей по сравнению с простым закрытием без сохранения и повторного открытия. Но если вы настаиваете, во что бы то ни стало, вырубитесь!

1 голос
/ 22 сентября 2011
  1. Сохраните копию оригинальной книги до запуска макроса.используя метод .SaveAs в начале подпрограммы.
  2. Запустите подпрограмму макроса VBA в исходной книге.
  3. Теперь есть второй макрос «Отменить изменения VBA», который открывает копию книги.из шага (1), закрывает книгу, запустившую макрос в шаге (2), и вызывает метод .SaveAs, снова перезаписывая существующую книгу из шага (2).

Примечание: для полученияДля того, чтобы эта UndoMacro работала, вам нужно будет поместить ее в надстройку или отдельную рабочую книгу (надстройка чище).Это позволит вам запустить метод .SaveAs и перезаписать оригинальную книгу из шага (2), которая в этот момент будет закрыта, чтобы предотвратить появление сообщения об ошибке во время выполнения VBA.

0 голосов
/ 28 января 2018

Если все ваши данные организованы правильно, это работает довольно хорошо.Как и в случае с OP, мне нужно было вернуться к исходному состоянию файла Excel, и мне не хотелось перезагружать исходный файл (загрузка занимает около 25 секунд из-за устаревшей инфраструктуры и медленных компьютеров).

Я сделал, чтобы скопировать все данные в массив вариантов, выполнить всю мою обработку в рабочую книгу, а затем записать массив вариантов в файл Excel (данные находятся на рабочем листе под названием «Данные»."и начинается со строки 2 и использует столбцы от A до Z).Хотя для этого требуется немного оперативной памяти, чтение / запись происходит практически мгновенно.Соответствующий код:

Dim varDataArray As Variant, wb As Workbook, ws As Worksheet, lngEndRow as Long

Set wb = ThisWorkbook
Set ws = ThisWorkbook.Worksheets("Data")

With ws
 ' This simply finds the last row with data
 lngEndRow = .Cells.Find("*", [A1], , , xlByRows, xlPrevious).Row
 ' This reads all cell data from A2 to Z###, where ### is the last row
 varDataArray = .Range("A2:Z" & lngNumberOfRows).Value

 ... do things ...

 ' This writes all the data back to Excel
 ' 26 is the numeric column equivalent to "Z"
 .Range("A2").Resize(lngEndRow, 26) = varDataArray

End With
...