Главная страница «Первого сентября»Главная страница журнала «Информатика»Содержание №18/2008


В мир информатики
Microsoft Excel углубленно

Создание каледнаря в Microsoft Excel

В статье описана методика создания календаря на некоторый месяц некоторого года в электронной таблице Microsoft Excel (рис. 1).

Рис. 1

Как видно из рис. 1, месяц и год, для которых строится календарь, указываются соответственно в ячейках Е4 и Е3. После ввода этих значений по щелчку на кнопке с надписью “Создать”:

1) в ячейке А6 выводится название месяца и номер года;

2) заполняются даты в диапазоне А8:G14 (в первом и последнем столбцах, возможно, не полностью).

Щелчок на кнопке с надписью “Очистить” приводит к очистке только что указанного диапазона и ячеек Е3 и Е4.

О том, как разместить на листе кнопку, оформить на ней соответствующую надпись, рассказано в статьях [1–3]. Там же описано, как создаются и “привязываются” к кнопке макросы — программы, написанные на языке программирования VBA, которые выполняются по щелчку на той или иной кнопке.

Здесь же напомним, что:

1) запись Range("E3").Value (и подобные) означает значение, записанное в ячейке с адресом Е3. Это значение может использоваться в любом месте программы — в операторе присваивания (в его левой или правой частях), в условном операторе и т.д.;

2) запись Range("E3").Activate соответствует установке указателя активной ячейки (его часто называют “курсором”) на ячейку Е3.

Кроме того, в языке VBA имеется возможность смещать этот указатель не на ячейку с заданным адресом, а относительно текущей ячейки (вниз на некоторое число ячеек и т.п.). Примеры такого смещения приведены ниже с комментариями.

Основные этапы создания календаря следующие.

1. Считывание введенных значений года и месяца. Соответствующий код макроса:

год = Range("E3").Value

номер_месяца = Range("E4").Value

2. Определение числа дней в месяце, для которого строится календарь:

'Используем оператор варианта

Select Case номер_месяца

Case 1, 3, 5, 7, 8, 10, 12

число_дней_в_месяце = 31

Case 2 'Февраль

If год Mod 4 = 0 Then6

'Год високосный

число_дней_в_месяце = 29

Else

число_дней_в_месяце = 28

End If

Case Else

число_дней_в_месяце = 30

End Select

3. Формирование и вывод текста в ячейке А (см. выше):

месяц_и_год = MonthName(номер_месяца) + Str(год) + " года"

Range("A6").Value = месяц_и_год

Примечание. Функция MonthName возвращает название месяца по его порядковому номеру, функция Str преобразовывает число в строковое выражение.

4. Вывод сокращенных названий дней недели:

Range("A8").Value = "ПН"

Range("A9").Value = "ВТ"

Range("A10").Value = "СР"

Range("A11").Value = "ЧТ"

Range("A12").Value = "ПТ"

Range("A13").Value = "СБ"

Range("A14").Value = "ВС"

5. Формирование полной даты 1-го числа заданного месяца в виде строковой величины (эта дата нужна для выполнения этапа 6):

дата1 = "1" + "." + Str(номер_месяца) + "." + Str(год)

6. Определение номера дня недели 1-го числа заданного месяца:

номер_дня_недели_1_числа_месяца = Weekday(дата1, 2)

Примечание. Функция Weekday возвращает номер дня недели для даты, указанной в качестве ее первого аргумента; значение второго аргумента, равное 2, предусматривает, что отсчет дней недели начинается с понедельника.

7. Заполнение первого столбца календаря

Range("B7").Activate

'Пропускаем неиспользуемые ячейки

For i = 1 To номер_дня_недели_1_числа_месяца - 1

'Cмещаемся вниз на одну ячейку

ActiveCell.Cells(2).Activate

Next i

'Записываем числа в первый столбец

'Определяем количество дней в первом столбце

количество_дней_в_первом_столбце =

= 7 - номер_дня_недели_1_числа_месяца + 1

'Записываем соответствующие номера

For i = 1 To количество_дней_в_первом_столбце

'Cмещаемся вниз на одну ячейку

ActiveCell.Cells(2).Activate

'Записываем

ActiveCell.Value = i

Next i

8. Заполнение других столбцов (полных)

'Количество других полных столбцов

количество_полных_столбцов = (число_дней_в_месяце - количество_дней_в_первом_столбце) \ 7

'Записываем

записываемое_число = количество_дней_в_первом_столбце + 1

For j = 1 To количество_полных_столбцов

'Cмещаемся на начало соседнего столбца7

'Вверх на 7 ячеек

For i = 1 To 7

ActiveCell.Cells(0).Activate

Next i

'Вправо на одну ячейку

ActiveCell.Cells(1, 2).Activate

'Очередной столбец

For i = 1 To 7

'Cмещаемся вниз на одну ячейку

ActiveCell.Cells(2).Activate

'Записываем очередное число

ActiveCell.Value = записываемое_число

записываемое_число = записываемое_число + 1

Next i

Next j

9. Заполнение неполного столбца (при его наличии)

If записываемое_число <= число_дней_в_месяце Then

'Есть неполный последний столбец

'Cмещаемся на его начало

ActiveCell.Cells(-6, 2).Activate

'Заполняем последний столбец

For i = 1 To число_дней_в_месяце - записываемое_число + 1

'Cмещаемся вниз на одну ячейку

ActiveCell.Cells(2).Activate

'Записываем очередное число

ActiveCell.Value = записываемое_число

записываемое_число = записываемое_число + 1

Next i

End If

Весь макрос, связанный с кнопкой Создать, оформите самостоятельно.

Макрос, выполняемый по щелчку на кнопке Очистить, имеет вид:

Sub Очистить()

Range("B6:G14").Clear

Range("E3:E4").Clear

Range("E3").Activate

End Sub

Задание для самостоятельной работы

Оформите лист, на котором выводится календарь на некоторый год:

Результаты работы, пожалуйста, присылайте в редакцию. Все приславшие правильно подготовленный лист Microsoft Excel с соответствующими макросами будут награждены дипломами.

Литература

1. Игра “Быки и коровы” в среде Microsoft Excel. /
“В мир информатики” № 78 (“Информатика” № 19/2006).

2. Диков А.В. Моделирование бросания игральной кости в электронной таблице Microsoft Excel. / “В мир информатики” № 106 (“Информатика”
№ 6/2008).

3. Игра “Крестики-нолики” в среде Microsoft Excel. / “В мир информатики” № 91 (“Информатика” № 9/2007).

4. Високосные годы. / “В мир информатики” № 17 (“Информатика” № 5/2004).


6 Строго говоря,не каждый год, номер которого кратен 4, является високосным [4]. Однако в данном случае приведенное условие может быть использовано.

TopList