无法使用VBA保存非共享版本的Excel工作簿

时间:2014-08-07 15:55:05

标签: excel vba excel-vba

我每次保存文件时都试图保存共享excel文件的版本。我希望文件不共享,没有VBA宏。我目前使用的代码如下:

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)

Dim x As String, y As String, z As String
x = "Enable Autosave"
y = Now()
z = "C:\Users\.....\MTMtest-" & Format(y, "mm-dd-yy hhmm") & ".xls"

If Sheet3.Cells(1, 5).Value = x Or Sheet4.Cells(1, 5).Value = x Or Sheet5.Cells(1, 5).Value = x Or Sheet6.Cells(1, 5).Value = x Then

        ActiveWorkbook.SaveCopyAs (z)

    If ActiveWorkbook.MultiUserEditing Then
        Application.Workbooks.Open (z)
        Workbooks("MTMtest-" & Format(y, "mm-dd-yy hhmm") & ".xls").Activate
        ActiveWorkbook.ExclusiveAccess
        ActiveWorkbook.Save
        ActiveWorkbook.Close
    End If

End If

End Sub

当我保存共享文件时,我会弹出一个问题,询问是否要从共享使用中删除工作簿。当我点击“是”时,我发出错误:运行时错误' 1004' Microsoft Excel无法访问该文件。单击“结束”会获取一个非共享副本,但它仍处于打开状态。

关闭副本并尝试关闭原始文件后,我收到错误:文件被锁定。这迫使我用任务管理器关闭原文。

我的问题是:如何让这个程序只保存当前工作簿的非宏,非共享副本?

1 个答案:

答案 0 :(得分:0)

由于缺少更好的替代方法,您可以首先使用savecopyas方法将工作簿保存为Macroenabled工作簿 - 然后打开此副本并保存为macrofree工作簿,这要归功于saveas方法,并删除副本。

由于某些原因我无法正确表达,在此上下文中直接在原始工作簿上使用saveas方法似乎是一个问题 - 特别是这会触发原始工作簿在中间关闭BeforeSave事件之前和工作簿实际上有机会获得保存。我上面建议的中间复制是一种解决方法。

查看此代码,该代码适用于支持Open XML宏的工作簿 - 似乎在我的最终工作正常。

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)

    Dim wb As Workbook

    ThisWorkbook.SaveCopyAs ThisWorkbook.Path & "\backup.xlsm"

    Set wb = Workbooks.Open(ThisWorkbook.Path & "\backup.xlsm")

    Application.DisplayAlerts = False
    Application.EnableEvents = False

    wb.SaveAs filename:=ThisWorkbook.Path & "\backup.xlsx", _
    FileFormat:=xlOpenXMLWorkbook, AccessMode:=xlExclusive

    Application.EnableEvents = True
    Application.DisplayAlerts = True

    wb.Close

    Kill ThisWorkbook.Path & "\backup.xlsm"

End Sub