类中使用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




