VB6函数返回值赋值时出现‘Object required’错误求助
分析VB6函数中"Object required"编译错误的原因
咱们一步步拆解你遇到的问题:你的Case "-new"分支存在两个关键问题,其中直接触发错误的是未初始化的动态数组,另一个是数组扩容的逻辑漏洞:
1. 未初始化的动态数组导致赋值失败
当allProcess集合里没有任何tmp.isNew为True的项时,循环内的ReDim result(i + 1)和Set result(i) = tmp代码完全不会执行。此时result只是一个声明了但未分配内存的动态Variant数组(Dim result() As Variant仅做声明,不会自动分配空间)。
在VB6中,用Set语句把未初始化的动态数组赋值给Variant变量时,就会触发"Object required"错误——因为VB6无法将一个没有内存空间的数组识别为有效的赋值对象。
2. 数组扩容逻辑的漏洞(次要但必须修复)
哪怕有符合条件的项,当前的ReDim result(i + 1)写法也有严重问题:
- 每次执行
ReDim都会清空数组里已有的元素(除非加Preserve关键字),导致之前找到的符合条件的TableInfo对象全部丢失。 - 用循环变量
i来确定数组大小完全不合理:i是遍历allProcess的索引,和符合条件的项的数量无关,会导致数组里出现大量未赋值的Empty元素,还浪费内存。
修复方案
修改Case "-new"分支的代码,正确处理数组初始化和扩容:
方案一:先统计数量再初始化数组(更高效)
Case "-new" Dim matchCount As Integer matchCount = 0 ' 先统计符合条件的项数量 For i = 0 To allProcess.Count - 1 ' 注意:索引范围是0到Count-1,避免越界 Dim tmp As TableInfo Set tmp = allProcess(i) If tmp.isNew Then matchCount = matchCount + 1 End If Next i ' 初始化数组(即使没有匹配项,也要分配空数组) If matchCount > 0 Then ReDim result(matchCount - 1) matchCount = 0 ' 重置计数器用于赋值 For i = 0 To allProcess.Count - 1 Set tmp = allProcess(i) If tmp.isNew Then Set result(matchCount) = tmp matchCount = matchCount + 1 End If Next i Else ReDim result(-1) ' 分配空数组,避免未初始化 End If Set GetProcessParams = result Exit Function
方案二:动态扩容(用Preserve保留已有元素)
Case "-new" Dim resultIndex As Integer resultIndex = -1 ' 初始化为空数组状态 ReDim result(resultIndex) For i = 0 To allProcess.Count - 1 Dim tmp As TableInfo Set tmp = allProcess(i) If tmp.isNew Then resultIndex = resultIndex + 1 ReDim Preserve result(resultIndex) ' 保留已有元素并扩容 Set result(resultIndex) = tmp End If Next i Set GetProcessParams = result Exit Function
额外提醒:原代码里的For i = 0 To allProcess.Count会导致索引越界,因为集合的索引通常从0开始,最大索引是Count - 1,一定要修正这个循环范围。
内容的提问来源于stack exchange,提问作者Oscar
相关产品推荐
相关产品推荐

