如何为可选的Range参数设置默认值?

时间:2018-01-18 14:26:50

标签: excel-vba vba excel

我正在尝试编写一个将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

这不编译。它抛出错误“需要常量表达式。”

3 个答案:

答案 0 :(得分:5)

检查参数是否在函数内部传递,如果没有则将其设置在那里。

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

答案 1 :(得分:3)

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

在某些情况下,将范围或字符串传递给函数的灵活性可能很有用。例如,您可以将命名范围的名称直接传递给函数,并使其按预期工作。

答案 2 :(得分:3)

谢谢,斯科特给我指路。我进一步搜索了这个,正确的方法似乎是这样的:

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

定义默认值