在代码段上出现“参数不可选”错误

时间:2019-06-18 18:51:08

标签: excel vba

在此Sub上,我不断收到“参数不可选”的信息。 .Add一词也总是突出显示。

我尝试使用Set并在Sub和调用函数中声明集合。将参数设置为ByRefOptional都可以。

Sub getDescriptions(ByRef descriptions As Collection)
    Dim i As Integer
    i = 0
    Set descriptions = New Collection
    Do While Cells(i + 3, 1).Value <> "" And Cells(i + 3, 2).Value <> ""
        descriptions.Add = Cells(i + 3, 2).Value & " - Test Period " & Cells(i + 3, 4).Value & " - " & Cells(i + 3, 5).Value
        i = i + 1
    Loop
End Sub

Public descriptions as Collection

Private Sub UserForm_Initialize()    'calling Sub
    With Application.ActiveWindow
        Me.Left = .Left + (.Width - Me.Width) / 2
        Me.Top = .Top + (.Height - Me.Height) / 2
    End With
    Set descriptions = New Collection
    getDescriptions (descriptions)
...

1 个答案:

答案 0 :(得分:3)

有问题:

descriptions.Add = {expression}

您正在调用没有任何参数的Add方法,然后尝试将赋值给它的返回值(我认为它没有一个)。

从语法上讲,如下:

  • 参加descriptions收藏
  • 不带任何参数调用其Add方法(编译错误:参数不是可选的)
  • 获取返回值(不存在一个返回值,但是在语法上不相关),并假设它是具有默认属性的对象,请将其分配给=运算符右侧的expresion。

如果Add方法不需要任何参数并返回了对象引用,则您的代码可能有效。由于它没有具有非可选参数,并且不返回任何内容,因此是编译错误。

删除=运算符,您将获得以下信息:

descriptions.Add {expression}

如下:

  • 参加description收藏
  • 调用其Add方法,将{expression}作为参数传递

这也是一个问题:

getDescriptions (descriptions)

删除括号;它们会强制将对象引用作为值表达式进行评估-并且Collection类的默认属性(在表达式评估期间让对象强制执行时调用)为其参数化的Item(Index)成员,您可以'合法地这样做。请注意,如果未设置默认属性,则无论ByVal是否指定getDescriptions,都将传递其值ByRef

descriptions参数只需要传递ByRef,因为您正在使用该Set语句为对象引用本身重新分配-一个相当小的错误,容易与全局变量有关。