【发布时间】: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:=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
对于这个问题的任何帮助将不胜感激。
【问题讨论】:
-
excel的大小是不是很大???
-
是的...对于 excel 文件来说它有点大。它的大小可以是 2-4mb。大文件保存需要注意什么?
-
尝试减小大小,如果已使用范围(vlookup,索引)尝试减小大小,在命名公式中 - 减小范围...否则您的文件可能已损坏尝试创建一个新的版本并试一试...
-
感谢您的建议,但我不确定它是否适用于此。我已经通过删除文档中大约一半的工作表来减小文件大小。
.SaveAs也尝试在不使用 vba 的情况下进行保存,这会减小整体文件大小。 -
好问题...我会试一试
标签: vba excel excel-2007