Selection 或 ActiveRange 可以是可选参数吗?

Can be Selection or ActiveRange an optional parameter?

我一直在尝试为 excel 在 VBA 中写下一些代码片段。 我试着做这个:

Sub populate(Optional ByVal r As Range = Selection)
'
' This only populates a selected range with each row number 
' 
   Dim a As Range
    For Each a In r
        a = a.Row
    Next

End Sub

但是当我 运行 它说我必须使可选参数必须是常量。当我称它为 populate(Selection)populate(ActiveRange)

时相同

有可能做出我正在尝试的东西。

您不能在过程参数中转换对象或分配变量。

最好稍等片刻。

定义你的子

Sub populateSub(r As Range)
    For Each a In r
        a = a.Row
    Next 
End Sub

并从另一个子调用它。按照惯例,人们使用一个名为 Main.

的 sub
 Sub Main()
   PopulateSub Selection
End Sub

如您所见,您不能将可选参数默认为非常量。但是,如果将参数的变量类型更改为 Variant,则可以使用 IsMissing 函数来确定值是否已传递给 sub,如果没有则重新分配它。

Sub Populate(Optional r As Variant)
    If IsMissing(r) Then Set r = Selection
    Dim a As Range
    For Each a In r
        a = a.Row
    Next
    Set r = Nothing
End Sub

如果简单的调用or运行Call Populate,则判断r没有传给它,使用Selection。如果 r(在本例中是一个或多个单元格的范围)像 Call Populate(Range("A1:D5")) 一样被传递到 sub 中,它会使用它。

有关详细信息,请参阅 IsMissing function