每个循环的 VBA 都会导致 Excel 崩溃

问题描述 投票:0回答:1

我有一个循环,当 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

如果您能提供任何帮助,我们将不胜感激。

excel vba loops object
1个回答
0
投票

我所做的似乎解决了问题是在

For Each
循环中,在这个循环中,我删除了对自定义对象的引用,而只引用内部 Collection 对象,因此代码如下所示:

    For Each flt In colFlights

这允许 vba 使用内置类型进行迭代,而不是在 vba 中使用

Me
构造,并且不会导致任何内存泄漏或崩溃。

Me
指的是类的特定实例,因此它“应该”可以接受使用,但这不是我第一次在使用这个构造时遇到困难,但这是我第一次尝试这个解决方法我很惊喜。

如果有人知道其中的“原因”,请发布答案,我将评估您的答案。

© www.soinside.com 2019 - 2024. All rights reserved.