excel - 在代码段上出现 "Argument not optional"错误

标签 excel vba

我在这个 Sub 上不断收到“Argument not optional”。 .Add单词也总是被突出显示。

我试过使用 Set并在 Sub 和调用函数中声明集合。将参数设置为 ByRef也不是 Optional也可以。

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)
...

最佳答案

问题来了:

descriptions.Add = {expression}

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

从语法上讲,如下所示:
  • 采取descriptions收藏
  • 调用它的Add没有任何参数的方法(编译错误:参数不是可选的)
  • 获取返回值(没有返回值,但这在语法上无关紧要),并假设它是一个具有默认属性的对象,将其分配给 = 右侧的表达式运算符(operator)。

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

    删除 =运营商,你会得到这个:
    descriptions.Add {expression}
    

    如下:
  • 采取description收藏
  • 调用它的Add方法,通过{expression}作为参数


  • 这也是一个问题:
    getDescriptions (descriptions)
    

    去掉括号;他们强制对象引用被评估为值表达式 - 和 Collection类的默认属性(在表达式评估期间让强制对象时调用)是其参数化 Item(Index)成员(member),你不能合法地这样做。请注意,如果默认属性未参数化,您将传递其值 ByVal , 不管 getDescriptions指定 ByRef .

    那说descriptions参数只需要传ByRef因为您正在使用 Set 重新分配对象引用本身声明 - 与全局变量有关的一个相当容易出错的事情。

    关于excel - 在代码段上出现 "Argument not optional"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56655321/

    相关文章:

    vba - Excel VBA - 调整颜色线和 X 轴间隔

    VB.Net Excel Addin,如何按名称将数据写入特定工作表?

    excel - 请优化 - 绝对初学者

    excel - xlsx格式的不同语言的Excel公式名称

    Java、Apache POI、从 MS Excel 中查看时单元格值不会改变

    vba - Word VBA Selection.TypeText 和 Selection.InsertParagraph 以错误的顺序插入文本

    vba - 在特定条件下保持细胞不变

    R - 类似 COUNTIFS 的函数

    vba - 使用 VBA 添加或更改 Power Pivot 数据连接

    excel - 在不打开工作簿的情况下检查工作表是否受密码保护