可以选择还是ActiveRange一个可选参数?

时间:2015-02-17 09:20:37

标签: excel vba excel-vba selection

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

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)

时也是如此

有可能做出我正在尝试的事情。

2 个答案:

答案 0 :(得分:3)

正如您所注意到的,您无法将可选参数默认为非常量。但是,如果将参数的变量类型更改为 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

如果您只是致电或运行Call Populate,则会确定 r 尚未传递给它并使用选择。如果 r (在这种情况下,一个或多个单元格的范围)被传递到子类Call Populate(Range("A1:D5")),它会使用它。

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

答案 1 :(得分:0)

您无法在过程参数中强制转换对象或分配变量。

这是一个更好的等待。

定义你的子

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

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

 Sub Main()
   PopulateSub Selection
End Sub