【问题标题】:Calling .SaveAs Crashes Excel调用 .SaveAs 会使 Excel 崩溃
【发布时间】:2013-08-02 08:37:05
【问题描述】:

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

到目前为止,我唯一能可靠地做的就是每当我到达.SaveAs 呼叫时让 Excel 崩溃。崩溃以 Windows 对话框的形式出现:

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

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

为了后代,我尝试过一些事情,但都导致了同样的崩溃:

  • 硬编码文件名值(“C:\Users\myUserName\Desktop\temp.xlsx”)
  • 来自用户的提示文件名(如下代码所示)
  • 没有路径的文件名(“temp.xlsx”)
  • 不带扩展名的文件名(“C:\Users\myUserName\Desktop\temp”)
  • 文件名作为没有扩展名的现有文件名
  • 文件名作为现有文件名,扩展名为 .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

对于这个问题的任何帮助将不胜感激。

【问题讨论】:

  • excel的大小是不是很大???
  • 是的...对于 excel 文件来说它有点大。它的大小可以是 2-4mb。大文件保存需要注意什么?
  • 尝试减小大小,如果已使用范围(vlookup,索引)尝试减小大小,在命名公式中 - 减小范围...否则您的文件可能已损坏尝试创建一个新的版本并试一试...
  • 感谢您的建议,但我不确定它是否适用于此。我已经通过删除文档中大约一半的工作表来减小文件大小。 .SaveAs 也尝试在不使用 vba 的情况下进行保存,这会减小整体文件大小。
  • 好问题...我会试一试

标签: vba excel excel-2007


【解决方案1】:

我遇到了似乎完全相同的问题:

  • Excel 2013
  • 删除 xlsm 文件中工作表的宏
  • 对 .Save 的后续调用或手动保存文件会导致 Excel 崩溃(与 Hari 相同的对话框)
  • 仅当我们从 .xls 更新为“新”办公文件格式时,我们才出现此问题
  • 仅供参考,我们的文件并没有那么大(只有 300kB)

由于我们的意图是替换工作表,因此我们可以完成以下工作:重命名旧工作表,创建新工作表(与旧工作表同名),删除旧工作表。似乎对我们有用。为什么它有效?不知道。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-29
    • 1970-01-01
    相关资源
    最近更新 更多