热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

尝试将XLSM另存为CSV时,获取"对象_workbook的方法保存失败"错误

如何解决《尝试将XLSM另存为CSV时,获取"对象_workbook的方法保存失败"错误》经验,为你挑选了1个好方法。

我试图通过这个宏保存一个(启用宏的)excel工作簿作为csv文件,覆盖旧的(下面我更改了文件夹和工作表的名称,但这似乎不是问题!):

 Sub SaveWorksheetsAsCsv()

 Dim SaveToDirectory As String
 Dim CurrentWorkbook As String
 Dim CurrentFormat As Long

 CurrentWorkbook = ThisWorkbook.FullName
 CurrentFormat = ThisWorkbook.FileFormat
 SaveToDirectory = "\MyFolder\"

 Application.DisplayAlerts = False
 Application.AlertBeforeOverwriting = False

 Sheets("My_Sheet").Copy

 ActiveWorkbook.SaveAs Filename:=SaveToDirectory & "My_Sheet" & ".csv", FileFormat:=xlCSV
 ActiveWorkbook.Close SaveChanges:=False
 ThisWorkbook.Activate

 ThisWorkbook.SaveAs Filename:=CurrentWorkbook, FileFormat:=CurrentFormat

 Application.DisplayAlerts = True
 Application.AlertBeforeOverwriting = True

 End Sub

奇怪的是,有时,但并非总是如此,它失败并且标题的错误消息(运行时错误1004:对象_workbook的方法saveas失败)弹出,调试器指出我这一行:

 ActiveWorkbook.SaveAs Filename:=SaveToDirectory & "My_Sheet" & ".csv", FileFormat:=xlCSV

我google了它,显然它确实发生了很多人和我尝试的一些解决方案:

指定目录是字符串

避免文件名或文件夹中的任何特殊字符(见此处)

复制粘贴工作表作为值,然后将其保存为.csv(在此处可见)

使用.csv代码编号指定FileFormat(在此处可见)

禁用/重新启用某些警报

在ActiveWorkbook.SaveAs行中添加其他字段,关于密码,创建备份etcetc

尽管如此,它可能连续正常运行50-60次,然后在某一点再次失败.

我可以查找任何建议或事情来解决这个问题(除了停止使用VBA/Excel执行此任务,这将很快发生,但我现在不能).

在此先感谢您的时间.

编辑:解决了感谢Degustaf的建议.我只对Degustaf建议的代码做了两处修改:

ThisWorkbook.Sheets代替CurrentWorkbook.Sheets

FileFormat:= 6而不是FileFormat:= xlCSV(显然对excel的不同版本更健壮)

Sub SaveWorksheetsAsCsv()

Dim SaveToDirectory As String
Dim CurrentWorkbook As String
Dim CurrentFormat As Long
Dim TempWB As Workbook

Set TempWB = Workbooks.Add

CurrentWorkbook = ThisWorkbook.FullName
CurrentFormat = ThisWorkbook.FileFormat
SaveToDirectory = "\\MyFolder\"

Application.DisplayAlerts = False
Application.AlertBeforeOverwriting = False

ThisWorkbook.Sheets("My_Sheet").Copy Before:=TempWB.Sheets(1)
ThisWorkbook.Sheets("My_Sheet").SaveAs Filename:=SaveToDirectory & "My_Sheet" & ".csv", FileFormat:=6
TempWB.Close SaveChanges:=False

ThisWorkbook.SaveAs Filename:=CurrentWorkbook, FileFormat:=CurrentFormat
ActiveWorkbook.Close SaveChanges:=False

Application.DisplayAlerts = True
Application.AlertBeforeOverwriting = True
End Sub

Degustaf.. 5

我通常发现这ActiveWorkbook是这些情况下的问题。我的意思是说您以某种方式没有选择该工作簿(或任何其他工作簿),而Excel不知道该怎么办。不幸的是,由于copy不返回任何内容(复制的工作表会很不错),因此这是解决此问题的一种标准方法。

因此,我们可以采用这种方式,即如何将工作表复制到新工作簿中,并获得对该工作簿的引用。我们可以做的是创建新工作簿,然后复制工作表:

Dim wkbk as Workbook

Set Wkbk = Workbooks.Add
CurrentWorkbook.Sheets("My_Sheet").Copy Before:=Wkbk.Sheets(1)
Wkbk.SaveAs Filename:=SaveToDirectory & "My_Sheet" & ".csv", FileFormat:=xlCSV
Wkbk.Close SaveChanges:=False

或者,在这种情况下有更好的方法:WorkSheet支持该SaveAs方法。无需复制。

CurrentWorkbook.Sheets("My_Sheet").SaveAs Filename:=SaveToDirectory & "My_Sheet" & ".csv", FileFormat:=xlCSV

如果工作簿保持打开状态,我将警告您此后将其重新保存为原始名称,但是您的代码中已经包含了该工作簿。



1> Degustaf..:

我通常发现这ActiveWorkbook是这些情况下的问题。我的意思是说您以某种方式没有选择该工作簿(或任何其他工作簿),而Excel不知道该怎么办。不幸的是,由于copy不返回任何内容(复制的工作表会很不错),因此这是解决此问题的一种标准方法。

因此,我们可以采用这种方式,即如何将工作表复制到新工作簿中,并获得对该工作簿的引用。我们可以做的是创建新工作簿,然后复制工作表:

Dim wkbk as Workbook

Set Wkbk = Workbooks.Add
CurrentWorkbook.Sheets("My_Sheet").Copy Before:=Wkbk.Sheets(1)
Wkbk.SaveAs Filename:=SaveToDirectory & "My_Sheet" & ".csv", FileFormat:=xlCSV
Wkbk.Close SaveChanges:=False

或者,在这种情况下有更好的方法:WorkSheet支持该SaveAs方法。无需复制。

CurrentWorkbook.Sheets("My_Sheet").SaveAs Filename:=SaveToDirectory & "My_Sheet" & ".csv", FileFormat:=xlCSV

如果工作簿保持打开状态,我将警告您此后将其重新保存为原始名称,但是您的代码中已经包含了该工作簿。


推荐阅读
author-avatar
很呆很傻很天真2010_545
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有