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
相关产品推荐
相关产品推荐

