我需要保存我正在使用的工作表的副本作为CSV文件。我将保存名称设为日期和用户名,我已经设置了变量来获取此信息,但是我一直收到运行时错误“ 1004”;应用程序定义或对象定义的错误消息,它将不起作用。
我正在使用的代码是:
Sub SaveCSV()
rundate = DateTime.Now
runname = Application.UserName
savename = rundate & runname
sfilename = ActiveWorkbook.Path & "\" & savename & ".csv"
ActiveWorkbook.Save
ActiveWorkbook.SaveAs Filename:=sfilename, FileFormat:=xlCSV
Application.DisplayAlerts = True
End Sub
任何人都可以针对问题所在以及如何解决这个问题向我指出正确的方向吗?
运行日期的值(基于默认的区域设置)将类似于以下内容:
3/12/2019 10:25:11
根据Windows中的文件名约定,其中的正斜杠(/)和冒号(:)是非法字符。
要解决此特定问题,请使用以下代码将当前时间分配给rundate变量:
rundate = Format(DateTime.Now, "dd-MMM-YYYY_hh-mm-ss_")
另一种好方法是使用泛型函数,因为我们并不总是知道造成这种麻烦的是非法字符。因为文件名中可能包含更多非法字符。上面的方法是正确的,但是它不是完整的非法字符列表,可以在保存之前从文件名中删除或替换。例如。您的代码->:&中的数组中缺少这些字符。但是,建议也将文件名除去其他允许的特殊字符。
下面,我提供的函数将返回一个安全的字符串,该字符串可用于保存之前生成文件名。
Function ReplaceIllegalCharacters(strIn As String, strChar As String) As String
Dim strSpecialChars As String
Dim i As Long
strSpecialChars = "~""#%&*:<>?{|}/\[]" & Chr(10) & Chr(13)
For i = 1 To Len(strSpecialChars)
strIn = Replace(strIn , Mid$(strSpecialChars, i, 1), strChar)
Next
ReplaceIllegalCharacters = strIn
End Function
特别是在您的代码中,用以下行替换ActiveWorkbook.SaveAs行:
ActiveWorkbook.SaveAs Filename:= ReplaceIllegalCharacters(sfilename, "_") & _
, FileFormat:=xlCSV, CreateBackup:=False