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

Getting "method saveas of object _workbook failed" error while trying to save an XLSM as CSV

我正在尝试将启用宏的 Excel 工作簿另存为 csv 文件,覆盖旧的(下面我不得不更改文件夹的名称和 Sheet,但是这似乎不是问题)。

 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

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

不过,它可能 运行 连续正确多达 50-60 次,然后在某个时候再次失败。

任何建议,除了停止使用 VBA/Excel 完成此任务,这将很快发生,但我现在不能。

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


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 没有 return 任何东西(复制的作品 sheet 会很好),这是解决此问题的标准方法。

所以,我们可以解决这个问题,因为我们如何将这个 sheet 复制到一个新的工作簿,并获得对该工作簿的引用。我们可以做的是创建新的工作簿,然后复制 sheet:

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

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

尝试将路径和 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

这是一年前的事了,但我会为未来的读者添加一些内容

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

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

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

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

您可以检查路径和文件名:- MsgBox ThisWorkbook.FullName

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

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

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

我现在习惯于在执行任何自动恢复操作后使用正确的路径和文件名手动保存文件,因为这需要几秒钟,而且我发现它更快(如果这不是每天发生的话)。这样,宏就不会遇到你运行这个故障了。请记住,虽然我的习惯是在恢复后立即将 .xlxb 文件手动保存为 .xlsm 文件,但这对您交给工作sheet 的新手没有帮助。

关于超链接的说明

出现此错误后:如果您的作品中有超链接sheet,很可能是使用 Ctrl+k 创建的,你会得到像 "AppData\Roaming\Microsoft\", "\AppData\Roaming\", "../../AppData/Roaming/"or "...\My documents\My documents\ " 在文件恢复后的多个超链接中。您可以通过将超链接附加到文本框或使用 HYPERLINK 函数生成它们来避免这些。

识别和修复它们有点复杂

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

Excel 没有在 'Go To Special' 菜单中提供工具来搜索使用 Ctrl+k[= 创建的超链接71=]。

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

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

其中 Link2Text 是 UDF

函数 Link2Text(rng As Range) As String ' 不要停用。 ' 在 Z 列中找到包含 'roaming' 的超链接。

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

  End Function

我的VBA更正错误如下

子Replace_roaming()

' Select 正确的 sheet 工作表("DIARY").Select

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

我还建议您养成定期备份的习惯,不要只依赖自动恢复。如果失败,则自上次完整备份以来您将一无所有。

虽然工作sheet经常进行脆弱的备份,例如每小时或在任何重要的新数据导入之后。

以下快捷方式将在几秒钟内备份您的工作sheet:Ctrl+O、[突出显示文件名]、 Ctrl+C, Ctrl+V, [ X ].定期备份允许您立即转到最近的备份,而不必从昨晚的备份文件中恢复,尤其是当您必须请求其他人执行此操作时。

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

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

经过几周的可靠操作,我 运行 突然陷入同样的​​错误,而保存工作簿的代码部分没有任何更改。

感谢之前的回答,我从一个简单的

更新了我的 saveas 语句
wb.saveas strfilename

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

瞧瞧:它又成功了。

有时 Microsoft 应用程序的行为真的很奇怪运行ge...

对我来说,尽管将其设置为“自动”,但并非所有公式都被计算出来,这是一个问题。我按了左下角的计算 100 次,然后神奇地起作用了。