You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

类中使用Collection作为属性时出现‘参数不可选’编译错误

解决VBA中Collection类属性的编译错误

我帮你定位到问题根源了——这是VBA处理对象类型属性时的典型误区,直接导致了「Compile error: Argument not optional」的编译错误。具体来说:

Collection是对象类型,而你在类模块中用了针对值类型(比如字符串、数字)的Property Let来处理对象赋值,同时主代码里给对象属性赋值时也没加Set关键字,这两个点都是问题核心。

1. 修正EmployeeClass类模块的Vaca属性定义

对象类型的属性必须用Property Set来实现赋值逻辑,而不是Property Let;同时在Property Get中返回对象时,也必须用Set关键字。修改后的类模块代码如下:

Option Explicit
Dim vName As String
Dim vVaca As Collection

Public Property Get Name() As String
    Name = vName
End Property

Public Property Let Name(nme As String)
    vName = nme
End Property

Public Property Get Vaca() As Collection
    ' 返回对象类型必须使用Set关键字
    Set Vaca = vVaca
End Property

Public Property Set Vaca(vcl As Collection)
    ' 对象类型的赋值用Property Set替代Property Let
    Set vVaca = vcl
End Property

2. 修正主代码中的赋值语句

给对象类型的属性赋值时,必须加上Set关键字。把你主代码里的这一行:

employee.Vaca = emp_vacDates

替换成:

Set employee.Vaca = emp_vacDates

额外调试提示

你现在用Debug.Print employee.Vaca会直接报错,因为Collection是对象,无法直接打印。如果要查看它的内容,可以遍历集合:

Dim vacItem As Variant
For Each vacItem In employee.Vaca
    Debug.Print vacItem
Next vacItem

另外注意下emps集合的作用域:你现在在rowNum循环内部每次新建emps,如果想收集多个员工数据,应该把Set emps = New Collection移到rowNum循环的外面。

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

火山引擎 最新活动