You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:49:02