ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 31.05.2024
Просмотров: 51
Скачиваний: 0
17
можно расположить и после слова Loop. В этом случае проверка на окончание цикла выполняется после выполнения тела цикла и гарантируется выполнение тела цикла хотя бы один раз. Если слово While заменить на Until, то тело цикла будет выполняться, если условие не выполняется.
Вусловии рассматриваемого цикла с помощью встроенной функции WeekDay определяется номер дня недели первого числа месяца и сравнивается с аргументом ДеньНедели. При успехе сравнения осуществляется выход из цикла. Переменная День содержит первое число месяца. В случае, если дни недели не совпадают, к дате День прибавляется единица, заново проверяется условие и т. д. В любом случае после выхода из цикла переменная День содержит дату, у которой день недели соответствует дню недели аргумента ДеньНедели.
Далее выполняется еще один цикл Do…While, в котором к дате День прибавляется 7, пока дата относится к тому же месяцу. В теле цикла используется счетчик n. До цикла переменная n получает нулевое значение. В теле цикла к n добавляется единица.
После выхода из цикла значение переменной n равно числу дней месяца, когда день недели равен заданному в аргументе. Это число и становится значением функции. Если задано обращение к функции в виде ДнейНедели (Date, 6), то функция выдает число пятниц в текущем месяце.
Для учета праздников надо создать соответствующий массив дат. Function Праздники()
ReDim Праздник(1 to 10) Праздник(1) = #1/1/2001# Праздник(2) = #1/2/2001# Праздник(3) = #1/7/2001# Праздник(4) = #3/8/2001# Праздник(5) = #5/1/2001# Праздник(6) = #5/2/2001# Праздник(7) = #5/9/2002# Праздник(8) = #6/12/2001# Праздник(9) = #11/7/2001# Праздник(10) = #12/12/2001# End Function
Вразделе описаний модуля должен быть описан массив Праздник
спомощью инструкции
18
Dim Праздник()
Массив доступен в любой процедуре модуля. После имени массива в круглых скобках с помощью числовых констант можно указать размерность массива. В нашем случае скобки пусты. Это значит, что массив динамический. Его размерность можно объявить позднее с помощью инструкции ReDim.
Функция Праздники формирует массив дат, соответствующих праздничным дням. Инструкция ReDim задает текущую размерность массива - 10 элементов с номерами индексов от 1 до 10. Поскольку конструкция As после скобок не указана, элементы массива будут иметь вариантный тип. Следующие за ReDim инструкции присваивают элементам массива даты праздников с помощью констант. Признаком даты у констант служат символы “#”. Если состав праздников изменится, в программу нужно будет внести изменения. Для внесения изменений нужны знания VBA, что является недостатком данного подхода. Если праздники хранить в таблице Access, то обновление списка праздников сможет осуществить оператор базы данных, не владеющий программированием на VBA.
Список праздников можно использовать для определения количества праздников в месяце.
Function ЧислоПраздников(Д1, Д2) Dim n As Integer,i As Integer
Call Праздники
For i = LBound(Праздник) To UBound(Праздник)
If Праздник(i)>=Д1 And Праздник(i)<=Д2 Then n = n + 1
End If
Next
ЧислоПраздников = n End Function
Функция ЧислоПраздников определяет количество праздников между датами Д1 и Д2. Инструкция Call вызывает функцию Праздники, которая создает модульную переменную Праздник (массив праздников).
В цикле For ... Next использованы встроенные функции LBound и UBound. LBound выдает нижнюю границу индексов аргумента-массива (1), а UBound - верхнюю (10). В теле цикла с помощью переменной n
19
подсчитывается, сколько праздников из массива Праздник попадает в заданный диапазон дат.
Function ПраздниковВМесяце(D As Variant) As Integer Dim X, D1 As Date, D2 As Date
X = Праздники()
Д1 = DateSerial(Year(D), Month(D), 1)
Д2 = DateSerial(Year(D), Month(D) + 1, 1) - 1
ПраздниковВМесяце = ЧислоПраздников(Д1, Д2) End Function
Количество праздничных дней месяца вычисляется с помощью функции ЧислоПраздников. Для этого вначале вычисляются 2 даты - первое число месяца Д1 и последнее число этого же месяца Д2. Последнее число определяется как первое число следующего месяца минус единица.
Для инициализации модульного массива Праздник используется вспомогательная переменная X, которой присваивается выражение правой части. Отметим, что в этом случае к названию функции справа добавляются круглые скобки. При вызове функции с помощью инструкции Call круглые скобки после имени функции не указываются.
Теперь нетрудно вычислить количество рабочих дней в месяце как число дней в месяце за вычетом воскресений, суббот и праздников.
Задание
Самостоятельно составить пользовательскую функцию, выполняющую задачу в проектируемой базе данных. Запустить программу из окна отладки (Immediate) для различных значений аргументов. Сравнить полученные значения с значениями, вычисленными вручную.
20
Составитель Евгений Александрович Бессонов
ACCESS
Пользовательские функции
Методические указания к лабораторной работе для студентов специальности “Экономика и управление на предприятиях ” по курсу “Автоматизация экономических расчетов
Редактор Е.Л.Наркевич
НД № 06536 от 16.01.02.
Подписано в печать 21.11.01.
Формат 60х84 /16. Бумага офсетная. Отпечатано на ризографе Уч.-изд.л. 1,0 . Тираж 50 экз. Заказ
ГУ Кузбасский государственный технический университет. 650026, Кемерово, ул. Весенняя, 28.
Типография ГУ Кузбасский государственный технический университет. 650099, Кемерово, ул. Д. Бедного, 4А