基于单元格引用保存含宏和窗体的工作簿副本问题求助
问题解决:保存带宏和窗体的工作簿副本并删除指定工作表
你的代码通过复制工作表创建新工作簿,这种方式不会复制工作簿级别的宏、窗体以及工作表之外的其他对象,所以新文件里没有宏和窗体。正确的做法是先保存原工作簿的完整副本,再在副本中删除不需要的工作表,这样所有宏、窗体都会保留。
修改后的代码
Sub SaveFileCopy() Dim FileName As String, FilePath As String Dim targetWB As Workbook Dim sheetToDelete As String ' 指定要删除的工作表名称,替换成你实际要删除的表名 sheetToDelete = "Reception Sheet" Set OldWorkBook = ThisWorkbook With Application .ScreenUpdating = False .DisplayAlerts = False .EnableEvents = False ' 避免触发工作簿事件干扰操作 End With On Error GoTo myerror ' 获取文件名和目标路径 With OldWorkBook.Sheets("Reception Sheet") FilePath = "C:\HDMS\JOBS\" & .Range("Z6").Value FileName = .Range("Z6").Value & ".xlsm" End With ' 目标文件夹不存在则创建 If Dir(FilePath, vbDirectory) = "" Then MkDir FilePath End If FilePath = FilePath & "\" ' 保存原工作簿的完整副本,保留所有宏和窗体 OldWorkBook.SaveCopyAs FilePath & FileName ' 打开副本工作簿 Set targetWB = Workbooks.Open(FilePath & FileName) ' 删除指定工作表(先检查是否存在) If WorksheetExists(sheetToDelete, targetWB) Then targetWB.Sheets(sheetToDelete).Delete End If ' 保存修改并关闭副本 targetWB.Save targetWB.Close False myerror: ' 恢复应用设置 With Application .ScreenUpdating = True .DisplayAlerts = True .EnableEvents = True End With ' 错误提示与清理 If Err <> 0 Then MsgBox "错误:" & Error(Err), vbExclamation, "错误提示" If Not targetWB Is Nothing Then If targetWB.Path <> "" Then targetWB.Close False End If End If End Sub ' 辅助函数:检查指定工作表是否存在于目标工作簿 Function WorksheetExists(sheetName As String, wb As Workbook) As Boolean Dim ws As Worksheet On Error Resume Next Set ws = wb.Sheets(sheetName) On Error GoTo 0 WorksheetExists = Not ws Is Nothing End Function
关键改动说明
- 用
SaveCopyAs直接保存原工作簿的完整副本,确保保留所有宏、窗体、自定义对象 - 打开副本后再删除指定工作表,避免复制工作表导致的对象丢失问题
- 增加工作表存在性检查,防止因目标工作表不存在触发错误
- 关闭工作簿事件触发,避免保存/打开过程中原有事件代码干扰操作
- 优化错误处理逻辑,确保异常时能正确恢复应用设置并清理资源
内容的提问来源于stack exchange,提问作者Hydra
相关产品推荐
相关产品推荐

