【问题标题】:Getting "method saveas of object _workbook failed" error while trying to save an XLSM as CSV尝试将 XLSM 保存为 CSV 时出现“对象 _workbook 的方法保存失败”错误
【发布时间】:2015-05-12 03:06:34
【问题描述】:

我正在尝试将启用宏的 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 的方法保存失败**)

调试器指出:

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

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

  • 指定目录为字符串
  • 避免在文件名或文件夹中使用任何特殊字符(参见here
  • 将工作表复制为值,然后将其保存为 .csv(参见 here
  • 使用 .csv 代码号指定 FileFormat(参见 here
  • 禁用/重新启用某些警报
  • 在 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

【问题讨论】:

  • 各位,感谢你们的回复。我现在没有时间尝试这样做,明天再做,然后回复你。
  • 由于我的代表级别,我无法投票支持你们两个,无论如何感谢您的帮助。 Degustaf 解决方案看起来成功了!我测试了它超过 100 次,它没有失败。我在上面的问题上添加了来自 Degustaf 回复的已编辑和重新调整的代码。由于某种原因,JMMach 仍然导致问题。

标签: excel vba csv runtime-error save-as


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    这是一岁了,但我会为以后的读者添加一些东西

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

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

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

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

    您可以通过以下方式检查路径和文件名:- MsgBox ThisWorkbook.FullName

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

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

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

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

    关于超链接的说明

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

    识别和修复它们有点复杂

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

    Excel 未在“转到特殊”菜单中提供用于搜索使用 Ctrl+k 创建的超链接的工具。

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

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

    Link2Text 是 UDF

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

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

    我的VBA纠正错误如下

    Sub Replace_roaming()

    ' 选择正确的工作表 表格(“日记”)。选择

    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]。定期备份可让您立即转到最近的备份,而无需从昨晚的备份文件中恢复,尤其是在您必须请求他人执行此操作时。

    【讨论】:

    • 感谢 Mike,即使现在也非常感谢!
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

        经过数周的可靠运行后,我突然遇到了同样的错误,而保存工作簿的代码部分没有任何更改。

        感谢之前的回答,我从一个简单的地方更新了我的 saveas 语句

        wb.saveas strfilename
        

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

        等等:它再次起作用了。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-07-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-11-19
          • 2019-01-05
          相关资源
          最近更新 更多