excel - 尝试将 XLSM 保存为 CSV 时出现 "method saveas of object _workbook failed"错误

标签 excel vba csv runtime-error save-as

我正在尝试将启用宏的 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

有时会失败

Runtime Error 1004: method saveas of object _workbook failed**)

调试器指出:

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

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

  • 指定目录是一个字符串
  • 避免在文件名或文件夹中使用任何特殊字符(参见 here )
  • 将工作表复制粘贴为值,然后将其另存为 .csv(参见 here )
  • 使用 .csv 代码号指定文件格式(参见 here)
  • 禁用/重新启用部分提醒
  • 在 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

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

关于excel - 尝试将 XLSM 保存为 CSV 时出现 "method saveas of object _workbook failed"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28967762/

相关文章:

sql - 使用 SQL 查询导入具有重复列名的 CSV

excel - 如何将 Excel 单元格的内容设置为等于字符串变量?

vba - 如何在特定位置插入行

excel - 根据单元格值向用户窗体添加复选框

excel - 使用文本框确认输入

python - CsvReader 下一个函数

c# - 在 CsvHelper 中获取记录的长度

arrays - 使用 Azure 逻辑应用将 CSV 元素转换为单个数组

python - 使用 Xlsxwriter Python 应用第二个 conditional_format()

excel - Excel VBA 中是否提供 "Short"数据类型?