Vba 将集合用作类中的属性(参数不是可选的)

Vba 将集合用作类中的属性(参数不是可选的),vba,excel,class,collections,Vba,Excel,Class,Collections,我试图将日期集合用作类属性,但遇到了问题。基本上,我想在emp\u vacDates中存储多个vacLocation,并将其输入employee.Vaca 我与Employee.Name一起工作没有问题 我得到的错误是 编译错误:参数不是可选的 在VacaLet语句中 我的代码是: Sub Vacation() Dim i As Integer Dim rowNum As Long: rowNum = 5 Dim colNum As Long: colNum = 4

我试图将日期集合用作类属性,但遇到了问题。基本上,我想在
emp\u vacDates
中存储多个
vacLocation
,并将其输入
employee.Vaca

我与
Employee.Name一起工作没有问题

我得到的错误是

编译错误:参数不是可选的

Vaca
Let语句中

我的代码是:

Sub Vacation()
    Dim i As Integer
    Dim rowNum As Long: rowNum = 5
    Dim colNum As Long: colNum = 4
    Dim onePersonLoop As Range
    Dim nameLocation As Range
    Dim vacLocation As Range
    Dim emp_vacDates As Collection
    Dim emps As Collection
    Dim employee As EmployeeClass

    For i = 2 To 2
        With ActiveWorkbook.Worksheets(i)

            Set onePersonLoop = .Cells(rowNum, colNum).Offset(-1).End(xlToRight).Offset(, -2)
            Set emps = New Collection
            For rowNum = 5 To 5

                Set nameLocation = .Cells(rowNum, colNum).Offset(-1, -1).EntireRow.Cells(1, 2)
                Set employee = New EmployeeClass
                employee.Name = nameLocation.Value
                Set emp_vacDates = New Collection

                For colNum = 4 To 6

                    Set vacLocation = .Cells(rowNum, colNum).Offset(-3)
                    If .Cells(rowNum, colNum) = "v" Or .Cells(rowNum, colNum) = "V" Then
                        emp_vacDates.Add vacLocation.Value
                    End If
                Next colNum

                employee.Vaca = emp_vacDates
                emps.Add employee

                Debug.Print employee.Name
                Debug.Print employee.Vaca

            Next rowNum

        End With
    Next i
End Sub
我的EmployeeClass模块设置如下

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
    Vaca = vVaca
End Property

Public Property Let Vaca(vcl As Collection)
    vVaca = vcl
End Property

集合应
设置
。 像这样:

Public Property Get Vaca() As Collection
    Set Vaca = vVaca
End Property

Public Property Let Vaca(vcl As Collection)
    Set vVaca = vcl
End Property
此外,您不能像这样仅调试.打印集合:

Public Function VacaToString(Optional index = 1) As String

    If Vaca.Count = 0 Then
        VacaToString = 0
    Else
        VacaToString = Vaca(index)
    End If

End Function
Debug.Print employee.VacaToString
Debug.Print employee.Vaca

尝试在那里做其他事情,例如:

Debug.Print employee.Vaca.Item(1)
或者编写一个函数,检查集合中是否有项,如果没有项,则打印
0
。大概是这样的:

Public Function VacaToString(Optional index = 1) As String

    If Vaca.Count = 0 Then
        VacaToString = 0
    Else
        VacaToString = Vaca(index)
    End If

End Function
Debug.Print employee.VacaToString
然后可以调试。按如下方式打印:

Public Function VacaToString(Optional index = 1) As String

    If Vaca.Count = 0 Then
        VacaToString = 0
    Else
        VacaToString = Vaca(index)
    End If

End Function
Debug.Print employee.VacaToString

vVaca
vcl
都属于
Collection
类型,是一个对象。 对象必须使用
set

Public Property Get Vaca() As Collection
    Set Vaca = vVaca
End Property

Public Property Let Vaca(vcl As Collection)
    Set vVaca = vcl
End Property

只是一个问题:为什么对rowNum=5到5使用循环
,对i=2到2使用循环
,而不使用循环?这是一个非常无用的循环。我希望这只是一个测试用例?是的,测试用例。我不想在我弄明白的时候把整个事情都说出来