使用SaveAs加密保存Excel工作表的VBA代码异常求助
解决你的VBA保存带密码文件的异常问题
嘿,你的代码核心逻辑没问题,但这两个奇怪的异常都是因为处理新工作簿时的小疏忽导致的。下面给你修复后的代码,以及问题原因的解释:
修复后的完整代码
Dim ws As Worksheet Dim newWB As Workbook For Each ws In ThisWorkbook.Worksheets ' 如果你只需要处理前7个工作表,保留这个判断;要处理所有表的话可以删掉 If ws.Index <= 7 Then ws.Copy Set newWB = ActiveWorkbook ' 显式引用新工作簿,避免ActiveWorkbook的不确定性 ' 先修改新工作簿名称,解决密码弹窗的奇怪文本问题 newWB.Name = ws.Index & ".xlsx" ' 带密码保存——用命名常量让代码更易读 newWB.SaveAs Filename:=ThisWorkbook.Path & "\" & ws.Index & ".xlsx", _ FileFormat:=xlOpenXMLWorkbook, _ Password:="XXX" ' 关闭工作簿(已经保存过,SaveChanges:=False没问题) newWB.Close SaveChanges:=False Set newWB = Nothing ' 清理对象引用 End If Next ws
原代码异常的原因说明
1. 生成的文件未正确关闭(看起来像点击图标自动打开)
其实正常点击Excel文件图标本来就会打开,我猜你遇到的是代码运行后,新生成的工作簿没有自动关闭。原代码里用ActiveWorkbook存在隐患:如果运行过程中有其他工作簿意外激活,ActiveWorkbook.Close就会关闭错误的文件,导致复制出来的新工作簿留在打开状态。通过把新工作簿赋值给newWB变量,就能确保我们操作和关闭的是刚创建的那个文件,避免这种问题。
2. 密码弹窗显示额外的“copy of && is protected”文本
当你用Sheets(i).Copy创建新工作簿时,Excel会自动给它一个临时标题Copy of [原工作表名称]。设置打开密码时,Excel会把这个临时标题带到提示框里,就出现了那段多余的奇怪文本。在保存前先把新工作簿的名称改成你要保存的文件名,就能替换掉这个临时标题,密码弹窗就会显示正确的文件名了。
内容的提问来源于stack exchange,提问作者Angelo C
相关产品推荐
相关产品推荐

