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

问题描述 投票:9回答:3

我正在尝试将启用宏的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搜索并尝试了一些解决方案:

  • 指定目录是字符串
  • 避免文件名或文件夹中的任何特殊字符(见here
  • 复制粘贴工作表作为值,然后将其保存为.csv(见here
  • 使用.csv代码编号指定FileFormat(见here
  • 禁用/重新启用某些警报
  • 在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
excel vba csv runtime-error save-as
3个回答
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

我会警告你之后将工作簿保存为原始名称,如果它保持打开状态,但你已经在代码中已经有了。


3
投票

这是一年了,但我会为未来的读者添加一些东西

您不会在运行时错误1004的Excel帮助中找到大量文档,因为Microsoft不认为它是Excel错误。

上面的答案是100%有效,但有时它有助于了解导致问题的原因,以便您可以避免它,更早地修复它或更容易修复它。

事实上,这是一个间歇性故障,并通过保存完整路径和文件名来修复,这告诉我,您的宏可能正在尝试在自动文件恢复后将.xlsb文件保存到autorecover目录。

或者,您可能自己编辑了文件的路径或文件名。

您可以使用以下命令检查路径和文件名: - MsgBox ThisWorkbook.FullName

您应该在消息框中看到类似的内容。

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

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

我现在习惯在任何自动恢复操作之后手动保存具有正确路径和文件名的文件,因为它需要几秒钟而且我发现它更快(如果这不是每天发生)。因此,宏运行时不会遇到此错误。请记住,虽然我习惯在恢复后立即手动将.xlxb文件保存到.xlsm文件,但这对您提供工作表的新手没有帮助。

关于超链接的说明

出现此错误后:如果您的工作表中的超链接很可能是使用Ctrl + k创建的,那么您将拥有类似“AppData \ Roaming \ Microsoft \”,“\ AppData \ Roaming \”,“../../ AppData /漫游/“或”.... \我的文档\我的文档\“在文件恢复后的多个超链接中。您可以通过将超链接附加到文本框或使用HYPERLINK函数生成它们来避免这些。

识别和修复它们有点复杂

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

Excel不会在“转到特殊”菜单中提供设施来搜索使用Ctrl + k创建的超链接。

您可以自动识别辅助列中的错误超链接,例如Z列并使用公式

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

其中Link2Text是UDF

函数Link2Text(作为范围)作为字符串'不要停用。 '找到Z列中包含'漫游'的超链接。

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

  End Function

我的VBA纠正错误如下

Sub Replace_roaming()

'选择正确的表格(“DIARY”)。选择

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 + C,Ctrl + V,[X]。定期备份允许您立即转到最近的备份,而无需从昨晚的备份文件中恢复,特别是如果您必须请求其他人执行此操作。


0
投票

尝试将Path和CSV文件名组合成一个字符串变量并删除.csv;由FileFormat处理。路径必须是绝对的,以驱动器号或服务器名称开头:Dim strFullFileName as String strFullFileName = "C:\My Folder\My_Sheet"如果在服务器上,那么它看起来像这样:strFullFileName = "\\ServerName\ShareName\My Folder\My_Sheet" Substiture ServerName与您的服务器名称和替换ShareName与您的网络共享名称,例如\\data101\Accounting\My Folder\My_Sheet ActiveWorkbook.SaveAs Filename:=strFullFileName,FileFormat:=xlCSVMSDOS, CreateBackup:=False

© www.soinside.com 2019 - 2024. All rights reserved.