我正在尝试将启用宏的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搜索并尝试了一些解决方案:
尽管如此,它可能连续正常运行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
我通常发现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
我会警告你之后将工作簿保存为原始名称,如果它保持打开状态,但你已经在代码中已经有了。
这是一年了,但我会为未来的读者添加一些东西
您不会在运行时错误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]。定期备份允许您立即转到最近的备份,而无需从昨晚的备份文件中恢复,特别是如果您必须请求其他人执行此操作。
尝试将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