ActiveWorkbook.SaveAs excel 2013 1004错误

时间:2015-11-26 11:02:48

标签: excel vba excel-2010 excel-2013 save-as

我正在

  

运行时错误'1004'对象'_Workbook'的方法'SaveAs'失败。

该代码适用于excel 2010.我只在excel 2013中收到此错误消息。 尝试运行跟随行后出现错误消息。

    ActiveWorkbook.SaveAs FolderPath & SaveName & NewSaveExt, 52

背景:
电子表格是.xls
使用Saveas时,我将其更改为.xlsm
我用.xls扩展名和fileformat 56尝试了它,但它仍然没有结束 我正在使用代码中列出的资源中的代码 我将文件保存到工作簿所在的同一文件夹中 原始文件名是:财务报告,月份为N.xls
新文件名为:财务报告1516,截至8.xlsm年

    Sub SaveNewVersion_Excel()
    'PURPOSE: Save file, if already exists add a new version indicator to                 filename
    'SOURCE: www.TheSpreadsheetGuru.com/The-Code-Vault

    Dim FolderPath As String
    Dim myPath As String
    Dim SaveName As String
    Dim SaveExt As String
    Dim NewSaveExt As String
    Dim VersionExt As String
    Dim Saved As Boolean
    Dim x As Long

    TestStr = ""
    Saved = False
    x = 0
    NewSaveExt = ".xlsm"
    'Version Indicator (change to liking)
      VersionExt = "_v"

    'Pull info about file
      On Error GoTo NotSavedYet
        myPath = ActiveWorkbook.FullName
        myFileName = "Financial Report " & FileFinancialYear & " as at month         " & MonthNumber
        FolderPath = Left(myPath, InStrRev(myPath, "\"))
        SaveExt = "." & Right(myPath, Len(myPath) - InStrRev(myPath, "."))
      On Error GoTo 0



    'Determine Base File Name
      If InStr(1, myFileName, VersionExt) > 1 Then
        myArray = Split(myFileName, VersionExt)
        SaveName = myArray(0)
      Else
        SaveName = myFileName
      End If


    'Test to see if file name already exists
      If FileExist(FolderPath & SaveName & SaveExt) = False Then

        ActiveWorkbook.SaveAs FolderPath & SaveName & NewSaveExt, 52
        Exit Sub
      End If

    'Need a new version made
      Do While Saved = False
        If FileExist(FolderPath & SaveName & VersionExt & x & SaveExt) =         False Then
          ActiveWorkbook.SaveAs FolderPath & SaveName & VersionExt & x & NewSaveExt, 52
          Saved = True
        Else
          x = x + 1
        End If
      Loop

    'New version saved
      MsgBox "New file version saved (version " & x & ")"

    Exit Sub

    'Error Handler
    NotSavedYet:
      MsgBox "This file has not been initially saved. " & _
        "Cannot save a new version!", vbCritical, "Not Saved To Computer"

    End Sub


    Function FileExist(FilePath As String) As Boolean
    'PURPOSE: Test to see if a file exists or not
    'RESOURCE: http://www.rondebruin.nl/win/s9/win003.htm

    Dim TestStr As String

    'Test File Path (ie "S:\Reports\Financial Report as at...")
      On Error Resume Next
        TestStr = Dir(FilePath)
      On Error GoTo 0

    'Determine if File exists
      If TestStr = "" Then
        FileExist = False
      Else
        FileExist = True
      End If

    End Function

1 个答案:

答案 0 :(得分:0)

错误再现:尝试保存已存在FileName的工作簿时,我能够重现错误。 这可能发生,因为代码检查是否存在以扩展名SaveExt 命名的文件(使用函数FileExist,然后尝试将其保存为以扩展名{{命名的文件1}}。如果这些扩展名不相同,则扩展名为NewSaveExt的文件可能已存在,提升

  

运行时错误'1004':对象'_Workbook'的方法'SaveAs'失败。

然而这个警告:

  

此文件中已存在“财务报告为月.xlsm”文件   地点。你想替换它吗?。

应该在错误NewSaveExt

之前显示

不幸的是我无法测试Excel 2010中发布的代码,但我个人认为这种行为并不仅仅是Excel 2013。

解决方案:如果目标是始终将文件另存为1004 (值xlsm,则代码应验证是否存在具有该扩展名的文件名。

有关已发布代码的其他评论:

  1. 声明所有变量是最佳做法。这些变量未声明: NewSaveExtTestStrFileFinancialYearMonthNumbermyFileName
  2. 这些行是多余的,因为不需要初始化尚未使用的变量,因此它们已经保持其初始化值。 myArray; TestStr = ""; Saved = False
  3. 建议使用常量而不是变量(参见Variables & Constantsx = 0; NewSaveExt = ".xlsm"
  4. 新工作簿未被检测为错误处理程序VersionExt = "_v",该错误处理程序应该在(即新工作簿)之前未保存NotSavedYet时触发在处理新工作簿(参见On Error Statement时,ActiveWorkbook语句之间没有任何命令生成错误。如果意图不是保存On Error,如错误处理程序New Workbooks所暗示的那样,那么验证NotSavedYet的{​​{1}},如果工作簿没有,则它将为空之前已经保存过。
  5. 永远不会填充PathActiveWorkbook个变量。
  6. 建议使用FileFinancialYearMonthNumber的特定工作簿属性,而不是Path(请参阅Workbook Object (Excel)
  7. 关于被称为Name

    的文章

    一个。编程:不需要FullName语句,只需使用Determine Base File Name函数并获取项IF。当Split中没有0时,Split函数返回“包含entire表达式的单个元素数组”(即{{1}分别和delimiter

    湾实用性:这篇文章似乎是多余的,因为它意味着从变量expression中提取不包括版本和扩展名的文件名,但是变量中没有这样的信息,因为它只填充了上面的几行: / p>

    VersionExt

    因此myFileName始终等于myFileName

  8. 该文件的第一个版本被编入索引为myFileName = "Financial Report " & FileFinancialYear & " as at month " & MonthNumber而不是SaveName

  9. 新索引版本并不总是最后一个索引号+ 1 。如果任何以前的版本被删除或移出到另一个文件夹,因为缺少此版本,代码会将缺失的版本索引分配给保存的最新文件(参见图1,请注意版本3的时间较新)比版本4和5)这一点的更正需要更复杂的方法,因此它不包含在下面的修订代码中。
  10. 要求:根据以上内容,编写了符合以下要求的修订代码:

    • 该过程驻留在一个独立的工作簿中。
    • 文件始终保存为myFileName (分机0
    • 新工作簿不会保存为新版本。
    • 变量1xlOpenXMLWorkbookMacroEnabled是硬编码的,因为没有迹象表明它们如何填充(根据需要进行更改)
    • 第一次保存文件且源文件夹中不存在该文件时,将保存文件而不包含版本号。
    • 第一个版本的索引应为xlsm (如果需要,请更改为0)

      FileFinancialYear