尝试将XLSM保存为CSV时出现“object _workbook的方法保存失败”错误

czfnxgou  于 8个月前  发布在  其他
关注(0)|答案(6)|浏览(108)

我试图保存一个宏启用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:object _workbook的方法saveas失败**)
调试器指出:

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


我在谷歌上搜索了一下,我尝试的一些解决方案是:

  • 指定目录为字符串
  • 避免文件名或文件夹中的任何特殊字符(参见here
  • 复制粘贴工作表作为值,然后将其保存为.csv(参见here
  • 使用.csv代码编号替换FileFormat(参见here
  • 禁用/重新启用某些警报
  • 在ActiveWorkbook.SaveAs行中添加其他字段,如密码、创建备份等

尽管如此,它可能连续正确运行50-60次,然后在某个时候再次失败。
任何建议,除了停止使用Excel/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

9o685dep

9o685dep1#

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


如果工作簿保持打开状态,但您的代码中已经有了它,那么我将警告您以后将工作簿重新保存为它的原始名称。

xxe27gdn

xxe27gdn2#

这是一年前的事了,但我会为未来的读者补充一些东西
您不会在Excel帮助中找到运行时错误1004的大量文档,因为Microsoft不认为它是Excel错误。
上面的答案是100%有效的,但有时它有助于了解导致问题的原因,以便您可以避免它,更早地修复它或更容易地修复它。
事实上,这是一个间歇性的错误,它是固定的保存与完整的路径和文件名告诉我,要么你的宏可能试图保存一个.xlsb文件到autocoverable目录后,自动文件恢复。
或者,您可能自己编辑了文件的路径或文件名。
您可以使用以下命令检查路径和文件名:- MsgBox ThisWorkbook.FullName
您应该在消息框中看到类似的内容。
C:\Users\Mike\AppData\Roaming\Microsoft\Excel\DIARY(版本1).xlxb
如果是这样的话,解决方案是(如上面其他人所说的)将文件保存到正确的路径和文件名。这可以用磁盘或手动完成。
我现在的习惯是手动保存文件与正确的路径和文件名作为当然后,任何自动恢复行动,因为它需要几秒钟,我发现它更快(如果这不是每天都发生的话)。因此,宏将不会遇到这个错误,你运行它。请记住,虽然我的习惯手动保存.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)))

字符串
其中Link 2 Text是UDF
函数Link 2 Text(rng As Range)As String ' DO NOT deactivate. '定位Z列中包含'roaming'的超链接。

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

  End Function


我纠正错误的方法如下
SubReplace_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 ].常规备份允许您立即转到最近的备份,而不必从昨晚的备份文件中恢复,特别是如果您必须请求另一个人这样做。

bprjcwpo

bprjcwpo3#

距离上次回答已经有一段时间了,但我想分享一下我今天的经历:
经过几个星期的可靠操作,我突然遇到了同样的错误,而保存工作簿的代码部分没有任何变化。
感谢前面的答案,我更新了我的saveas语句,从一个简单的

wb.saveas strfilename

字符串

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


瞧,又成功了。
有时微软的应用程序表现得很奇怪.

6rqinv9w

6rqinv9w4#

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

hsvhsicv

hsvhsicv5#

我也有类似的问题,但对我来说,问题是我是基于从工作簿中提取的字符串创建文件夹的,有时这些字符串会有不能在文件名中的字符。删除这些字符对我来说是个窍门!

14ifxucb

14ifxucb6#

对我来说,有一个问题,并不是所有的公式都在计算,尽管有它的“自动”。我按下计算左下角100次,然后它神奇地工作。

相关问题