VBA实现另存为带昨日日期的无宏xlsx文件报错400如何解决
核心问题点
SaveCopyAs方法仅会对原工作簿做完整镜像复制,不会转换文件格式。如果你的原文件是带宏的.xlsm格式,哪怕手动给副本改后缀为.xlsx,文件内部仍然保留宏代码结构,打开时必然触发「宏与后缀不匹配」的错误。- 报错400的两个高频诱因:
- 直接读取
Range("U8").Text作为文件名时,如果U8单元格的日期格式带/、:这类Windows文件名禁止的特殊字符,保存操作会直接被系统拦截。 SaveCopyAs本身不支持跨文件格式保存,强制传入不同格式的后缀名会直接抛错,给这个方法传FileFormat参数也不会生效,方法本身不支持该参数。
- 直接读取
可直接运行的解决方案
以下代码全程不改动你当前打开的宏文件,自动生成完全无宏的xlsx副本,文件名直接在VBA内部拼接,从根源避免非法字符问题:
Sub SaveNoMacroXlsxCopy() Dim savePath As String Dim saveFileName As String Dim newWb As Workbook ' 关闭屏幕更新和提示,避免操作闪屏、弹窗打断 Application.ScreenUpdating = False Application.DisplayAlerts = False ' 取当前宏文件所在的目录路径 savePath = ThisWorkbook.Path & "\" ' 拼接文件名:自定义前缀+昨日日期(用yyyy-mm-dd格式,无任何文件名非法字符) ' 要改自定义文件名直接修改下面"myfilename_"的内容即可 saveFileName = "myfilename_" & Format(Date - 1, "yyyy-mm-dd") & ".xlsx" ' 新建空白工作簿,默认不带任何宏 Set newWb = Workbooks.Add(xlWBATWorksheet) ' 将当前宏文件内的所有工作表完整复制到新工作簿 ThisWorkbook.Worksheets.Copy Before:=newWb.Sheets(1) ' 删除新工作簿自动生成的默认空白表 newWb.Sheets(newWb.Sheets.Count).Delete ' 将新工作簿保存为标准无宏xlsx格式(FileFormat:=51 对应xlsx格式) newWb.SaveAs _ Filename:=savePath & saveFileName, _ FileFormat:=xlOpenXMLWorkbook ' 关闭新生成的文件,回到原宏文件的操作界面 newWb.Close SaveChanges:=False ' 恢复Excel默认设置 Application.DisplayAlerts = True Application.ScreenUpdating = True End Sub
补充说明
- 如果你一定要读取U8单元格的内容作为文件名,必须先把内容里的
\ / : * ? " < > |这9个Windows文件名非法字符全部替换成短横线或下划线,再用于保存,不要直接用Text属性的返回值。 - 不要尝试用
SaveCopyAs实现格式转换,这个方法的设计定位就是做同格式的完整副本,没有格式转换能力。
内容的提问来源于stack exchange,提问作者Simao Golasew
相关产品推荐
相关产品推荐

