0

我创建了一个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

对此问题的任何帮助将不胜感激。

4

1 回答 1

0

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

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

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

于 2013-10-16T12:00:13.070 回答