Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Function 为什么函数告诉我类型不匹配?_Function_Ms Access_Vba - Fatal编程技术网

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上。