另存为使用变量名称给出错误

时间:2015-03-04 19:28:04

标签: excel vba excel-vba save

尝试使用名称的变量保存一个新的,尚未命名的工作簿(我使用另一个sub添加)。当我将所有内容放在引号内时,它可以保存(而不是使用变量)。但是这段代码不断地给出了运行时错误' 1004':方法' SaveAs' of object' _workbook'失败。

Sub SalvarTabela30()
Application.DisplayAlerts = False
Dim CompanyNameSave As String
Dim VencimentoSave As Date
Dim ContractNumberSave As String
Dim LastrowForSave As Long
LastrowForSave = ActiveSheet.Cells(Rows.Count, "D").End(xlUp).Row
CompanyNameSave = Range("A2")
VencimentoSave = Range("C" & LastrowForSave)
ContractNumberSave = Range("E2")
ActiveWorkbook.SaveAs _
   Filename:="\\dsapc429pfs.pactual.net\homefolder02$\wellsty\Desktop\" & _ 
      "Projeto - Marina\" & CompanyNameSave & " - " & ContractNumberSave & _
      " - Vencimento" & "(" & VencimentoSave & ")", FileFormat:=52

Application.DisplayAlerts = True
End Sub

1 个答案:

答案 0 :(得分:3)

有许多事情可能会导致Save操作出错,但最常见的是当我们尝试自动创建文件名时,并且不会考虑非法字符,成为文件名的一部分。

在您的情况下,由于您使用的是日期值,因此日期格式中存在\/会导致错误。

This列出了保留字符:

  • <(小于)
  • >(大于)
  • :(冒号)
  • "(双引号)
  • /(正斜杠)
  • \(反斜杠)
  • |(垂直条或竖线)
  • ?(问号)
  • *(星号)

对于您的情况,您可以简单地使用双重替换:

CompanyNameSave = Replace(Replace(CompanyNameSave, "\", "-"), "/", "-")

但是,这并未考虑所有非法/保留字符。编写一个清除文件名字符串的自定义函数可能会有所帮助:

Function CleanFileName(name As String, Optional replaceBy As String = "_")
Const reservedChars As String = "<>:""""/\|?*"
Dim i As Integer
Dim ch As String

For i = 1 To Len(reservedChars)
    ch = Mid(reservedChars, i, 1)

    name = Replace(name, ch, replaceBy)
Next

CleanFileName = name


End Function

然后,您可以在尝试保存文件之前立即调用此函数,例如:

CompanyNameSave = CleanFileName(CompanyNameSave, "-")

注意:如果省略可选的replaceBy参数,则默认使用下划线_来替换保留字符。

另请注意:这不会考虑该文件是否已存在。