另存为失败的 Excel VBA
Posted
技术标签:
【中文标题】另存为失败的 Excel VBA【英文标题】:Save As failed Excel VBA 【发布时间】:2012-07-06 14:19:16 【问题描述】:-总结: 我正在尝试编写将自动以当前日期名称保存的代码
-问题:当编译器到达保存的行时,错误提示“对象'_Workbook'的方法'SaveAs'失败”。其他一切都有效。为了参考,我展示了整个函数。
Function createRecord()
Dim rowCount As Integer
Dim theDate As Date
theDate = Format(Now(), "MM-DD-YY")
Sheets("New Data").Select
Cells.Select
Selection.Copy
Sheets.Add After:=Sheets(Sheets.Count)
Application.ActiveSheet.Name = "ChaseHistory"
ActiveSheet.Paste
rowCount = ActiveSheet.UsedRange.Rows.Count
Sheets("Exceptions").Select
'rowCount = ActiveSheet.UsedRange.Rows.Count
Application.CutCopyMode = False
ActiveSheet.UsedRange.Rows.Select
Selection.Copy
Sheets("ChaseHistory").Select
ActiveSheet.Range("A" & rowCount + 2).Select
ActiveSheet.Paste
Range("A1").Select
Cells.Select
Selection.Copy
ChDir "Z:\Customer_Service_Accounting\REPORTING & CONTROLS TEAM\Book And Balance_Katie\Chase Booking History" 'loads the crystal report
Workbooks.Open Filename:= _
"Z:\Customer_Service_Accounting\REPORTING & CONTROLS TEAM\Book And Balance_Katie\Chase Booking History\Do_Not_Delete.xlsx"
Windows("Do_Not_Delete").Activate
ActiveSheet.Paste
Application.DisplayAlerts = False
'---------------This is the problem child-------------- 'SAVING WORKBOOK
ActiveWorkbook.SaveAs Filename:="Z:\Customer_Service_Accounting\REPORTING & CONTROLS TEAM\Book And Balance_Katie\Chase Booking History\" & CStr(theDate), FileFormat:= _
xlNormal, Password:="", WriteResPassword:="", ReadOnlyRecommended:=False _
, CreateBackup:=False
Application.DisplayAlerts = True
End Function
-我在日期的转换为字符串方法中添加了,因为我认为这可能会导致问题,但结果相同。如果您在这里发现任何问题,请告诉我。谢谢!
【问题讨论】:
【参考方案1】:问题:因为在我的代码中我禁用了来自 excel 的提示,当我尝试保存时,我没有看到提示告诉我我正在尝试以不正确的格式保存。
总的来说,Excel 不喜欢我的文件名中有反斜杠(“/”)(我真的应该知道)
解决方法:我最终使用了以下语句:
ActiveWorkbook.SaveAs Filename:="Z:...\" & "Chase " & _
Month(theDate) & "_" & Day(theDate) & "_" & Year(theDate) & ".xlsx"
所以我在这里真正做的只是将月、日和年放在一个用下划线分隔的字符串中,以避免邪恶的反斜杠。
感谢您的帮助加菲!
【讨论】:
别忘了您可以接受自己的答案。另外,如果你想减少行的长度,你可以使用replace(theDate,"/","_")
@SeanCheshire 谢谢,我忘了选择已解决的答案。好评:D【参考方案2】:
你尝试过这样的事情吗?
ActiveWorkbook.SaveAs Filename:="Z:\Customer_Service_Accounting\REPORTING & CONTROLS TEAM\Book And Balance_Katie\Chase Booking History\" & Format(theDate, "mm.dd.yy"), FileFormat:= _
xlNormal, Password:="", WriteResPassword:="", ReadOnlyRecommended:=False _
, CreateBackup:=False
突出显示:我将CStr(theDate)
更改为Format(theDate, "mm.dd.yy") & ".xlsx"
,但如果需要,您可以使用其他格式。
解释:
theDate
的类型为Date
(参见:Dim theDate As Date
),因此当您使用CStr()
时,返回的是一个完整的日期/时间格式字符串。这将导致如下结果:
Debug.Print CStr(Now())
7/6/2012 7:23:38 AM
这可能会导致您的系统拒绝文件名中的无效字符。
【讨论】:
我已经格式化了上面的日期。你认为内联格式会有帮助吗? 将日期调暗为日期 theDate = Format(Now(), "MM-DD-YY") @MikeKellogg 我确实看到了 - 你的代码在这方面应该很好。但是,我还添加了文件扩展名。我没有测试所有选项,但这也可能与它有关。 啊,这是一个好点。让我尝试使用文件扩展名 @MikeKellogg 尽管您的theDate = Format(Now(), "MM-DD-YY")
解决了这个问题,但它这样做是巧合。您不能将格式存储在Date
类型的变量中。您的代码所做的是在截断时间的同时将日期转换为字符串,然后将字符串解析回Date
。所有这些都是错误和脆弱的,如果当前系统日期格式 a) 与 MM-DD-YY
不同(从字符串读回时将交换月份和日期)或 b) 没有省略全为零的时间部分(将无论如何输出时间到文件名中)。生成文件名时只保留Format
。以上是关于另存为失败的 Excel VBA的主要内容,如果未能解决你的问题,请参考以下文章