运行时错误“1004”:对象“_Workbook”的方法“SaveAs”失败

Posted

技术标签:

【中文标题】运行时错误“1004”:对象“_Workbook”的方法“SaveAs”失败【英文标题】:Run-time error '1004': Method 'SaveAs' of object'_Workbook' failed 【发布时间】:2015-08-21 11:14:51 【问题描述】:

用户有一个 Excel 电子表格。为了保存它,他们按下一个运行以下 VBA 代码的按钮。

代码尝试将 Excel 电子表格保存到网络位置,并用今天的日期修改文件名。

代码会间歇性地失败

“运行时错误'1004':对象'_Workbook'的方法'SaveAs'失败”。

脚本是:

Public Sub Copy_Save_R2()
    Dim wbNew As Workbook
    Dim fDate As Date

    fDate = Worksheets("Update").Range("D3").Value

    Set wbNew = ActiveWorkbook

    With wbNew
        ActiveWorkbook.SaveAs Filename:="Q:\R2 Portfolio Prints\#Archive - R2 Portfolio\" & "R2 Portfolio - CEC A " & Format(fDate, "mm-dd-yyyy")
    End With

    Sheets("Update").Activate
End Sub

【问题讨论】:

基本上;您的代码无法访问映射的驱动器 【参考方案1】:

正如 Hugo 所说,这可能是映射驱动器的问题。我更喜欢使用完整的 UNC 路径 (\\Thismachine\...),以防工作簿在没有设置映射驱动器的机器上使用。

我认为缺少的扩展名可能是问题所在,但我刚刚在 Excel 2013 中对其进行了测试,它会自动将 .xlsx 添加到文件名中。

问题可能是由于wbNew 引用。这是完全没有必要的,不应与ActiveWorkbook 结合使用。基本上,您应该有对工作簿的引用,或者使用预定义的ActiveWorkbook 引用。我还建议改用ThisWorkbook,因为用户可能会在代码运行时点击另一本书。

Public Sub Copy_Save_R2()
    Dim wbNew As Workbook
    Dim fDate As Date

    fDate = Worksheets("Update").Range("D3").Value

    Application.DisplayAlerts = False
    ThisWorkbook.SaveAs Filename:="Q:\R2 Portfolio Prints\#Archive - R2 Portfolio\R2 Portfolio - CEC A " & Format(fDate, "mm-dd-yyyy") & ".xlsx"
    Application.DisplayAlerts = True

    ThisWorkbook.Sheets("Update").Activate
End Sub

编辑:添加了Application.DisplayAlerts 命令以防止任何保存弹出窗口,例如使用 .xlsx 代替 .xlsm,以及覆盖现有副本。

编辑 2018-08-11:添加了转义反斜杠以修复 UNC 路径显示。为关于 With 声明的不准确声明添加了删除线(参见下面的 cmets)。基本上,由于WithEnd With 之间的任何内容都没有以. 开头,因此该语句根本没有做任何事情。

【讨论】:

wbNew 不会引起任何问题,它只是完全多余和未使用的。但它不会影响任何其他代码行。 你说得对,wbNew 本身不会引起任何问题,我的解释应该更清楚。在原始代码示例中,除了ActiveWorkbook之外,还使用了with语句,这基本上导致ActiveWorkbook.ActiveWorkbook.SaveAs... @EricHarlan 刚刚遇到这个,因为有人建议这是一个新问题的重复。 FWIW 原始代码中的With 块不会影响事物 - 只有当它说.ActiveWorkbook.SaveAs(即带有前导.)时,它才会被视为ActiveWorkbook.ActiveWorkbook.SaveAs。原始代码中的 With 块实际上并没有被使用,因此可以删除,但不会导致任何错误。 好点,@YowE3K 和 Wolfie(只能标记一个用户)。我已经更新了我的答案。抱歉,最初指出时我没有遵循。【参考方案2】:

我也在寻找导致此错误的原因,然后我想起我正在处理已恢复的电子表格版本。一旦我手动保存恢复的文件并重新打开它,保存工作簿的 vba 代码就没有问题了。

【讨论】:

【参考方案3】:

当我遇到这种情况时,我在保存之前添加了一个命令。

On Error Resume Next
    Kill TargetFullname
On Error GoTo 0

wb.SaveCopyAs TargetFullname

(我也用application.display=false

【讨论】:

【参考方案4】:

这对我有用。确保您的工作簿未共享。我猜“共享​​”工作簿有限制。

在这里看到这个: https://www.ozgrid.com/forum/forum/help-forums/excel-general/27843-save-xls-as-txt

在“审阅”选项卡中,单击“共享工作簿”并确保“允许多个用户同时进行更改。这允许工作簿合并”未选中

【讨论】:

以上是关于运行时错误“1004”:对象“_Workbook”的方法“SaveAs”失败的主要内容,如果未能解决你的问题,请参考以下文章

尝试使用 OLEDBConnection 运行时错误“1004”运行查询:应用程序定义或对象定义错误

当目录中存在同名文件时,“对象_workbook的方法保存失败”

代码中出现运行时 1004 错误

将公式放入单元格时出现运行时错误 1004

对象“_Workbook”的方法“SaveAs”失败

尝试在映射服务器上将 XLSM 保存为 CSV 时出现“对象 _workbook 的方法保存失败”错误