Унаследованная база данных содержит код високосного года, который не нравится компилятору - PullRequest
0 голосов
/ 18 мая 2011

В своей работе я унаследовал базу данных Access 97.Эта база данных очень нестабильна, и мне нужно исправить это тем или иным способом.Я пытался пройти и отладить текущую версию, чтобы я мог перенести ее на 2007 год. Я наткнулся на некоторый код, который не нравится компилятору, и не уверен, как это исправить ... вот код:

    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 ]

4 голосов
/ 18 мая 2011

LeapYear - это другая функция или процедура, которая отсутствует в ваших модулях или сделана конфиденциальной.LeapYear не является функцией VBA.Должна существовать функция, которая занимает год Year(D) и возвращает TRUE или FALSE, если это был високосный год.либо вставьте один, либо установите для существующего значение Public

Редактировать: Вы можете использовать IsLeapYear , но изменить на «LeapYear» и вызывать с помощью IsLeapYear (D)

2 голосов
/ 19 мая 2011

Код, о котором идет речь, идиотский - он был четко написан кем-то, кто не имел ни малейшего представления о датах 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 () обрабатывает нулевой день как последний из предыдущего месяца:

  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.

2 голосов
/ 19 мая 2011

LeapYear не может быть вашей единственной проблемой.

В Access '97 перейдите в редактор VBA и нажмите «Инструменты / Ссылки»: References 1

Просмотрите ссылки на ваш проект '97 и посмотрите, какие библиотеки перечислены в списке.

Появится экран, показывающий библиотеки ActiveX, которые можно использовать для проекта. Проверяются те, которые используются в настоящее время: References 2

Скорее всего, там есть DLL, на которую нужно ссылаться в вашей новой базе данных 2007 года.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...