gpt4 book ai didi

输入左括号时 Excel 崩溃

转载 作者:行者123 更新时间:2023-12-01 18:34:53 25 4
gpt4 key购买 nike

这是我不明白的。

给定此类模块(精简到重现崩溃所需的最低限度):

VERSION 1.0 CLASS
BEGIN
MultiUse = -1 'True
END
Attribute VB_Name = "TestCrashClass"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Option Explicit

Public Function Init() As TestCrashClass
Attribute Init.VB_UserMemId = 0
Dim tcc As New TestCrashClass
Set Init = tcc
End Function

Public Property Get Data() As String
Data = "test data"
End Property

谁能告诉我为什么当我输入这段代码时 Excel 完全崩溃了:

Sub MakeExcelCrash()
With TestCrashClass(

此时,我收到一条可爱的消息:

Excel crash - oops!

即使我输入一个完整的过程而不使用有问题的括号,然后尝试稍后添加它们,我也会遇到同样的崩溃。

让 Excel 不崩溃的唯一方法是将一组 () 从其他地方复制/粘贴到这行代码。

 Sub MakeExcelCrash()
With TestCrashClass()
Debug.Print .Data
End With
End Sub

如果 Init() 方法有一个参数(即使是可选参数),则在键入左括号时它不会崩溃。

我更好奇为什么会发生这种情况,而不是解决它的方法;它实际上在我的代码中并不经常出现,当它出现时,我可以通过改变方法来修复它,但我真的很沮丧,因为我不知道是什么导致了这些崩溃。那么也许更了解 VBA 内部工作原理的人可以向我解释一下?

最佳答案

您甚至不需要 With block 。 任何尝试在类名后键入 ( 都会导致 Excel 崩溃。

问题是您将 VB_PredeclaredId 设置为 true 并且默认成员试图返回自身。当您将调试器附加到即将崩溃的 Excel 实例时,您可以看到根本问题是堆栈溢出:

Unhandled exception at 0x0F06EC84 (VBE7.DLL) in EXCEL.EXE: 0xC00000FD: Stack overflow (parameters: 0x00000001, 0x00212FFC).

当您键入 With TestCrashClass() 时,VBA 会开始在默认属性上查找索引器,因为 Init() 没有任何属性。例如,考虑一个 Collection。您可以使用默认属性的 (Item) 索引器,如下所示:

Dim x As Collection
Set x = New Collection
x.Add 42
Debug.Print x(1) '<--indexed access via default member.

这与 Debug.Print x.Items(1) 完全相同。这就是你开始遇到问题的地方。 Init() 没有参数,因此 VBA 开始向下钻取默认成员以查找第一个具有索引器的成员,以便 IntelliSense 可以显示参数列表。它开始这样做:

x.[默认].[默认].[默认].[默认].[默认]...

在您的情况下,它会创建一个无限循环,因为[default]返回x。同样的事情发生在上面的 Collection 代码中(除了它找到一个):

IntelliSense on open parens

考虑到您有一个默认实例,最终结果如下所示:

Private Sub Class_Initialize()
Class_Initialize
End Sub

关于输入左括号时 Excel 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42075908/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com