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

17

我正在尝试将带宏的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'失败**)

调试器指出:


(Note: The ** in the original text may be a footnote or special symbol, so I retained it in the translation.)
 ActiveWorkbook.SaveAs Filename:=SaveToDirectory & "My_Sheet" & ".csv", FileFormat:=xlCSV

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

  • 指定目录为字符串
  • 避免在文件名或文件夹中使用任何特殊字符(见这里
  • 在将表格另存为CSV之前将其复制粘贴为值(见这里
  • 使用.csv代码数字指定FileFormat(见这里
  • 禁用/重新启用某些警告
  • 添加其他字段到ActiveWorkbook.SaveAs行,例如密码、创建备份等等

即使如此,它可能会连续运行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

谢谢你们两个的回复。我现在没有时间尝试做这件事,明天会去做并回复你们。 - Riccardo
由于我的声望等级,我无法给你们两个点赞,但还是感谢你们的帮助。Degustaf的解决方案似乎起作用了!我测试了100多次,没有失败。我在上面的问题中添加了Degustaf回复中编辑和调整后的代码。出于某种原因,JMMach仍然导致问题。 - Riccardo
6个回答

7
我通常发现在这些情况下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

我会提醒你在保存工作簿之后将其恢复到原始名称,如果它仍然处于打开状态,但你已经在你的代码中设置了这一点。

4

这篇文章已经有一年了,但我会为未来的读者添加一些内容。

在Excel帮助中心中,你不会找到关于运行时错误1004的大量文档,因为微软认为这不是一个Excel错误。

上面的答案都是100%正确的,但有时了解问题的原因可以帮助你避免它、更早地修复它或更轻松地修复它。

这是一个间歇性故障,保存完整路径和文件名后就可以解决,这告诉我你的宏可能在自动文件恢复后尝试将.xlsb文件保存到自动恢复目录中。或者,你可能编辑了文件的路径或文件名。

你可以使用以下代码检查路径和文件名:

MsgBox ThisWorkbook.FullName

你应该在消息框中看到类似这样的东西:

C:\Users\Mike\AppData\Roaming\Microsoft\Excel\DIARY(version 1).xlxb

如果是这样,解决方法(如其他答案所述)是将文件保存到其正确的路径和文件名。这可以手动完成也可以使用VBA自动完成。

我现在养成了在任何自动恢复操作之后手动保存具有正确路径和文件名的文件的习惯,因为这只需要几秒钟,我发现这比其他方法更快(如果不是每天都需要)。因此,宏将不会在运行时遇到这个错误。请记住,虽然我手动保存.xlxb文件为.xlsm文件的习惯对于你提供工作表的新手来说无济于事。

关于超链接的说明

在出现这个错误之后:如果你的工作表中使用Ctrl+k创建了超链接,很可能在文件恢复后多个超链接中会出现"AppData\Roaming\Microsoft\"、"\AppData\Roaming\"、"../../AppData/Roaming/"或"....\My documents\My documents\"等内容。你可以通过将超链接附加到文本框上或使用HYPERLINK函数生成超链接来避免这些问题。

识别和修复它们有点更加复杂。

首先,检查超链接并确定每个错误的字符串和正确的字符串。随着时间的推移,我已经发现了好几种错误。

Excel没有在“特殊定位”菜单中提供搜索使用Ctrl+k创建的超链接的功能。

你可以在一个帮助列中自动识别出错误的超链接,并使用以下公式:

=OR(ISNUMBER(SEARCH("Roaming", Link2Text($C2),1)),ISNUMBER(SEARCH("Roaming", Link2Text($D2),1)))

在这里,“Link2Text”是用户定义函数。

函数 Link2Text(rng As Range) 的作用是将链接转换为文本。不要停用该函数。

该函数会查找 Z 列中包含“roaming”的超链接。

' Identify affected hyperlinks
    If rng(1).Hyperlinks.Count Then
    Link2Text = rng.Hyperlinks(1).Address
    End If

  End Function

以下是我纠错的 VBA 代码:

Sub Replace_roaming()

' 选择正确的工作表 Sheets("DIARY").Select


这段内容涉及 IT 技术,目的是让程序员了解如何使用 VBA 代码来更正错误。
Dim hl As Hyperlink
For Each hl In ActiveSheet.Hyperlinks
    hl.Address = Replace(hl.Address, "AppData\Roaming\Microsoft\", "")
Next
    For Each hl In ActiveSheet.Hyperlinks
    hl.Address = Replace(hl.Address, "AppData\Roaming\", "")
Next

    For Each hl In ActiveSheet.Hyperlinks
    hl.Address = Replace(hl.Address, "../../AppData/Roaming/", "..\..\My documents\")
Next
    For Each hl In ActiveSheet.Hyperlinks
    hl.Address = Replace(hl.Address, "..\..\My documents\My documents\", "..\..\My documents\")
Next

Application.Run "Recalc_BT"

' Move down one active row to get off the heading
    ActiveCell.Offset(1, 0).Select

' Check active row location
    If ActiveCell.Row = 1 Then
    ActiveCell.Offset(1, 0).Select
    End If

' Recalc active row
   ActiveCell.EntireRow.Calculate

' Notify
    MsgBox "Replace roaming is now complete."

End Sub

我建议您养成定期备份的习惯,不要仅依赖自动恢复功能。如果失败了,您将失去上次完整备份以来的所有数据。
在工作表容易出现问题时,应频繁备份,例如每小时或在导入新数据后备份。
以下快捷键可在几秒钟内备份您的工作表:按下Ctrl+O,[突出显示文件名],按下Ctrl+CCtrl+V,[ X ]。定期备份使您能够立即访问最近的备份,而无需从昨晚的备份文件中恢复,特别是如果您需要向另一个人请求此操作。

谢谢Mike,非常感激,即使现在! - Riccardo

1

距离上次回答已经有一段时间了,但我想分享一下今天的经历:

在几周的可靠运行之后,我突然遇到了相同的错误,而在保存工作簿的代码部分中没有做任何更改。

感谢之前的回答,我更新了我的saveas语句,从简单的语句:

wb.saveas strfilename

wb.saveas Filename:=strfilename, Fileformat:= xlWorkbookDefault

好的,它又起作用了。

有时候微软应用程序的行为真的很奇怪...


0

我遇到了类似的问题,但我的问题是我根据从工作簿中提取的字符串创建文件名,有时这些字符串会包含不能用于文件名的字符。 删除这些字符对我很有帮助!


0

尝试将路径和CSV文件名组合成一个字符串变量,并去掉.csv后缀;这由FileFormat处理。路径必须是以驱动器号或服务器名称开头的绝对路径: Dim strFullFileName as String strFullFileName = "C:\My Folder\My_Sheet" 如果在服务器上,则会类似于以下形式: strFullFileName = "\\ServerName\ShareName\My Folder\My_Sheet" 将ServerName替换为您的服务器名称,将ShareName替换为您的网络共享名称,例如\\data101\Accounting\My Folder\My_Sheet ActiveWorkbook.SaveAs Filename:=strFullFileName,FileFormat:=xlCSVMSDOS, CreateBackup:=False


0
对我来说,尽管设定为“自动”,但并非所有的公式都能够计算。我在左下角按了100次计算,然后奇迹般地就成功了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接