我试图写一个小脚本来保存我正在处理的文件,这样做会增加它上面的版本号。当我从普通groupby
调用它时,我有一个正常运行的脚本,但只要我将它放入Sub
事件中,整个应用程序就会崩溃。
我已将此放在我想要版本的工作簿的BeforeSave
对象中。
ThisWorkbook
答案 0 :(得分: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
应该是它。
答案 1 :(得分:0)
我考虑了这个问题,并提出了以下完美的工作原理
使用Cancel = True
我取消了用户启动的保存,然后通过禁用我可以保存的事件而不重新触发此事件。然后我为我的Excel开发工作进行版本控制
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