第二次打开文件时Excel崩溃

更新2(3/21/17)

我发现,只有当一个(或全部)从模块导入的工作表被删除后,试图在点击“提交”button后才打开一本Excel工作簿。 (该过程在重新提交之前删除旧的工作表以清除工作簿以重新开始)。 对于手动testing,我点击提交button,删除任何导入的工作表,然后尝试打开任何 Excel文件,并崩溃。 我也确保了在删除图纸时删除了所有不存在的命名范围。 我也在一个只input一个空白表的文件上testing了这个。 然后我删除它,并能打开工作簿就好了。 我想避免创build我的模块(因为这是一种拖动)。

原来的问题

我有一个Excel工作簿工具,打开其他Excel工作簿并从这些工作簿中导入工作表后处理一些信息。

总共有5个模块工作簿。 在高层次上,这些工作簿是相同的 – 工作表结构,通用代码结构等等。有不同的公式,一些命名范围不同等等。

在主工具中,可以重新运行从不同工作簿中获取信息的代码。 它基本上重置原来的工作簿,然后再次运行代码。 这是在不closures原始工作簿的情况下完成的。 (用户可以刷新Web服务数据并重新运行该工具)。

我面临的问题是,当我重新运行两个模块工作簿Excel崩溃的过程中重新运行的代码尝试打开模块工作簿的那一点的过程中。 其他3模块工作簿很好。 我可以跑,并重新运行,并重新运行…其他2每次崩溃。

我已经做了大量的文件研究,看看为什么会发生这种情况,但还没有find原因。 进程运行后主工作簿中没有链接,没有数据连接,没有不良链接等。

另外,有趣的是,我存储在UAT环境文件夹中的文件始终正常工作。 生产文件夹中的文件失败。 我甚至直接从UAT环境文件夹将文件复制到生产环境文件夹,它仍然失败。 我也排除了文件夹级别的权限和安全性。

我也可以在第一次提交代码后手动打开文件。

我意识到这可能略微超出了这个范围,有点模糊,但希望有人可能有类似的经验,可以点亮一些。

更新

相关代码如下。 基于@Ralph的意见,我强行通过添加行Set wbLOB = Nothing擦除内存,但不幸的是,问题仍然存在。

 Function LoadLOB(sLOB As String, sXMLFile As String) As Boolean Dim sLOBFile As String sLOBFile = wsReference.Range("ModuleFolder").Value2 & sLOB & "\" & sLOB & ".xlsb" Dim wbLOB As Workbook Set wbLOB = Workbooks.Open(sLOBFile) '--> 2nd run crashes on this line. If TieXMLToExcel(wbLOB, sXMLFile, sLOB) Then MapXMLFieldsToExcelCells wbLOB, sLOB Select Case sLOB Case Is = "Property" SortTableByAscendingColumn wbLOB, "xml" & sLOB, "tCommonLocationProperty", "Location_ID" SortTableByAscendingColumn wbLOB, "xml" & sLOB, "tLocationByCoverageTypeProperty", "Location_ID" Case Is = "GeneralLiability": SortTableByAscendingColumn wbLOB, "xml" & sLOB, "tClassCodesByLocationGeneralLiability", "Location_ID" Case Is = "CommercialAuto": SortTableByAscendingColumn wbLOB, "xml" & sLOB, "tVehicleSummaryCommercialAuto", "AuVehicleNo" Case Is = "Crime": SortTableByAscendingColumn wbLOB, "xml" & sLOB, "tCommonLocationCrime", "Location_ID" End Select Application.Run wbLOB.Name & "!PrepareSheetForMasterFile", ThisWorkbook wbLOB.Close False LoadLOB = True End If Set wbLOB = Nothing End Function 

我怀疑这是答案,但我认为这是一个更好的交stream我在这个问题上的想法的论坛。 我所做的是我抓住了一些Windows API来检查该文件是否打开,然后再次尝试打开它。 我还添加了一个closures文件的方法,并且使SaveChanges参数更明确。 我还在那里添加了一些DoEvents,以防万一等待完成。

希望这是其他想法的起点。 我希望有一些帮助。

 'Determine whether a file is already open or not #If VBA7 And Win64 Then Private Declare PtrSafe Function lOpen Lib "kernel32" Alias "_lopen" (ByVal lpPathName As String, ByVal iReadWrite As Long) As Long Private Declare PtrSafe Function lClose Lib "kernel32" Alias "_lclose" (ByVal hFile As Long) As Long #Else Private Declare Function lOpen Lib "kernel32" Alias "_lopen" (ByVal lpPathName As String, ByVal iReadWrite As Long) As Long Private Declare Function lClose Lib "kernel32" Alias "_lclose" (ByVal hFile As Long) As Long #End If Function LoadLOB(ByVal sLOB As String, _ ByVal sXMLFile As String) As Boolean Dim sLOBFile As String Dim wbLOB As Workbook sLOBFile = wsReference.Range("ModuleFolder").Value2 & sLOB & "\" & sLOB & ".xlsb" 'Make sure the file is closed before processing If Not isFileOpen(sLOBFile) Then Set wbLOB = Workbooks.Open(sLOBFile, 0, False) Else 'Close it if it is open closeWB sLOBFile Set wbLOB = Workbooks.Open(sLOBFile, 0, False) End If If TieXMLToExcel(wbLOB, sXMLFile, sLOB) Then MapXMLFieldsToExcelCells wbLOB, sLOB Select Case sLOB Case Is = "Property" SortTableByAscendingColumn wbLOB, "xml" & sLOB, "tCommonLocationProperty", "Location_ID" SortTableByAscendingColumn wbLOB, "xml" & sLOB, "tLocationByCoverageTypeProperty", "Location_ID" Case Is = "GeneralLiability": SortTableByAscendingColumn wbLOB, "xml" & sLOB, "tClassCodesByLocationGeneralLiability", "Location_ID" Case Is = "CommercialAuto": SortTableByAscendingColumn wbLOB, "xml" & sLOB, "tVehicleSummaryCommercialAuto", "AuVehicleNo" Case Is = "Crime": SortTableByAscendingColumn wbLOB, "xml" & sLOB, "tCommonLocationCrime", "Location_ID" End Select Application.Run wbLOB.Name & "!PrepareSheetForMasterFile", ThisWorkbook DoEvents wbLOB.Close SaveChanges:=False LoadLOB = True End If Set wbLOB = Nothing End Function Sub closeWB(ByVal FilePath As String) Dim wb As Workbook For Each wb In Application.Workbooks If wb.FullName = FilePath Then wb.Close SaveChanges:=False Set wb = Nothing DoEvents Exit For End If Next End Sub Function isFileOpen(ByVal FileName As String) As Boolean Dim FileNumb As Long: FileNumb = -1 Dim lastErr As Long FileNumb = lOpen(FileName, &H10) 'Determine if we can open the file If FileNumb = -1 Then lastErr = Err.LastDllError Else lClose (FileNumb) End If ' Check if there is a sharing violation and report back status isFileOpen = (FileNumb = -1) And (lastErr = 32) End Function 

不知道这个答案是多么有帮助,但我重新创build了模块文件,他们在所有环境中工作。 很可能是我无法find的文件中的一个小腐败。