VBA自定义cRanges类Item方法失效问题求助
解决VBA自定义集合类Item方法的问题
嘿,我看到你在自定义cRanges集合类的Item方法上遇到了问题,咱们来拆解一下错误原因,再给出修正方案:
核心错误分析
你的cRanges类里的Item函数有两个关键问题:
- 返回对象时变量名拼写错误:函数定义的返回值是
Item,但你在赋值时写的是Set Items = m_Ranges.Item(i)——这里把Item写成了Items,导致函数没有正确返回对象,触发了"Object variable or with block variable not set"错误。 - 未处理索引无效的情况:当传入的
i不在1到集合Count的范围内时,函数没有返回任何对象,同样会导致对象未设置的错误。 - 参数类型建议优化:
i用Integer类型限制了集合的最大元素数(Integer最大值是32767),建议改成Long类型适配更大的集合。
修正后的Item方法代码
把cRanges类里的Item函数替换成下面的代码:
Public Function Item(i As Long) As cRange If i > 0 And i <= m_Ranges.Count Then ' 注意这里是Set Item,和函数名一致 Set Item = m_Ranges.Item(i) Else ' 可以选择抛出明确的错误提示,或者返回Nothing Err.Raise vbObjectError + 513, "cRanges.Item", "索引超出有效范围,请传入1到" & m_Ranges.Count & "之间的数值" ' 如果不想抛错,也可以用:Set Item = Nothing End If End Function
额外的潜在问题修正
你代码里的Remove方法也有问题:VBA的Collection.Remove方法不支持直接传入对象,只能通过索引或键移除元素。如果要按cRange对象移除,可以改成遍历集合查找的方式:
Public Sub Remove(r As cRange) Dim idx As Long For idx = 1 To m_Ranges.Count ' 用Is判断对象是否相同 If m_Ranges.Item(idx) Is r Then m_Ranges.Remove idx Exit Sub End If Next idx ' 如果没找到对象,抛出错误提示 Err.Raise vbObjectError + 514, "cRanges.Remove", "未找到要移除的cRange对象" End Sub
测试修正后的代码
现在运行你的main过程,rr.Item(1).high就能正常输出"9"了~
内容的提问来源于stack exchange,提问作者Helloguys
相关产品推荐
相关产品推荐

