Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
LabExcel07.doc
Скачиваний:
26
Добавлен:
14.03.2016
Размер:
834.05 Кб
Скачать

2.2.11. Создание программного кода

Изучим применение операторов Visual Basic для обработки информации. Создадим такую программу, которая позволила бы вывести на экран общее количество студентов, число отличников, хорошистов, троечников, двоечников и их процентное соотношение. А так же общее количество оценок, число двоек, троек, четверок, пятерок и их процентное соотношение. Стипендиальный фонд, в том числе по категориям студентов, с возможностью моделирования суммы стипендиального фонда. И список успевающих студентов с их средним баллом.

Последовательность операций для создания программы

Вызывается панель инструментов "Visual Basic" (из контекстного меню, вызываемого правой кнопкой мыши на области панелей инструментов или через меню "Вид" и подменю "Панели инструментов").

На панели инструментов следует нажать кнопку "Элементы управления" . Выбрать элемент управления "Кнопка" и нарисовать его на свободном месте. Далее вызвать правой кнопкой мыши контекстное меню на элементе управления. В контекстном меню выбрать команду "Свойства". После это в появившемся окне свойств изменить необходимые свойства. Например, свойство Caption - меняет название кнопки. Название кнопки и ее размеры можно изменить и другой командой контекстного меню "Объект кнопка - Изменить". При необходимости можете поменять цвет, шрифт кнопки, добавить тень (свойствоShadow в окне свойств) и т.д.

Далее двойным нажатием левой кнопки мыши на объекте или через контекстное меню командой "Исходный текст" можно войти в редакторVisual Basic. В редакторе Вы увидите следующие операторы:

Private SubCommandButton1_Click()

End Sub

Операторы Sub иEnd Sub Вам знакомы. Они указывают на процедуру или подпрограмму.

Процедура- функционально законченная последовательность совместно выполняемых инструкций, имеющая имя.

Существуют процедуры типаFunction, Property и Sub.Имя процедуры всегда определяется на уровне модуля. В процедурах должны содержаться все исполняемые программы.Вложенность процедур в другие процедуры не допускается.

Инструкция - синтаксически завершенная конструкция, представляющая отдельное действие, описание или определение. В качестве инструкций используются операторы, функции, служебные слова.

Обычно, инструкция занимает отдельную строку программы, хотя допускается использование двоеточия для размещения в одной строке нескольких инструкций. Допускается также использование символа продолжения строки _ (подчеркивание) для продолжения одной логической программной строки на нескольких физических строках.

Пример.

= - инструкция (оператор присваивания);

Sin - инструкция (функция синуса);

Const - инструкция (служебное слово).

Константа- именованный элемент, сохраняющий постоянное значение в течение выполнения программ.

Константа может быть задана как строковый или числовой литерал (константа в явном представлении), другая константа или любая комбинация констант и арифметических и логических операторов, за исключением операторов Isи возведения в степень. В каждом главном приложении можно определить собственный набор констант. Пользователь имеет возможность определить дополнительные константы с помощью инструкции Const. Константы могут использоваться в любых местах программы вместо реальных значений.

Пример.

10 - константа (любое число является константой);

"ad" - константа (любое выражение в кавычках является константой);

Процедура Subпредставляет собой последовательностьинструкцийязыка Visual Basic, ограниченных инструкциямиSubиEnd Sub, которая выполняет действия, но не возвращает значение. ПроцедураSubможет получать аргументы, как, например, константы, переменные, или выражения, передаваемые ей вызывающей процедурой. Если процедураSubне имеет аргументов, инструкцияSubдолжна содержать пустые скобки.

У нас имеется следующий текст:

Private SubCommandButton1_Click()

End Sub

В нашем случае перед оператором Sub стоит инструкцияPrivate.Так же как и для переменных, эта инструкция означает, что данная процедура будет доступная в пределах одного модуля - в нашем случае это "Лист 1 (Сессия)".

После оператораSub идет имя процедуры. Данное имяExcel дает автоматически, так как основной процедурой на объект класса "Кнопка" является обработка события "нажатие мышью на кнопку" ("Click"). Имя процедуры состоит из имени объекта -CommandButton1 и названия события - "Click". Процедура не получает параметров, поэтому после имени процедуры идут пустые скобки - ().

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

UserForm1.Show

ИнструкцияShow является методом, который показывает на экран объект классаUserForm. Объекта пока не существует, поэтому создадим его.

Для создания объекта классаUserFormнажмите на панели инструментов"Стандарт" соответствующую кнопку, либо через меню"Вставка" командой "UserForm". Необходимо изменить заголовок этой формы (свойствоCaption) на фразу "Статистика по студентам". Размеры самого окна подправляются в процессе создания других объектов. СвойствоStartUpPosition должно быть установлено в 1 - CenterOwner, чтобы окно выводилось посредине листа.

Окно свойств вызывается или клавишейF4 или через контекстное меню на объекте командой "Свойства" или через меню "Вид" командой "Окно свойств".

Далее создается объект класса "Рамка". Объект данного класса может содержать другие объекты. Необходимо изменить название рамки на"Количество оценок",это делается с помощью свойстваCaption. Если шрифт не является русским, то измените его на русский шрифт с помощью свойстваFont. Стандартным системным экранным шрифтом (которым пишется меню) являетсяMS Sans Serif. Всозданном объекте класса "Рамка" располагают объекты класса "Надпись", с текстом "число оценок всего", "число двоек", "число троек", "число четверок", "число пятерок". Изменение текста производится с помощью свойстваCaption, затем текст выравнивают по правому краю свойствомTextAlign, устанавливая его значение в 3 -fmTextAlignRight. Цвет надписей меняется свойствомForeColor. После создается еще один объект класса "Надпись" и изменяют ему свойствоSpecialEffect на значение2 - fmSpecialEffectSunken. Данный объект можно скопировать (так же как Вы копируете текст вWord'е). Нажимаете один раз на объекте левой кнопкой мыши (если он не выделен), затем клавишиCtrl+Insert,а послеShift+Insert. Этот объект будет содержать значение, получаемое при расчете с помощью программы. При необходимости меняют цвет шрифта (свойствоForeColor) и фона(свойствоBackColor).

Аналогично создаются заготовки в виде объектов класса "Рамка" для информации об успеваемости студентов и стипендиальном фонде. Для информации об успевающих студентах создается только рамка.

В объекте класса "Рамка" с заголовком "Стипендия" присутствует три объекта класса "Счетчик". Значения свойствMax,Min, Value первого объекта установлены в 120, 60, 80 соответственно. Второго объекта в 180, 120, 120, а третьего в 320, 180, 250. Первое значение указывает полок стипендии: минимальной - для первого объекта, повышенной - для второго и именной - для третьего объекта. Второе значение указывает минимум тех же стипендий. А третье значение указывает на текущий размер этих стипендий (должно лежать в пределах первого и второго). С помощью данных объектов пользователь сможет изменять размер стипендий и получать суммы стипендиального фонда. Кроме того, эти объекты имеют особенные свойстваControlTipText - пояснительный текст к объекту, который выводится на желтом фоне, когда указатель мыши находится некоторое время на объекте. Данное свойство изменено так же у объектов класса "Надпись" стоящих рядом с объектами класса "Счетчик". Внимательно посмотрите на эти свойства.

И, наконец, последний объект класса "Рамка" содержит объект класса "Список". Данный объект также имеет особенное свойствоControlTipText, которое поясняет назначение объекта.

После создания всех этих объектов приступают к написанию программы. Переход в режим написания программы осуществляется либо двойным нажатием левой кнопки мыши на объекте класса UserForm(но не другом объекте, который содержитUserForm),либо нажатием кнопки программа в окне проекта (вызывается либо через меню "Вид" командой "Окно проекта", либо клавишами Ctrl+R). Вызвать режим написания программы можно через контекстное меню (вызывается правой кнопкой мыши) командой "Программа" на объекте классаUserForm.

Появится окно модуля, вверху которого есть два выпадающих списка. Левый список содержит названия всех доступных интерфейсных объектов, а правый все доступные события для каждого из объектов.

Для написания программы, которая будет выполняться при появлении окна на экране (а нам нужна именно такая программа, когда мы нажимаем на кнопку, расположенную на листе, должно появляться окно с рассчитанными значениями) необходимо в левом списке выбрать объект "UserForm1",а в правом событие"Initialize",которое возникает при появлении окна на экране. Появится "заготовка" для процедуры:

Private SubUserForm_Initialize()

End Sub

Далее нужно написать программу. Текст программы с комментариями приведен ниже (записаны после знака ' ). Все, что заключено в зеленую рамку в реальной программе отсутствует.

Dim Obj As Object' Вспомогательная переменная

Здесь объявляется новый для Вас тип переменной - Object. Переменная данного типа может содержать любой объект, который имеется в книге. В программе данная переменная будет содержать ячейку таблицы.

Dim i As Integer ' Вспомогательная переменная

Данная переменная будет использоваться в качестве цикловой переменной

Dim Count_Of_Note As Integer' Число оценок

Dim Count2 As Integer ' Число двоек

Dim Count3 As Integer ' Число троек

Dim Count4 As Integer ' Число четверок

Dim Count5 As Integer ' Число пятерок

Объявляются переменные, которые будут содержать общее число оценок, число двоек, троек, четверок, пятерок.

' Выводим начальный размер минимальной стипендии

Label40.Caption = SpinButton1.Value

' Выводим начальный размер повышенной стипендии

Label41.Caption = SpinButton2.Value

' Выводим начальный размер именной стипендии

Label42.Caption = SpinButton3.Value

Выводим значения объектов класса "Счетчик" на экран. Данные значения будут содержать объекты класса "Надпись", расположенные рядом. Обратите внимание на то, как осуществляется доступ к свойствам объекта. Он производится через точку. Несмотря на то, что свойствоValue является числом, аCaption текстом, преобразование типов данных не нужно. Откуда взять название объектов класса "Надпись" - из окна свойств, там необходимо посмотреть главное свойство любого объекта -Name.

' Обнуляем количество оценок

Count2 = 0: Count3 = 0: Count4 = 0: Count5 = 0

Count_Of_Note = 0

' Обнуляем количество студентов

Student2 = 0: Student3 = 0: Student4 = 0: Student5 = 0

' Просмотрим каждую ячейку в диапазоне двоек

For Each Obj In Worksheets("Сессия").Range("ao17:ao316")

Count2 = Count2 + Obj.Value' Суммируем число двоек

' Считаем двоечников

If Obj.Value> 0Then

Student2 = Student2 + 1

End If

Next Obj

Код участка программы можно выразить следующей блок-схемой:

Здесь перебираются все ячейки в диапазоне от AO17 доAO316 на листе с названием "Сессия",что является диапазоном количества двоек у каждого студента. За перебор отвечает циклFor Each .. InNext. ПеременнаяCount2, содержащая количество двоек наращивается на величинуObj.Value, которая содержит значение ячейки (числовое или текстовое). Если попадется текст в этом диапазоне, то возникнет ошибка несоответствия типа (пытаемся числовой переменной прибавить текст). В этом же цикле удобно подсчитать количество двоечников. Если у ячейки значениеValue не равно нулю, значит студент двоечник. Конечно, если в таблице окажется случайно число 123 (а предметов всего 12), то программа это не учтет. Для этого надо добавить в условие сравнение Obj.Value < 13. Если значение ячейки не равно нулю, то необходимо увеличить переменнуюStudent2 (количество двоечников) на единицу. Кроме того, данный код зависит от формул на листе, так как не считает число двоек у каждого студента, а использует уже подсчитанные значения и суммирует их.

' Просмотрим каждую ячейку в диапазоне троек

For EachObjInWorksheets("Сессия").Range("ap17:ap316")

Count3 = Count3 + Obj.Value' Суммируем число троек

Next Obj

' Просмотрим каждую ячейку в диапазоне четверок

For Each Obj In Worksheets("Сессия").Range("aq17:aq316")

Count4 = Count4 + Obj.Value' Суммируем число четверок

Next Obj

' Просмотрим каждую ячейку в диапазоне пятерок

For Each Obj In Worksheets("Сессия").Range("ar17:ar316")

Count5 = Count5 + Obj.Value' Суммируем число пятерок

' Считаем отличников

If Obj.Value = 12 Then

Student5 = Student5 + 1

End If

Next Obj

Число отличников можно найти как сумму студентов имеющих число пятерок равное количеству предметов (в нашем случае 12). Число троечников определяется сложнее, так как у "потенциального" троечника (число троек не равно нулю) могут быть двойки. Число хорошистов тоже определяется сложнее по той же причине.

' Число оценок равно сумме 2,3,4,5

Count_Of_Note = Count2 + Count3 + Count4 + Count5

Label13.Caption = Count_Of_Note ' Выводим на экран число оценок

Label14.Caption = Count2 ' Выводим количество двоек

Label15.Caption = Count3 ' Выводим количество троек

Label16.Caption = Count4 ' Выводим количество четверок

Label17.Caption = Count5 ' Выводим количество пятерок

' Вычисление процентов

' Процент двоек

Label18.Caption = Format(Count2 / Count_Of_Note, "0.00%")

ФункцияFormatосуществляет преобразование числа в определенный формат. В данном случае функцияFormat преобразует число к процентному формату (умножает на 100) с двумя знаками после запятой - "0.00%").

' Процент троек

Label19.Caption = Format(Count3 / Count_Of_Note, "0.00%")

' Процент четверок

Label20.Caption = Format(Count4 / Count_Of_Note, "0.00%")

' Процент пятерок

Label21.Caption = Format(Count5 / Count_Of_Note, "0.00%")

' Просмотрим каждую ячейку в диапазоне оценок

Fori = 17To316

' Считаем троечников

IfWorksheets("Сессия").Range("ao" +Trim(Str(i))) = 0And_

Worksheets("Сессия").Range("ap" +Trim(Str(i))) > 0Then

Student3 = Student3 + 1

End If

' Считаем хорошистов

IfWorksheets("Сессия").Range("ao" +Trim(Str(i))) = 0And_

Worksheets("Сессия").Range("ap" +Trim(Str(i))) = 0And_

Worksheets("Сессия").Range("aq" +Trim(Str(i))) > 0Then

Student4 = Student4 + 1

End If

' Заносим успевающих студентов в список

IfWorksheets("Сессия").Range("ao" +Trim(Str(i))) = 0Then

ListBox1.AddItem (Worksheets("Сессия").Range("aa" +Trim(Str(i))).Value& " - " & _

Worksheets("Сессия").Range("an" +Trim(Str(i))).Value)

End If

Nexti

Знак подчеркивания ( _ ) означает, что строка программы продолжается на следующей физической строке. Подсчет троечников осуществляется так: если у студента количество двоек равно 0 и количество троек больше нуля, то он - троечник. Аналогично делается вывод по хорошистам. Интересным является способ создания списка успевающий студентов. Объект класса "Список" имеет метод AddItem. Данный метод добавляет одну строку в список. Строка должна представлять собой текст. В нашем случае текст составляется из фамилии (берется значение ячейки из столбца AA, и добавляется к нему через знак минуса (с помощью знаков &, которые соединяют текстовые строки) значение среднего балла (столбец AN). Обратите внимание на формирование адреса ячейки: "aa" +Trim(Str(i)). ФункцияStr переводит числовое значение в строку текста (например, число 234 переводит в "234"), а функцияTrim обрезает пробелы в начале и в конце строковой переменной (например, строку " 34е " преобразует в "34е"). Итак, поскольку адрес ячейки представляет собой текст, состоящий из названия столбца и номера строки, то для его формирования мы к названию столбца -AA (мы его знаем заранее) нужно добавить в виде текста номер строки (номера меняются в теле цикла). Поскольку у нас имеется номер строки в виде числа (значение переменнойi), то нужно преобразовать его в текст. ФункцияStr переводит число в текст, однако, она добавляет в начале пробел (если число положительное) или минус (если число отрицательное). У нас число положительное, но пробел в имени ячейки не допустим, поэтому используется функция Trim.

' Всего студентов - вычисляется как сумма студентов всех категорий

Students= Student2 + Student3 + Student4 + Student5

Label22.Caption = Students' Выводим на экран число студентов

Label26.Caption = Student2 ' Выводим количество двоечников

Label25.Caption = Student3 ' Выводим количество троечников

Label24.Caption = Student4 ' Выводим количество хорошистов

Label23.Caption = Student5 ' Выводим количество отличников

' Выводим на экран процент

Label30.Caption = Format(Student2 /Students, "0.00%")

Label29.Caption = Format(Student3 /Students, "0.00%")

Label28.Caption = Format(Student4 /Students, "0.00%")

Label27.Caption = Format(Student5 /Students, "0.00%")

' Подсчитываем суммы стипендий

Label37.Caption = Student3 * SpinButton1.Value ' Минимальной

Label38.Caption = Student4 * SpinButton2.Value ' Повышенной

Label39.Caption = Student5 * SpinButton3.Value ' Именной

Сумма стипендий равна произведению числа студентов получающих эту стипендию на размер одной стипендии. Объекта класса "Счетчик" содержат размер одной стипендии для каждой категории студентов.

' Стипендиальный фонд

Label32.Caption = Student5 * SpinButton3.Value + Student4 * SpinButton2.Value + Student3 * SpinButton1.Value

Выход обратно из модуля к виду объекта класса UserForm можно выполнить, нажав мышью кнопку "Объект" в окне проекта, либо дважды нажав мышью на самом объекте UserForm.

После записи этой программы необходимо еще заставить программу реагировать на нажатия пользователя на счетчики. Для этого нажмите два раза кнопкой мыши на первом объекте класса "Счетчик". Вы увидите новую "заготовку" под процедуру:

Private Sub SpinButton1_Change()

End Sub

Данная процедура будет обрабатывать событие "Change", которое возникает при изменении значения счетчика пользователем (во время работы программы). Необходимо написать следующий код в "заготовке":

' Выводим измененный размер минимальной стипендии

Label40.Caption = SpinButton1.Value

' Сумма стипендий

Label37.Caption = Student3 * SpinButton1.Value ' Минимальной

' Стипендиальный фонд

Label32.Caption = Student5 * SpinButton3.Value + Student4 * SpinButton2.Value + Student3 * SpinButton1.Value

Данный код позволит обновить значения (текст) трех объектов, которые содержат:

  • Размер минимальной стипендии;

  • Стипендиальный фонд для троечников;

  • Стипендиальный фонд всех стипендий.

Обратите внимание, что при вычислении общего фонда используются переменные, хранящие число студентов определенных категорий. Имейте в виду, что до использования этих переменных, они должны быть определены (рассчитываются при появлении окна). Кроме того, эти переменные определены вне какой-либо процедуры (посмотрите в программе). Они доступны всем процедурам, которое располагаются в этом модуле.

Данный код с небольшими изменениями в названиях объектов и меняемым значениям необходимо также написать для других объектов класса "Счетчик".

Осталось самое малое - запустить программу. Нажмите кнопкуF5или кнопку "Запуск программы/UserForm" на панели инструментов. Через небольшое время Вы увидите результат. Можно закрыть редакторVisual Basic (клавишиAlt+Q или через меню "Файл" командой "Закрыть и вернуться в Microsoft Excel"). Теперь, при каждом нажатии на созданную нами кнопку будет выполняться наша программа, и появляться наше окно.

Если необходимо изменить свойства кнопки, то нужно войти в режим конструктора, нажав кнопку "Режим конструктора" на панели инструментов"Visual Basic". Выход осуществляется также.

Задание №4. Внимательно изучите весь программный код. Попробуйте сами себе объяснить назначение каждой строчки программы. Изучите свойства объекта. Мысленно повторите процедуру создания программы.

План лабораторной работы: Контрольные вопросы

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]