我正在尝试编写一个函数,该函数将有一个 Range 作为可选参数。下面是此类函数的最小示例:
Function Example(s As String, Optional r As Range) As String
Example = "Test"
End Function
这没关系,可以编译 VBA 模块。但我正在努力找出如何为这个可选的范围参数设置默认值,例如"B:B"。
Function Example(s As String, Optional r As Range **= Range("B:B")**) As String
Example = "Test"
End Function
这不会编译。它抛出错误"需要常量表达式"。
检查参数是否在函数内部传递,如果没有,则将其设置在那里。
Function Example(s As String, Optional r As Range) As String
If r Is Nothing then Set r = Range("B:B")
Example = "Test"
End Function
谢谢,斯科特为我指明了道路。我进一步用谷歌搜索了这个,正确的方法似乎是这样的:
Function Example(s As String, Optional r As Range = Nothing) As String
If IsMissing(r) Then
r = Range("B:B")
End If
Example = "Test"
End Function
我无法理解为什么您可以为 pret 定义默认值
Scott 的答案可能是要走的路,但如果你真的希望能够在函数头中放置一个文字默认值,你可以将参数类型更改为 Variant
并为其分配默认String
,如果需要,将此字符串转换为函数主体中的范围:
Function Example(Optional R As Variant = "A:B") As String
If TypeName(R) = "String" Then Set R = Range(R)
Example = R.Address
End Function
测试如下:
Sub test()
Dim R As Range
Set R = Range("A1:B1")
Debug.Print Example()
Debug.Print Example(R)
End Sub
哪些打印:
$A:$B
$A$1:$B$1
在某些情况下,将范围或字符串传递给函数的灵活性可能很有用。例如,可以将命名区域的名称直接传递给函数,并使其按预期工作。