VBA编译错误:给类属性赋值字符串时报“需要对象”错误
问题成因
这个错误是VBA属性过程语法使用不规范导致的,核心规则如下:
- VBA中
Property Set过程仅用于定义对象类型属性的赋值逻辑,字符串、数值、布尔值等值类型属性的赋值逻辑,必须使用Property Let过程定义。 - 给值类型属性赋值时,语句前不能加
Set关键字;Set关键字仅在给对象变量、对象类型属性赋值时使用。
你的代码存在两个不规范点:
- 类中存储的
m_curriculum_object_name是String值类型,但错误使用Property Set定义了该属性的写逻辑。 - 最初的赋值语句
Set cls_curriculum_object.curriculum_object_name = Trim(ActiveCell.FormulaR1C1)能运行属于巧合:VBA对单元格返回的Variant值做了隐式类型包装,暂时绕过了编译检查,但写法本身不符合语法要求。 - 当你直接赋值字符串常量
"foo"时,编译器可以直接识别到该值是纯字符串、不属于对象类型,Set关键字后无法接收非对象值,因此直接抛出"需要对象"的编译错误。
修复方法
按以下两步调整代码即可:
- 修改类模块的属性定义,将值类型属性的写过程从
Property Set改为Property Let,同时给属性过程加上明确的返回/参数类型,避免隐式类型转换带来的意外问题:
' 类模块:cls_curriculum_object Private m_curriculum_object_name As String ' 读属性 Public Property Get curriculum_object_name() As String curriculum_object_name = m_curriculum_object_name End Property ' 值类型属性的写过程用Property Let Public Property Let curriculum_object_name(ByVal curriculum_object_name As String) m_curriculum_object_name = curriculum_object_name End Property
- 修改调用处的赋值语句,去掉值类型属性赋值前多余的
Set关键字:
' 按钮触发逻辑 Dim cls_curriculum_object As cls_curriculum_object Set cls_curriculum_object = New cls_curriculum_object ActiveSheet.Cells(ActiveCell.Row, 4).Select ' 值类型赋值不需要加Set cls_curriculum_object.curriculum_object_name = Trim(ActiveCell.FormulaR1C1) ' 直接赋值字符串常量可正常编译运行 cls_curriculum_object.curriculum_object_name = "foo"
补充说明
VBA三类属性过程的适用场景可以按以下规则区分,后续写自定义类时可避免同类错误:
Property Get:所有类型属性的读取逻辑都用该过程定义Property Let:仅用于值类型(字符串、数值、日期、布尔值等)属性的写入逻辑Property Set:仅用于对象类型(工作表、单元格、自定义类实例等)属性的写入逻辑,对应赋值语句前必须加Set关键字
内容的提问来源于stack exchange,提问作者Henry Maher
相关产品推荐
相关产品推荐

