gpt4 book ai didi

vba - 如何处理 Workbook.SaveAs 覆盖确认上的 'No' 或 'Cancel'?

转载 作者:行者123 更新时间:2023-12-03 02:34:49 25 4
gpt4 key购买 nike

我希望在 VBA 脚本开始修改内容之前提示用户保存工作簿。当“另存为”对话框出现时,如果用户单击“取消”,我会引发自定义错误并停止脚本。如果他们单击“保存”并且文件名已存在,我希望询问他们是否覆盖。

这是我的代码:

Function SaveCurrentWorkbook(wkbSource As Workbook, strNewFileName As String) As Variant
If Not bolDebug Then On Error GoTo errHandler
Dim varSaveName As Variant

SaveAsDialog:
varSaveName = Application.GetSaveAsFilename(InitialFileName:=strNewFileName, FileFilter:="Excel Files (*.xls), *.xls")
If varSaveName <> False Then
wkbSource.SaveAs Filename:=varSaveName, ConflictResolution:=True, Addtomru:=True
Set SaveCurrentWorkbook = wkbSource
Else
SaveCurrentWorkbook = False
Err.Raise 11111, , "Save Canceled"
End If

exitProc:
Exit Function

errHandler:
Select Case Err.Number
Case 1004 'Clicked "No" or "Cancel" - can't differentiate
Resume SaveAsDialog
Case esle
MsgBox "File not saved. Stopping script.", vbOKOnly, Err.Description
Resume exitProc
End select

End Function

如果他们单击"is",则会覆盖它。如果他们单击“否”,我希望出现“另存为”对话框,以便他们可以选择新的文件名,但我收到了错误。如果他们单击“取消”,我希望发生错误并停止脚本。问题是我无法区分“否”和“取消”之间触发的错误。

有什么建议如何处理这个问题吗? (请原谅错误处理的任何不当使用 - 已经有一段时间了。)

附注该函数由另一个过程调用,因此如果用户在“另存为”对话框或“解决冲突”对话框中单击“取消”,我希望调用过程也停止。我想我可以通过检查 SaveCurrentWorkbook 返回的内容(Workbook 对象或 False)来做到这一点。

最佳答案

您可以简单地创建自己的“覆盖?”问题,如下所示:

Function SaveCurrentWorkbook(wkbSource As Workbook, strNewFileName As String) As Variant
If Not bolDebug Then On Error GoTo errHandler
Dim varSaveName As Variant

SaveAsDialog:

varSaveName = Application.GetSaveAsFilename(InitialFileName:=strNewFileName, FileFilter:="Excel Files (*.xls), *.xls")
If varSaveName <> False Then
If Len(Dir(varSaveName)) Then 'checks if the file already exists
Select Case MsgBox("A file named '" & varSaveName & "' already exists at this location. Do you want to replace it?", vbYesNoCancel + vbInformation)
Case vbYes
'want to overwrite
Application.DisplayAlerts = False
wkbSource.SaveAs varSaveName, ConflictResolution:=2, Addtomru:=True
Application.DisplayAlerts = True
Set SaveCurrentWorkbook = wkbSource
Case vbNo
GoTo SaveAsDialog
Case vbCancel
SaveCurrentWorkbook = False
Err.Raise 11111, , "Save Canceled"
End Select
Else
wkbSource.SaveAs varSaveName, ConflictResolution:=True, Addtomru:=True
Set SaveCurrentWorkbook = wkbSource
End If
Else
SaveCurrentWorkbook = False
Err.Raise 11111, , "Save Canceled"
End If

exitProc:
Exit Function

errHandler:
Select Case Err.Number
Case 1004 'Clicked "No" or "Cancel" - can't differentiate
Resume SaveAsDialog
Case Else
MsgBox "File not saved. Stopping script.", vbOKOnly, Err.Description
Resume exitProc
End Select

End Function

正如您所注意到的,“否”和“取消”之间没有区别(对于应用程序来说,因为它不会停止保存本身)。 Excel 只是对自己撒谎说:“我无法在此处保存”,并且在这两种情况下都会弹出相同的错误...因此唯一真正的解决方案是创建您自己的 msgbox :(

关于vba - 如何处理 Workbook.SaveAs 覆盖确认上的 'No' 或 'Cancel'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38386511/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com