Excel宏填充自定义对象数组报错:对象变量或With块变量未设置
解决VBA自定义对象数组的“Object variable or with block variable not set”错误
我来帮你搞定这个问题!你遇到的这个错误,大概率是因为对象数组没正确初始化,或者数组里的每个自定义对象没有被实例化。咱们结合你的代码一步步修正:
先分析你现有代码的问题
- 你声明了返回
ClsRegisteredFood()数组的函数,但没有给数组分配存储空间 - 没有用
New关键字创建每个ClsRegisteredFood的实例,直接往数组里塞空引用肯定会报错 - 你的
Range("...")引用不完整,导致dataRegisteredFood对象没被正确赋值
修正后的完整代码
假设你的ClsRegisteredFood类有FoodName、Calories这类属性(你可以根据实际属性调整),以下是可以正常运行的版本:
Option Explicit Public Function ArrayLen(arr As Variant) As Integer ArrayLen = UBound(arr) - LBound(arr) + 1 End Function Function loadRegisteredFood() As ClsRegisteredFood() ' 直接引用工作表,避免用Activate(容易出问题) Dim wsFoods As Worksheet Set wsFoods = ThisWorkbook.Worksheets("Foods") ' 动态获取数据区域(假设表头在A1,数据从A2开始) Dim dataRegisteredFood As Range Set dataRegisteredFood = wsFoods.Range("A2", wsFoods.Cells(wsFoods.Rows.Count, "A").End(xlUp)) Dim foodCount As Integer foodCount = dataRegisteredFood.Rows.Count ' 处理空数据的情况,返回空数组 Dim foodArr() As ClsRegisteredFood If foodCount = 0 Then ReDim foodArr(0 To -1) loadRegisteredFood = foodArr Exit Function End If ' 初始化对象数组,分配对应大小的空间 ReDim foodArr(1 To foodCount) Dim i As Integer For i = 1 To foodCount ' 核心!必须实例化每个自定义对象,否则会报对象未设置错误 Set foodArr(i) = New ClsRegisteredFood ' 给对象属性赋值,根据你的类属性修改列号和属性名 foodArr(i).FoodName = dataRegisteredFood.Cells(i, 1).Value foodArr(i).Calories = dataRegisteredFood.Cells(i, 2).Value ' 其他属性继续添加...比如foodArr(i).Category = dataRegisteredFood.Cells(i,3).Value Next i ' 返回填充好的对象数组 loadRegisteredFood = foodArr End Function
关键修正点说明
- 不要用Activate:直接通过
ThisWorkbook.Worksheets("Foods")引用工作表,比切换激活工作表稳定得多,不会因为用户手动切换工作表出问题 - 初始化数组空间:用
ReDim根据数据行数给数组分配空间,确保有地方放对象 - 实例化每个对象:每次循环都用
Set foodArr(i) = New ClsRegisteredFood创建新的对象实例——这是解决错误的核心,没有这一步,数组里的元素只是空的对象引用,不是实际存在的对象 - 动态获取数据范围:避免硬编码单元格范围,自动从A2往下找最后一行有数据的单元格,适配数据量变化
内容的提问来源于stack exchange,提问作者sliders_alpha
相关产品推荐
相关产品推荐

