在我的工作中,我继承了Access 97数据库。这个数据库非常不稳定,我需要以某种方式解决这个问题。我一直试图通过并调试当前版本,以便我可以将它迁移到2007.我遇到了编译器不喜欢的一些代码,不知道如何解决它...这里是代码:< / p>
Function DaysInMonth(ByVal D As Date) As Long
' Requires a date argument because February can change
' if it's a leap year.
Select Case Month(D)
Case 2
If LeapYear(Year(D)) Then
DaysInMonth = 29
Else
DaysInMonth = 28
End If
Case 4, 6, 9, 11
DaysInMonth = 30
Case 1, 3, 5, 7, 8, 10, 12
DaysInMonth = 31
End Select
End Function
我收到编译错误:Sub或Function未定义,它突出显示第一个“LeapYear”。
任何帮助都将非常感谢!谢谢!
答案 0 :(得分:4)
LeapYear
是另一个功能或程序,它似乎不存在于您的模块中或已被设为私有。 LeapYear
不是VBA函数。必须有一个功能需要一年Year(D)
并返回TRUE
或FALSE
,如果它是一个飞跃的年份。插入一个或将现有一个设置为公共
编辑:您可以使用IsLeapYear但更改为'LeapYear'并使用IsLeapYear(D)调用
答案 1 :(得分:2)
LeapYear可能不是您唯一的问题。
在Access '97中,转到VBA编辑器并单击“工具/参考”:
查看'97项目的参考资料,看看列出了哪些DLL。
将出现一个屏幕,显示可用于项目的ActiveX DLL。检查的是当前使用的那些:
可能存在需要在新的2007数据库中引用的DLL。
答案 2 :(得分:2)
有问题的代码是愚蠢的 - 它显然是由一些没有关于VBA日期的人写的,它已经知道了所需的一切,而不需要将这个垃圾编码成一个CASE SELECT。
此表达式将为您提供一个月内的天数:
Day(DateAdd("m", 1, DateValue(Month(Date()) & "/1/" & Year(Date()))) - 1)
这样做是获得本月的第一个月,为它增加一个月(下个月的第一个月),然后从中减去1。由于VBA日期类型的整数部分是日期部分,因此可以获得当月的最后一天。然后你拿出结果并用Day()函数拉出一天。
将其编码为函数:
Function DaysInMonth(ByVal dteDate As Date) As Integer
Dim dteFirstOfMonth As Date
Dim dteLastOfMonth As Date
dteFirstOfMonth = DateValue(Month(dteDate) & "/1/" & Year(dteDate))
dteLastOfMonth = DateAdd("m", 1, dteFirstOfMonth) - 1
DaysInMonth = Day(dteLastOfMonth)
End Function
你也可以使用DateSerial()函数将第0天视为上个月的最后一天这一事实来编写代码:
Function DaysInMonth(ByVal dteDate As Date) As Integer
Dim dteOneMonthFromDate As Date
Dim dteLastOfThisMonth As Date
dteOneMonthFromDate = DateAdd("m", 1, dteDate)
dteLastOfThisMonth = DateSerial(Year(dteOneMonthFromDate), Month(dteOneMonthFromDate), 0)
DaysInMonth = Day(dteLastOfThisMonth)
End Function
但这不会让它变短......
这些都不需要计算闰年规则 - 这些规则都是VBA日期类型。
当然,该函数不应返回Long,而应返回Integer,因为它返回的最大值为31。