继承的数据库具有编译器不喜欢的闰年代码

时间:2011-05-18 18:50:07

标签: ms-access vba

在我的工作中,我继承了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”。

任何帮助都将非常感谢!谢谢!

3 个答案:

答案 0 :(得分:4)

LeapYear是另一个功能或程序,它似乎不存在于您的模块中或已被设为私有。 LeapYear不是VBA函数。必须有一个功能需要一年Year(D)并返回TRUEFALSE,如果它是一个飞跃的年份。插入一个或将现有一个设置为公共

编辑:您可以使用IsLeapYear但更改为'LeapYear'并使用IsLeapYear(D)调用

答案 1 :(得分:2)

LeapYear可能不是您唯一的问题。

在Access '97中,转到VBA编辑器并单击“工具/参考”: References 1

查看'97项目的参考资料,看看列出了哪些DLL。

将出现一个屏幕,显示可用于项目的ActiveX DLL。检查的是当前使用的那些: References 2

可能存在需要在新的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。