Excel2016 VBA声明自定义rangeDic类对象触发崩溃原因咨询
问题原因
- 该问题本质是Excel 2016对应VBA7.1版本的已知运行时bug,和代码逻辑本身没有直接关联。触发条件为早绑定的自定义类对象,通过
Property Let直接给字符串数组成员赋值动态数组时,VBA内部内存处理逻辑出错,直接导致VB7.dll崩溃,也就是你在事件日志中看到的错误1000。 - 声明为
Object类型属于晚绑定场景,该场景下属性调用的内存处理逻辑和早绑定不同,刚好避开了这个bug,所以不会触发崩溃。 - 你的代码存在一处逻辑缺陷:
createRangeDic函数中循环写死为For i = 0 To 5,如果传入的zones数组长度不等于6会触发下标越界错误,需要修正。
修复方案
你可以选择任意一种方案规避崩溃问题:
- 方案1:保持现有晚绑定写法,继续用
Dim obje As Object声明对象,除了没有代码智能提示外,功能不受任何影响,是成本最低的解决方案。 - 方案2:修改类的数组赋值逻辑,不用
Property Let直接传数组,改为新增类方法实现赋值:
在rangeDic类模块中添加以下代码:
Public Sub setZone(a() As String) zone = a End Sub
调用时将obje.pZone = zones()改为obje.setZone zones(),早绑定场景下即可正常运行。
- 方案3:修改
pZone的Property Let参数类型为Variant,兼容数组传入:
将类中pZone的Let属性修改为:
Property Let pZone(a As Variant) If IsArray(a) Then zone = a End Property
调用时保持原有写法不变,早绑定场景下也不会触发崩溃。
另外请修正写死的循环代码,替换为动态遍历数组边界:
For i = LBound(zones) To UBound(zones) obje.linkDico.Add zones(i), vals(i) Next i
内容的提问来源于stack exchange,提问作者MirageHF
相关产品推荐
相关产品推荐

