2016-04-19 2 views
0

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

Я разместил это в ThisWorkbook Объект книги, который я хочу в версии.

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) 
    Dim fso 
    Dim nme As String, rootDir As String 
    Dim ver As Integer 

    Set fso = CreateObject("Scripting.FileSystemObject") 

    With ThisWorkbook 
     nme = fso.GetBaseName(.Name) 
     rootDir = fso.getfolder(.Path) 
     On Error Resume Next 
     ver = CInt(Trim(Right(nme, Len(nme) - InStr(1, nme, " v", vbTextCompare) - 1))) + 1 
     On Error GoTo 0 
     nme = "GNOC into CPT DE" ' Trim(Left(nme, InStr(1, nme, " v", vbTextCompare))) 

     .SaveAs Filename:=rootDir & "\" & nme & " v" & Format(ver, "000"), FileFormat:=xlOpenXMLWorkbookMacroEnabled 
    End With 
End Sub 
+0

Вероятно потому, что вы экономите в два раза? Почему вы не можете просто «wb.saveas filename: = blah blah» в суб? – findwindow

ответ

0

Вы собираетесь войти в бесконечный цикл с вашей текущей настройки (перед пользователем инициированного сохранить макрос вызывает SaveAs обновить версию, но это снова вызывает метод BeforeSave событие, вновь ссылаясь на макрос , и так далее).

Чтобы обойти это, вам нужна блокирующая переменная. В объекте ThisWorkbook создайте переменную, для удобства я назову ее Block, как булев. С установленным событием Open Block to False. Добавьте следующий между вашими декларациями & вы Set:

If Not Block Then 
    Block = True 

Отступа всего кода, за исключением End Sub. Между End With & End Sub вставки:

Block = False 
End If 'No Else case needed as nothing special should happen if block is true 

Это должно быть.

+0

Итак, вы используете глобальную переменную для ее включения и выключения? Нет ли способа прервать первоначальное сохранение, которое запускает событие? – Tom

+0

Yup, ничего симпатичного, но это просто и эффективно. Единственный способ, которым я знаю прерывать инициирование пользователя, - это событие «BeforeSave». – JMichael

+0

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

0

Я думал об этом немного больше и придумал, после чего работает отлично

Использование Cancel = True Я отменить сохранение, который был инициирован пользователем, а затем отключить события можно сохранить без повторного запуска этого мероприятие. А потом я версионности для моего Excel Dev работы


Option Explicit 
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) 
    Dim fso 
    Dim nme As String, rootDir As String 
    Dim ver As Integer 

    Cancel = True 

    Set fso = CreateObject("Scripting.FileSystemObject") 

    With ThisWorkbook 
     nme = fso.GetBaseName(.Name) 
     rootDir = fso.getfolder(.Path) 
     On Error Resume Next 
     ver = CInt(Trim(Right(nme, Len(nme) - InStr(1, nme, " v", vbTextCompare) - 1))) + 1 
     On Error GoTo 0 
     nme = Trim(Left(nme, InStr(1, nme, " v", vbTextCompare))) 
     Application.EnableEvents = False 
     .SaveAs Filename:=rootDir & "\" & nme & " v" & Format(ver, "000"), FileFormat:=xlOpenXMLWorkbookMacroEnabled 
     Application.EnableEvents = True 
    End With 
End Sub 
Смежные вопросы