Excel VBA BeforeSave事件

时间:2018-08-31 19:32:09

标签: excel-vba

我正在使用代码(Excel 2016),以防止用户将文件保存到除一个特定位置以外的任何目录中。我正在按以下方式使用BeforeSave事件:

    Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    Dim NamePath As String
    On Error GoTo Final
'    If Saving Then Exit Sub
    If SaveAsUI = True Then
        Cancel = True
        Application.EnableEvents = False
        NamePath = Application.GetSaveAsFilename(InitialFileName:=ActiveWorkbook.Name, FileFilter:="Excel Files (*.xlsm), *.xlsm")
        If NamePath = "False" Then Exit Sub
        If InStr(1, NamePath, "H:\SSV\WORK\Workcenter Safety Modification Tracking Files", vbTextCompare) = 0 Then
            MsgBox "You cannot save to another directory."
            GoTo Final
        Else
            Me.SaveAs NamePath
            GoTo Final
        End If
    End If
Final:
    Application.EnableEvents = True
End Sub

问题是,当我从功能区栏中选择“文件”,然后选择“另存为”时,我在这里结束: enter image description here ...一切正常,直到我单击“保存”按钮。我的代码假定您尚未输入新文件名,因此会提示您输入“另存为”的名称和位置。只要用户不使用“文件” |“另存为”,这将完全按计划进行。从快速启动或自定义功能区使用“另存为”按钮效果很好。

所以我的问题是,使用File | SaveAs不会触发BeforeSave事件,直到输入新文件名和/或选择新位置并单击File | SaveAs屏幕上的i保存按钮。在“文件另存为”屏幕中,我已经可以选择其中一个或两个,但是BeforeSave事件对此一无所知,它的触发就像我单击“快速启动”按钮并且尚未输入新名称一样。或选择一个新位置。因此,用户最终输入了新的文件名/位置,然后单击“保存”,然后再次提示输入新的文件名/位置。因此,我正在寻找以下两种解决方案之一:

  1. 限制用户保存文件位置的另一种方法。
  2. 将文件名/位置从上述“文件|另存为”屏幕传递到BeforeSave事件中的方法。

3 个答案:

答案 0 :(得分:0)

我可能是错的,但是当他们选择新位置时,它可能会更改当前工作目录-在这种情况下,使用CurDir可能会有所帮助

答案 1 :(得分:0)

Application.GetSaveAsFilename()将返回另存为在文件->另存为中选择的文件路径。

C#代码在下面

Object obj = Application.GetSaveAsFilename();
if(obj != null)
{
   string filePath = obj.ToString();
}

在VBA中

Application.GetSaveAsFilename

答案 2 :(得分:-1)

在页面上放置一个按钮,并强制用户仅使用该按钮。

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    If not DoingSave then
        Msgbox("You must save using the button")
        Cancel = True
    End If
End Sub

当用户使用按钮进行保存时,请在保存之前将DoingSave设置为True,然后再将其设置为False。