我创建了一个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:=xlOpenXMLWorkbook
过FileFormat:=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
对此问题的任何帮助将不胜感激。