尝试将XLSM另存为CSV时出现“对象_workbook的方法另存为失败”错误

里卡多

我试图将启用宏的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

我用谷歌搜索,尝试了一些解决方案:

  • 指定目录是一个字符串
  • 避免在文件名或文件夹中使用任何特殊字符(请参见此处
  • 在将工作表另存为.csv之前,将其复制粘贴为值(请参见此处
  • 使用.csv代码号指定FileFormat(在此处查看
  • 禁用/重新启用某些警报
  • 在ActiveWorkbook.SaveAs行中添加其他字段,关于密码,创建备份等

尽管如此,它可能连续连续正确运行多达50-60次,然后在某些时候再次失败。

除了停止使用VBA / Excel之外,其他任何建议都将很快发生,但我暂时不能。

编辑:解决了由于德古斯塔夫的建议。我仅对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
德古斯塔夫

我通常发现这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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章