Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
键入开括号时Excel崩溃_Excel_Vba_Vbe - Fatal编程技术网

键入开括号时Excel崩溃

键入开括号时Excel崩溃,excel,vba,vbe,Excel,Vba,Vbe,有一个我不明白 给定该类模块(精简到再现崩溃所需的最低限度): 有谁能告诉我,为什么我键入以下代码时Excel会完全失效: Sub MakeExcelCrash() With TestCrashClass( 在这一点上,我要传达一个可爱的信息: 即使我输入了一个完整的过程,但没有出现错误的括号,然后尝试稍后添加它们,我也会遇到同样的崩溃 让Excel不崩溃的唯一方法是将一组()从其他地方复制/粘贴到这行代码 Sub MakeExcelCrash() With TestCr

有一个我不明白

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

有谁能告诉我,为什么我键入以下代码时Excel会完全失效:

Sub MakeExcelCrash()
    With TestCrashClass(
在这一点上,我要传达一个可爱的信息:

即使我输入了一个完整的过程,但没有出现错误的括号,然后尝试稍后添加它们,我也会遇到同样的崩溃

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

 Sub MakeExcelCrash()
     With TestCrashClass()
         Debug.Print .Data
     End With
 End Sub
如果
Init()
方法有一个参数,甚至是一个可选参数,那么在键入开始参数时它不会崩溃


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

听起来像是某种腐败。我以前有过Excel这样不合理的行为,通常在大型项目中,唯一的解决方法是将所有类等拖到一个新项目中

我怀疑这是因为Excel没有真正删除已删除的类、模块、工作表等。由于文件的大小,您可以看出这一点


据我所知,Access中没有压缩和修复功能,

正如@TimWilliams所指出的,它有一个返回同一类实例的默认成员(或一个类循环,例如
ParentClass.ChildClass.ParentClass.ChildClass…
其中ParentClass和ChildClass都有默认成员),当在某些语法情况下使用时,例如带有块的
将导致VBE尝试解析默认成员

第一个圆括号使VBE假设必须有一个方法、索引的
get
或数组索引将接受一个参数,因此它开始解析最终目标成员

因此,不完整的行,光标位于括号后:

With TestCrashClass(
实际上与以下内容相同:

With TestCrashClass.Init.Init.Init.Init.Init.Init.Init.Init.Init.Init.Init.Init.Init.Init.Init.Init.Init.Init.Init.Init.Init.Init.Init.Init.Init.Init.Init.Init.Init.Init.Init.Init.Init.Init.Init.Init.Init.Init.Init.Init.Init.Init.Init.Init.Init.Init.Init.Init.Init.Init.Init.Init.Init.Init.Init.Init.Init '....You're inquisitive scrolling this far over, but you get the point.
在某个时刻,您的系统或VBE耗尽了资源,并以热核集团拥抱的优雅和平衡退出


+1用于即兴使用括号对的副本/面食。

您甚至不需要
with
块。在类名取下Excel后尝试键入

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

EXCEL.EXE中0x0F06EC84(VBE7.DLL)处未处理的异常:0xC00000FD: 堆栈溢出(参数:0x00000001、0x00212FFC)

使用TestCraseC类()键入<代码>时,发生的是VBA开始在缺省属性上查找<强>索引器< /强>,因为In()>代码>没有任何属性。例如,考虑<代码>集合< /代码>。您可以使用默认属性(<代码>项目< /代码>)这样的索引器:

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

键入时Excel是否提供某种自动完成功能?我想,如果将创建类实例的方法作为默认方法,则会创建一个无限循环。键入该行时,可能会对类的代码进行一些评估…该方法的目的是什么?我想既然您使用了
Init
t作为默认成员,VBE将基于此尝试为您提供一个Intellisense下拉列表-一旦尝试这样做,它将进入无限循环(因为
Init
的返回值是同一类的另一个实例,也具有同一个默认成员,依此类推……)和Excel崩溃。鉴于行是冗余的,我假设如果您忽略将tcc设置为新TestCrashClass
并将
Set-Init=tcc
更改为
Set-Init=tcc
,则会出现相同的问题。您是想在使用默认实例时获得一个单例
TestCrashClass
,还是想运行
Init
我的事情也发生在一个全新的项目上。好吧,这很有意义。谢谢你提供的详细信息。我必须承认我确实一直向右滚动,只是为了看看你会走多远。谢谢!
Private Sub Class_Initialize()
    Class_Initialize
End Sub