我一直在尝试在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)
有可能做出我正在尝试的事情。
答案 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