假设我有一个带有两个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
答案 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)