我有一个循环,当 Excel 全速运行时,它会可靠地使 Excel 崩溃。如果在调试器中单步执行,则循环没有问题,并且会产生正确的输出。
Private Function ff_table() As String
Dim flt As CFlight
Dim s As String
Dim acft As String
On Error GoTo ff_tableErr
For Each flt In Me
If Not InStr(acft, flt.TailNum) > 0 Then
acft = acft & ";" & flt.TailNum
s = s & flt.ff_table_line & vbCrLf
End If
Next flt
ff_table = s
ff_tableExit:
Exit Function
ff_tableErr:
HandleError "CFlights.ff_table()"
Resume ff_tableExit
End Function
调用对象是一个自定义对象,我在下面包含了相关代码。
Friend Function ff_table_line() As String
Dim s As String
On Error GoTo ff_table_lineErr
s = Me.TailNum & "," & Me.Aircraft.Model & "," & Me.Aircraft.ACType & ",,,," & Me.Aircraft.AppsCategory
s = s & "," & Me.Aircraft.AppsClass & ",," & Me.Aircraft.Power & ",,,,"
s = s & ",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"
ff_table_line = s 'return value
ff_table_lineExit:
Exit Function
ff_table_lineErr:
HandleError "CFlight.ff_table_line()"
Resume ff_table_lineExit
End Function
此例程创建 CSV 文件的一行,从对象中提取各种属性并将它们存储在字符串中。这是一个非常简单的例程,缓慢运行时工作正常,但全速运行时会导致所有 Excel 崩溃。崩溃的形式是所有 Excel 窗口在没有警告的情况下关闭。代码中的异常处理没有得到执行。
我用谷歌搜索了很多次都没有结果。这可能是 Excel 中的迭代问题。
这是可迭代的代码:
Public Property Get NewEnum() As IUnknown
Attribute NewEnum.VB_UserMemId = -4
Attribute NewEnum.VB_MemberFlags = "40"
Set NewEnum = colFlights.[_NewEnum]
End Property
如果您能提供任何帮助,我们将不胜感激。
我所做的似乎解决了问题是在
For Each
循环中,在这个循环中,我删除了对自定义对象的引用,而只引用内部 Collection 对象,因此代码如下所示:
For Each flt In colFlights
这允许 vba 使用内置类型进行迭代,而不是在 vba 中使用
Me
构造,并且不会导致任何内存泄漏或崩溃。
Me
指的是类的特定实例,因此它“应该”可以接受使用,但这不是我第一次在使用这个构造时遇到困难,但这是我第一次尝试这个解决方法我很惊喜。
如果有人知道其中的“原因”,请发布答案,我将评估您的答案。