【问题标题】:How to prevent the user from saving a file to any directory except one specific location?如何防止用户将文件保存到除一个特定位置之外的任何目录?
【发布时间】:2018-08-31 19:32:09
【问题描述】:

我正在编写代码 (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

当我从功能区栏中选择“文件”,然后选择“另存为”时,我会在此处结束:

当我单击“保存”按钮时,我的代码假定我尚未输入新文件名,因此它会提示输入“另存为”名称和位置。只要用户不使用文件|另存为,它就可以工作。使用快速启动或自定义功能区中的另存为按钮有效。

我的问题是,在您输入新文件名和/或选择新位置并单击“文件|另存为”屏幕上的“保存”按钮之前,使用“文件|另存为”不会触发 BeforeSave 事件。在文件|另存为屏幕中,我已经可以选择其中一个或两个,但是 BeforeSave 事件对此一无所知,它就像我单击了快速启动按钮并且尚未输入新名称一样触发或选择了一个新位置。用户输入新的文件名/位置,点击保存并再次提示输入新的文件名/位置。

我正在寻找两种解决方案之一:

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

【问题讨论】:

    标签: excel vba


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      C#代码如下

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

      在 VBA 中

      Application.GetSaveAsFilename
      

      【讨论】:

        【解决方案3】:

        在工作表上放置一个按钮并强制用户独占使用该按钮。

        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。

        【讨论】:

        • 他们仍然可以通过使用可以调用 SaveAs 的多种方式中的任何一种来解决这个问题。目标是防止他们以任何方式执行另存为,除非文件保存在正确的目录中。仅供参考 - 我有在打开时触发的代码,如果文件位于任何位置,但可以正确处理将文件移到 Excel 之外,它会阻止文件被打开。
        • @FrankBall 实际上这不是真的;代码将在 SaveAs 上运行。解决这个问题的唯一方法是编辑代码。如果我错了,请告诉我怎么做。如果不触发 Msgbox 和 Cancel,我无法执行任何 SaveAs。
        • 当然,如果宏被禁用,那么这将不起作用。当然不是万无一失,但它确实有效。
        • 我的错误。我明白你现在在做什么(我错过了全局变量部分),虽然它会起作用,但我的用户不会接受这种解决方案。他们在 Excel 方面非常称职,并且非常习惯于文件|另存为或使用快速启动或自定义功能区按钮来执行此类操作,因此让他们必须使用自定义按钮(我个人认为应该可以接受)会引发投诉邮件风暴。如果您对您的答案进行编辑,我将取消投票。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-30
        • 1970-01-01
        • 2017-01-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多