Excel vba更改参数传递给函数

时间:2017-11-10 11:25:12

标签: excel vba excel-vba

假设我有一个带有两个Date参数的函数。然后我需要改变其中一个(比方说,我需要改变它的月份)。唯一的方法是将它重新分配给变量然后更改,还是可以通过参数名称引用它来改变它?

Function test(date1 As Date, date2 As Date, change As Boolean)
   If change=True Then
         date1 = DateSerial(year(date1), 10, day(date1))   'would it change date1's month or not?
   End If

   test=date1
End Function

2 个答案:

答案 0 :(得分:1)

它通常被认为是不改变输入的最佳做法,尽管没有什么可以阻止你这样做 - 这些参数被视为过程中的变量。简而言之,您可以轻松使用它。但是如果你有一个更长,更复杂的功能,并坚持不改变输入,你的代码就会变得更容易维护。

假设您从用户那里得到了一个日期,但是您想要回到最后一个语句日期,该日期始终是上个月的最后一天。您可以像

那样操纵参数
Public Function LastStatementAmount(ByVal inputDate As Date) As Double

    Dim Return_ As Double

    inputDate = DateSerial(Year(inputDate), Month(inputDate), 0)

    'do calculations here

    LastStatementAmount = Return_

End Function

这是有效的。但更好的方法是更改​​变量名称以反映您对值

所做的更改
Public Function LastStatementAmount(ByVal inputDate As Date) As Double

    Dim Return_ As Double
    Dim stmtDate As Date

    stmtDate = DateSerial(Year(inputDate), Month(inputDate), 0)

    'do calculations here

    LastStatementAmount = Return_

End Function

如果这是一个更大的功能,最好看到stmtDate并知道你已经修改了输入日期。

如注释中所提到的,不更改输入参数的另一个原因是,如果您没有指定传递机制,则默认情况下,参数是ByRef,并且如果调用过程期望该值没有改变,你可能会破坏代码。您应该始终指定ByVal或ByRef,以便清楚您的代码意图。

答案 1 :(得分:0)

在代码中,您可以使用Date1和Date2作为变量,因此您可以更改它们的值。 变量Date1和Date2在函数语句中声明,因此它们的范围纯粹是函数。因此担心在UDF的情况下改变输入是错误的 - 在其他任何地方都不存在Date1和Date2。 如果你在另一个例程中使用它,那么你确实可能冒这个风险,所以你要按值声明它们

功能测试(ByVal Date1 As Date,ByVal Date2 As Date,Change As Boolean)