调用.SaveAs崩溃Excel

时间:2013-08-01 12:14:01

标签: vba excel-vba excel-2007 excel

我创建了一个xlam(Excel 2007加载项)文件来处理各种文件的操作。我试图在xlam文件中编写一个过程,从已打开的xlsm文件中删除一些工作表,并将其保存为xlsx(即没有宏)。

到目前为止,我唯一可靠的做法就是在我到达.SaveAs电话时崩溃Excel。崩溃来自Windows对话框,声明:

  

Microsoft Office Excel已停止工作,Windows可以尝试恢复您的信息并重新启动该程序。 [重新启动程序] [调试程序]

在我保存到的文件夹中,每次崩溃后,我都会在它尝试保存到的文件夹中留下一个临时文件(例如文件名: 7A275000 ,大小为:0)。 / p>

对于后人来说,我尝试了一些事情,但都导致了同样的崩溃:

  • 硬编码文件名值(“C:\ Users \ myUserName \ Desktop \ temp.xlsx”)
  • 来自用户的提示文件名(如下面的代码所示)
  • 不带路径的文件名(“temp.xlsx”)
  • 不带扩展名的文件名(“C:\ Users \ myUserName \ Desktop \ temp”)
  • filename as now filename without extension
  • filename为现有文件名,扩展名为.xlsx
  • 我使用wb.SaveAs后跟wb.Activate
  • 而不是ActiveWorkbook.SaveAs
  • 我尝试了FileFormat:=xlOpenXMLWorkbookFileFormat:=xlWorkbookNormal
  • 保存到不同长度的几个不同目录
  • .SaveAs调用周围添加了一个错误捕获语句(它没有捕获任何错误,并且崩溃的Excel也是如此)

最后一个奇怪的是当我尝试在ws.delete调用之后对文件执行手动“另存为”(即自己导航到“另存为”菜单)时,Excel会以相同的方式崩溃。如果我自己手动删除工作表,那么请手动保存,它保存得很好。


以下是有问题的代码:

Public Sub ConvertToStagingFile(ByRef wb As Workbook)
    Dim reWS As Object, reFILE As Object
    Dim ws As Worksheet

    Set reWS = CreateObject("VBScript.regexp")
    reWS.IgnoreCase = True: reWS.Global = False: reWS.MultiLine = False

    Set reFILE = CreateObject("VBScript.regexp")
    reFILE.IgnoreCase = True: reFILE.Global = False: reFILE.MultiLine = False

    reWS.Pattern = "^(home|location settings|date reference|[\w\s]{1,8} (rating|inquire) data|pkl data - \w{1,8}|verbs - \w{1,8})"
    reFILE.Pattern = "\.xlsm$"

    For Each ws In wb.Worksheets
        If (ws.Visible = xlSheetHidden) Or (ws.Visible = xlSheetVeryHidden) Then
            ws.Visible = xlSheetVisible
        End If

        Select Case True
            Case reWS.test(ws.name)
                '// Do Nothing
            Case Else
                Application.DisplayAlerts = False
                ws.Delete
                Application.DisplayAlerts = True
        End Select
    Next ws

    ActiveWindow.TabRatio = 0.75

    If (reFILE.test(Cached.getAdhocReportFull)) Then
        Dim newName As Variant

        newName = Application.GetSaveAsFilename(reFILE.Replace(Cached.getAdhocReportFull, ""), "*.xlsx")
        If newName = False Then Exit Sub

        wb.Activate

        Application.EnableEvents = False
        '// CODE RELIABLY CRASHES HERE
        wb.SaveAs _
            FileName:=newName, _
            FileFormat:=xlOpenXMLWorkbook, _
            CreateBackup:=False

        Application.EnableEvents = True

    End If
End Sub

非常感谢有关此问题的任何帮助。

1 个答案:

答案 0 :(得分:0)

我有一个看似完全相同的问题:

  • Excel 2013
  • 宏以删除xlsm文件中的工作表
  • 后续调用.Save,或手动保存文件崩溃Excel(与Hari相同的对话框)
  • 当我们从.xls更新为“新的”办公室文件格式
  • 时,问题才会出现
  • 有关信息,我们的文件不是很大(仅300kB)

由于我们的目的是替换工作表,以下工作原理:重命名旧工作表,创建新工作表(与旧工作表同名),删除旧工作表。似乎为我们工作。它为什么有效?不知道。