我正在使用代码(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
问题是,当我从功能区栏中选择“文件”,然后选择“另存为”时,我在这里结束: ...一切正常,直到我单击“保存”按钮。我的代码假定您尚未输入新文件名,因此会提示您输入“另存为”的名称和位置。只要用户不使用“文件” |“另存为”,这将完全按计划进行。从快速启动或自定义功能区使用“另存为”按钮效果很好。
所以我的问题是,使用File | SaveAs不会触发BeforeSave事件,直到输入新文件名和/或选择新位置并单击File | SaveAs屏幕上的i保存按钮。在“文件另存为”屏幕中,我已经可以选择其中一个或两个,但是BeforeSave事件对此一无所知,它的触发就像我单击“快速启动”按钮并且尚未输入新名称一样。或选择一个新位置。因此,用户最终输入了新的文件名/位置,然后单击“保存”,然后再次提示输入新的文件名/位置。因此,我正在寻找以下两种解决方案之一:
答案 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。