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

VBA解析列表值至数组时触发'Object Required'错误:首次执行成功二次执行失败

解决VBA中解析列表触发的'Object Required'错误

你遇到的这个Object Required错误,根源其实非常简单——变量名拼写错误!看你代码里的这一行:

DutyTest(i) = sht2.Range("A" & numRow).Offset(1, 1).Value

你之前明明定义并赋值了工作表变量sh2(Set sh2 = Sheets(2)),但这里却写成了sht2。这个未定义的变量默认是Nothing,当你尝试访问它的Range属性时,自然会抛出"对象必需"的错误,和返回值是百分比还是字符串完全没关系。

另外你的代码还有几个可以优化的点,比如循环结构冗余、缺少匹配失败的容错处理,我整理了修正并优化后的版本:

Sub Run_Click()
    Dim ArrVal() As Variant
    Dim DateRange As Range
    Dim ComValue() As Variant
    Dim LastRow As Long
    Dim i As Long
    Dim numRow As Variant
    Dim sh2 As Worksheet
    Dim ConvertVal As String
    Dim DutyTest() As Variant
    
    Set sh2 = Sheets(2)
    With Sheets("Sheet1")
        LastRow = .Range("A" & .Rows.Count).End(xlUp).Row - 7
        ' 先判断是否有可处理的数据,避免数组维度错误
        If LastRow <= 0 Then
            MsgBox "没有可处理的数据行"
            Exit Sub
        End If
        
        ReDim Preserve ComValue(1 To LastRow)
        ReDim Preserve ArrVal(1 To LastRow)
        ReDim Preserve DutyTest(1 To LastRow)
        Set DateRange = .Range("A8:A" & 7 + LastRow)
        
        i = 1
        ' 移除冗余的外层Do While,直接用For Each遍历目标范围
        For Each RowCount In DateRange
            ComValue(i) = .Range("A" & i + 7).Value
            ConvertVal = CStr(ComValue(i))
            numRow = Application.Match(ConvertVal, sh2.Range("A1:A990000"), 0)
            
            ' 增加匹配失败的容错处理
            If Not IsError(numRow) Then
                ArrVal(i) = sh2.Range("A" & numRow).Offset(0, 2).Value
                ' 修正变量名:sht2 → sh2
                DutyTest(i) = sh2.Range("A" & numRow).Offset(1, 1).Value
            Else
                ArrVal(i) = "未找到匹配"
                DutyTest(i) = "未找到匹配"
            End If
            
            i = i + 1
        Next RowCount
        
        ' 把结果写入操作移到循环外,只执行一次,提升效率
        .Range("B8").Resize(UBound(ArrVal), 1).Value = Application.Transpose(ArrVal)
        ' 如果需要写入DutyTest的结果,可以添加这行
        ' .Range("C8").Resize(UBound(DutyTest), 1).Value = Application.Transpose(DutyTest)
    End With
ErrorHandler:
    ' 可选:添加错误提示逻辑
    ' If Err.Number <> 0 Then
    '     MsgBox "错误代码:" & Err.Number & vbCrLf & "错误描述:" & Err.Description
    '     Err.Clear
    ' End If
End Sub

补充说明你之前疑惑的类型问题:
VBA的Variant类型数组可以自动兼容数值、百分比、字符串等不同类型的数据,所以百分比转字符串或者字符串赋值给数组,完全不会触发"Object Required"错误,这次的问题就是纯粹的变量名拼写失误。

内容的提问来源于stack exchange,提问作者Drawleeh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 23:53:12