作者:很呆很傻很天真2010_545 | 来源:互联网 | 2023-05-18 16:43
我试图通过这个宏保存一个(启用宏的)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了它,显然它确实发生了很多人和我尝试的一些解决方案:
指定目录是字符串
避免文件名或文件夹中的任何特殊字符(见此处)
复制粘贴工作表作为值,然后将其保存为.csv(在此处可见)
使用.csv代码编号指定FileFormat(在此处可见)
禁用/重新启用某些警报
在ActiveWorkbook.SaveAs行中添加其他字段,关于密码,创建备份etcetc
尽管如此,它可能连续正常运行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..
5
我通常发现这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
如果工作簿保持打开状态,我将警告您此后将其重新保存为原始名称,但是您的代码中已经包含了该工作簿。
1> Degustaf..:
我通常发现这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
如果工作簿保持打开状态,我将警告您此后将其重新保存为原始名称,但是您的代码中已经包含了该工作簿。