Function 为什么函数告诉我类型不匹配?
我正在尝试使以下函数正常工作:Function 为什么函数告诉我类型不匹配?,function,ms-access,vba,Function,Ms Access,Vba,我正在尝试使以下函数正常工作: Private Function FirstOfMonth(MonthsAgo As Integer) As Date FirstOfMonth = DateSerial(Year(Now()), Month(Now() - MonthsAgo), 1) End Function 我传入一个值,如下所示: FirstOfMonth(4) 该函数的目的是返回“MonthsAgo”数月前的第一个月的日期 但是,每当我运行它时,它都会告诉我类型不匹配 我是编程新
Private Function FirstOfMonth(MonthsAgo As Integer) As Date
FirstOfMonth = DateSerial(Year(Now()), Month(Now() - MonthsAgo), 1)
End Function
我传入一个值,如下所示:
FirstOfMonth(4)
该函数的目的是返回“MonthsAgo”数月前的第一个月的日期
但是,每当我运行它时,它都会告诉我类型不匹配
我是编程新手,所以如果有人能给我指出错误的方向,我将非常感激。这使我解决一个相当简单的问题的速度变慢了。您必须将FirstOfMonth(4)传递到“Date”变量中您必须将FirstOfMonth(4)传递到“Date”变量中我想您要做的是:
' Note the brackets change around 'Month(Now()) - MonthsAgo'
FirstOfMonth = DateSerial(Year(Now()), Month(Now()) - MonthsAgo, 1)
然而,即使这样也不行。考虑月份是一月(1)的情况。在这种情况下,您将以日期2012/-3/1
结束,这显然完全是胡说八道
您将需要使用以下功能:
DateAdd("m", 4, Now())
所以你的整个函数看起来像
Private Function FirstOfMonth(MonthsAgo As Integer) As Date
Dim newDate
newDate = DateAdd("m", 0 - MonthsAgo , Now())
FirstOfMonth = DateSerial(Year(newDate), Month(newDate), 1)
End Function
我想你想做的是:
' Note the brackets change around 'Month(Now()) - MonthsAgo'
FirstOfMonth = DateSerial(Year(Now()), Month(Now()) - MonthsAgo, 1)
然而,即使这样也不行。考虑月份是一月(1)的情况。在这种情况下,您将以日期2012/-3/1
结束,这显然完全是胡说八道
您将需要使用以下功能:
DateAdd("m", 4, Now())
所以你的整个函数看起来像
Private Function FirstOfMonth(MonthsAgo As Integer) As Date
Dim newDate
newDate = DateAdd("m", 0 - MonthsAgo , Now())
FirstOfMonth = DateSerial(Year(newDate), Month(newDate), 1)
End Function
问题在于这一点:
Month(Now() - MonthsAgo)
应该是:
Month(Now()) - MonthsAgo
在第一个例子中,Now()返回一个Date类型的值,然后尝试从中减去一个整数,这导致了类型不匹配
在第二个月,将以整数形式返回Now()返回的日期的月份部分。然后你可以从这个整数中减去一个月。问题出在这一位:
Month(Now() - MonthsAgo)
应该是:
Month(Now()) - MonthsAgo
在第一个例子中,Now()返回一个Date类型的值,然后尝试从中减去一个整数,这导致了类型不匹配
在第二个月,将以整数形式返回Now()返回的日期的月份部分。然后你可以从这个整数中减去一个月。
now()-4
很可能不是你想要用来确定一个月的值。它不会给我带来错误。它确切地说不匹配在哪里?出现问题的原因也是括号:FirstOfMonth 4
不要使用括号,除非您分配给变量dte=FirstOfMonth(4)
或使用Call。您总是传递值(4)还是使用变量?如果使用变量,则它必须是符合代码要求的整数:Dim monthsAgo as integer
,monthsAgo=4
now()-4
很可能不是用来确定月份的。它不会给我带来错误。它确切地说不匹配在哪里?出现问题的原因也是括号:FirstOfMonth 4
不要使用括号,除非您分配给变量dte=FirstOfMonth(4)
或使用Call。您总是传递值(4)还是使用变量?如果您使用一个变量,它必须是一个整数,根据您的代码:Dim monthsAgo as integer
,monthsAgo=4
有趣的是,Now()是一个双精度变量Now()-4=27/10/2012 14:41:28
该数字是从天数中减去的,因此Now()或Date()-n是前几天的天数。@严格来说,VBScript中的所有日期都是双倍的,根据。它们表示自1/1/1899
(我想)以来的天数,因此从该值中减去会产生这种效果。@Remou我看不到您关于无妄想症通过的注释。我记得(感谢上帝,我已经做了一段时间的VBScript了!),如果你在调用函数
时,你会使用parantesses,而在调用子函数
时,不要使用parantesses-对吗?@Remou同意-我已经从答案中删除了第一句:)这是VBA,不是VBScript。注释在OP上。非常有趣的是,Now()是一个双精度Now()-4=27/10/2012 14:41:28
该数字是从天数中减去的,因此Now()或Date()-n是前几天的天数。@严格来说,VBScript中的所有日期都是双倍的,根据。它们表示自1/1/1899
(我想)以来的天数,因此从该值中减去会产生这种效果。@Remou我看不到您关于无妄想症通过的注释。我记得(感谢上帝,我已经做了一段时间的VBScript了!),如果你在调用函数
时,你会使用parantesses,而在调用子函数
时,不要使用parantesses-对吗?@Remou同意-我已经从答案中删除了第一句:)这是VBA,不是VBScript。注释在OP上。