调用另一个工作簿中的函数会导致崩溃或自动化错误



我正在使用宏从源(称为Book1.xlsm(复制工作表(称为复制(,以将工作表复制到目标工作簿(称为Book2.xlsb(。在执行复制之前,我在目标 (Book2.xlsb( 中调用宏以确保它是旧版本。

Excel 崩溃或出现自动化错误异常,或者只是在目标工作簿关闭时崩溃(保存或不保存(。

当我从空白的 xlsm 或 xlsb 执行此操作时,没有崩溃。我使用10个现实世界的电子表格中的任何一个(从2MB到34MB xlsb(,并且它一直在发生。

我花了几天时间试图用较小的电子表格作为目标使最小可行的示例崩溃,但没有运气。

目标电子表格不包含 vba 代码(仅包含公式(,但从源导入的模块除外。

我的示例有 Button1 来制作单个副本。 版本号(单元格 A2(存在 1 个字段。

给我留下的印象是,在另一个工作簿中调用代码只是一个坏主意,或者我错过了一些基本的东西。如果未调用目标工作表,则一切正常。

主要问题:从另一个工作簿运行代码只是一个坏主意还是我错过了什么?

在保存之前,我尝试过:

Application.Calculate
Do Until (Application.CalculationState = xlDone) And _
(Application.Workbooks.Count <> 1) And _
(Application.VBE.VBProjects.Count 
DoEvents
Loop
TmpTgtWorkbook.Close False
Set TmpTgtWorkbook = Nothing

在打开之前,我总是确保只有源工作簿处于打开状态。

Option Explicit
Function GetVersion(aWorkbook As Workbook) As Double
Dim TmpSheet As Worksheet
GetVersion = 0
On Error Resume Next
Set TmpSheet = aWorkbook.Sheets("Copy")
On Error GoTo 0
If TmpSheet Is Nothing Then
Exit Function
End If
GetVersion = CDbl(TmpSheet.Range("B1"))
End Function
Sub CopyToBook2()
Dim TmpTgtWorkbook As Workbook
Dim TmpSrcVersion As Double
Dim TmpTgtVersion As Double
Const kWorkbookStr = "Book2.xlsb"
TmpSrcVersion = GetVersion(ThisWorkbook)
ThisWorkbook.VBProject.VBComponents("Module1").Export "C:TempModule1"
Set TmpTgtWorkbook = Application.Workbooks.Open(Filename:=ThisWorkbook.Path + "" + kWorkbookStr)
Err.Clear
On Error Resume Next
'Run the GetVersion Function from the Opened Workbook.
'Removing this line takes away crashes.
TmpTgtVersion = Application.Run(kWorkbookStr + "!GetVersion", TmpTgtWorkbook)
If Err.Number <> 0 Then
Err.Clear
TmpTgtVersion = 0
End If
On Error GoTo 0
If TmpSrcVersion > TmpTgtVersion Then
On Error Resume Next
TmpTgtWorkbook.VBProject.VBComponents.Remove TmpTgtWorkbook.VBProject.VBComponents("Module1")
Application.DisplayAlerts = False
TmpTgtWorkbook.Sheets("Copy").Delete
Application.DisplayAlerts = True
On Error GoTo 0
TmpTgtWorkbook.VBProject.VBComponents.Import "C:TempModule1"
ThisWorkbook.Sheets("Copy").Copy TmpTgtWorkbook.Sheets(1)
TmpTgtWorkbook.ChangeLink ThisWorkbook.Name, TmpTgtWorkbook.Name, xlLinkTypeExcelLinks
TmpTgtWorkbook.Close True
Else
TmpTgtWorkbook.Close False
End If
End Sub

发生自动化错误异常,然后崩溃或只是崩溃。

此外,还需要通过单击 Button1 2 个或更多来运行代码,以首先将模块复制到目标。

我选择了Abdes Sabor的解决方法。谢谢。

此外,考虑将来的小版本系统,其中代码模块具有CodeModuleName_Major_Minor版本格式。

我的主要问题:从另一个工作簿运行代码只是一个坏主意还是我错过了什么?

不幸的是,所有证据都指向是的。在另一个工作表中使用Application.Run运行函数似乎很糟糕,并且可能会损坏电子表格。

最新更新