Основы программирования в среде Visual Basic for Application VBA

Государственное образовательное учреждение

	высшего профессионального образования

	

	

	

	

	

	

	

	ОСНОВЫ ПРОГРАММИРОВАНИЯ В СРЕДЕ

	

	VISUAL BASIC FOR APPLICATION (VBA)

	

	Учебное пособие

	

	

	

	

	

	

	

	

	

	

	

	

	

	Ростов-на-Дону

	2008

	
УДК 681.3.06

	Основы программирования в среде Visual basic for application (VBA) : учеб. пособие; Рост. гос. ун-т путей сообщения. – Ростов н/Д, 2008. – 124 с.: ил.

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

	Предназначено для студентов первых курсов, изучающих дисциплину «Информатика», раздел «Алгоритмизация и программирование».

	Рецензенты: 

	

	
1. Основные этапы решения задач на ЭВМ

	

	Процесс решения задач на компьютере – это совместная деятельность человека и ЭВМ. На долю человека приходятся этапы, связанные с творческой деятельностью – постановкой, алгоритмизацией, программированием задач и анализом результатов, а на долю персонального компьютера – этапы обработки информации в соответствии с разработанным алгоритмом.

	Первый этап – постановка задачи. На этом этапе участвует человек, хорошо представляющий предметную область задачи (биолог, экономист, инженер). Он должен чётко определить цель задачи, дать словесное описание содержания задачи и предложить общий подход к её решению.

	Второй этап – выбор метода решения (математическое или информационное моделирование). Цель данного этапа – создать такую математическую модель решаемой задачи, которая могла быть реализована в компьютере. Существует целый ряд задач, где математическая постановка сводится к простому перечислению формул и логических условий.

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

	Третий этап – алгоритмизация задачи. На основе математического описания необходимо разработать алгоритм решения.

	Алгоритм – система точных и понятных предписаний о содержании и последовательности выполнения конечного числа действий, необходимых для решения любой задачи данного типа (класса).

	Понятие алгоритма возникло и используется давно. Сам термин «алгоритм» ведёт начало от перевода на европейские языки имени арабского математика Аль-Хорезми (IX век). Им были описаны правила (в нашем понимании – алгоритмы) выполнения основных арифметических действий в десятичной системе счисления.

	Задача составления алгоритма не имеет смысла, если не известны или не учитываются возможности его исполнителя (ребёнок может прочесть, но не может решить сложную задачу).

	Исполнителем может быть не только человек, но и автомат. Компьютер – лишь частный, но наиболее впечатляющий пример исполнителя, чьё поведение основано на реализации алгоритма. Более того, создание персонального компьютера оказало воздействие на развитие теории алгоритмов, одной из областей дискретной математики.

	Эффективный метод построения алгоритма – метод пошаговой детализации (последовательного построения). При этом сложная задача разбивается на ряд более простых. Для каждой подзадачи разрабатывается свой алгоритм. Универсальный эффективный метод построения алгоритма является основой структурного программирования (см. п. 6.16).

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

	Используются различные способы записи алгоритмов:

	– словесный (запись рецептов в кулинарной книге, инструкции по использованию технических устройств…);

	– графический – в виде блок-схемы;

	– структурно-стилизованный (для записи используется язык псевдокода).

	При составлении и записи алгоритма необходимо обеспечить, чтобы он обладал рядом свойств:

	Однозначность алгоритма – единственность толкования исполнителем правил выполнения действий и порядка их выполнения. Чтобы алгоритм обладал этим свойством, он должен быть записан командами из системы команд исполнителя.

	Конечность алгоритма – обязательность завершения каждого из действий, составляющих алгоритм, и завершимость алгоритма в целом. 

	Результативность алгоритма – предполагает, что выполнение алгоритма должно завершиться получением определённых результатов.

	Массовость – возможность применения данного алгоритма для решения целого класса задач, отвечающих общей постановке задачи. 

	Правильность алгоритма – способность алгоритма давать правильные результаты решения поставленных задач.

	Четвёртый этап – программирование. Программой называется план действий, подлежащих выполнению некоторым исполнителем, в качестве которого может выступать компьютер. Программа позволяет реализовать разработанный алгоритм. 

	Пятый этап – ввод программы и исходных данных в ЭВМ с клавиатуры с помощью редактора текстов. Для постоянного хранения осуществляется их запись на гибкий или жёсткий диск.

	Шестой этап – тестирование и отладка программы. Исполнение алгоритма с помощью ЭВМ, поиск и исключение ошибок. При этом программисту приходится выполнять рутинную работу по проверке работы программы, поиску и исключению ошибок, и поэтому для сложных программ этот этап часто требует гораздо больше времени и сил, чем написание первоначального текста программы.

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

	Контрольные примеры стремятся выбрать так, чтобы при работе с ними программа прошла все основные пути алгоритма, поскольку на каждом из путей могут встретиться свои ошибки, а детализация плана зависит от того, как поведёт себя программа на этих примерах. На одном она может «зациклиться», на другом – дать бессмысленный результат.

	Сложные программы отлаживают отдельными фрагментами.

	Для повышения качества выполнения этого этапа используются специальные программы-отладчики, которые позволяют исполнить программу «по шагам» с наблюдением за изменением значений переменных, выражений и других объектов программы с отслеживанием выполнения операторов.

	Седьмой этап – исполнение отлаженной программы и анализ результатов. На этом этапе программист запускает программу и задаёт исходные данные, требуемые по условию задачи.

	Полученные результаты анализируются постановщиком задачи, и на основании этого анализа вырабатываются соответствующие решения, рекомендации, выводы. 

	Языки программирования

	Чтобы компьютер выполнил решение какой-либо задачи, ему необходимо получить от человека инструкции, как её решать. Набор таких инструкций для компьютера, направленный на решение конкретной задачи, называется компьютерной программой.

	Современные компьютеры не настолько совершенны, чтобы понимать программы, написанные на каком-либо употребляемом человеком языке. 

	Команды, предназначенные для ЭВМ, необходимо записывать в понятной компьютеру форме. С этой целью применяют языки программирования – искусственные языки, алфавит, словарный запас и структура которых удобны и понятны компьютеру.

	В самом общем смысле языком программирования называется фиксированная система обозначений и правил для описания алгоритмов и структур данных.

	Языки программирования должны быть понятны и человеку, и ЭВМ. Они делятся на языки низкого и высокого уровня.

	Язык низкого уровня – средство записи программы простыми приказами – командами на аппаратном уровне. Такой язык отражает структуру данного класса ЭВМ, и поэтому иногда называется машинно-ориентированным языком. Пользуясь системой команд, понятной ПК, можно описать алгоритм любой сложности, но такая запись для сложных задач будет очень громоздкой и мало приспособленной для использования человеком.

	Существенной особенностью языков низкого уровня является жесткая ориентация на определённый тип аппаратуры (систему команд процессора).

	Чтобы приспособить язык программирования низкого уровня к человеку, был разработан язык символического кодирования – язык Ассемблер. Структура команд Ассемблера определяется форматами команд и данных машинного языка. Программа на Ассемблере ближе человеку, потому что операторы этого языка – те же коды, но они имеют мнемонические названия; используются не конкретные адреса, а их символьные имена.

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

	К языкам программирования этого типа относятся Бейсик, Фортран, Паскаль, Си и другие. Программа на языках высокого уровня записывается системой обозначений, понятной человеку (например, фиксированным набором слов английского языка).

	Все вышеперечисленные языки – вычислительные. Более молодые – декларативные (непроцедурные) языки. Отличительная черта их – задание связей и отношений между объектами и величинами и отсутствие определенной последовательности действий (один из первых – Пролог, затем C++, Delphi, Visual Basic). Эти языки дали толчок к разработке специальных языков искусственного интеллекта и языков представления знаний.

	Трансляторы

	Текст программы, записанный, например, на Паскале, не может быть воспринят ЭВМ непосредственно, требуется перевести его на машинный язык.

	Перевод программы с языка программирования на язык машинных кодов называется трансляцией (translation – перевод), а выполняется специальными программами – трансляторами. Существует три вида трансляторов: интерпретаторы, компиляторы, ассемблеры.

	Интерпретатором называется транслятор, производящий покомандную обработку и выполнение исходной программы.

	Компилятор преобразует (транслирует) всю программу в модуль на машинном языке, после этого программа записывается в память ПК и лишь потом выполняется.

	Ассемблеры переводят программу, записанную на языке автокода, в программу на машинном языке.

	Любой транслятор решает следующие основные задачи:

	– анализирует транслируемую программу, в частности, проверяет, содержит ли она синтаксические ошибки;

	– генерирует выходную программу (её часто называют объектной или рабочей) на языке команд ЭВМ;

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

	
2. Элементы управления и пользовательская форма VBA

	

	2.1 Элементы управления

	

	VВА обладает встроенным набором элементов управления. Используя этот набор и редактор форм не трудно создать любой пользовательский интерфейс, который будет удовлетворять всем требованиям, предъявляемым к интерфейсу в среде Windows. В данной главе дан обзор встроенных элементов управления VBA. Элементы управления являются объектами. Поэтому, как любые объекты, они обладают свойствами, методами и событиями. Элементы управления создаются при помощи панели инструментов Элементы управления (Control Toolbox). На этой панели представлены кнопки, позволяющие конструировать элементы управления, а также кнопки вызова окна свойств, перехода в режим конструктора и редактор кода.

	

	

	Рисунок 2.1 Панель инструментов Элементы управления

	

	Создание элементов управления на рабочем листе или в форме, как правило, происходит на начальном этапе конструирования приложения. Иногда используется программное их создание в процессе работы приложения. Но этот подход применяется реже. Большинство элементов управления можно располагать как на рабочем листе, так и в форме. Но существуют такие элементы управления, как RefEdit, Набор страниц и Набор вкладок, которые можно располагать только в форме. Ниже приведен список основных элементов управления и соответствующих кнопок панели инструментов Элементы управления (Control Toolbox).

	

	

	Элемент управления

	Имя

	Кнопка для создания элемента

	Поле

	TextBox

	

	Надпись

	Label

	

	Кнопка

	CommandButton

	

	Список

	ListBox

	

	Поле со списком

	ComboBox

	

	Полоса прокрутки

	ScrollBar

	

	Счетчик

	SpinButton

	

	Переключатель

	OptionButton

	

	Флажок

	CheckBox

	

	Выключатель

	ToggleButton

	

	Рамка

	Frame

	

	Рисунок

	Image

	

	RefEdit

	RefEdit

	

	Набор страниц

	MultiPage

	

	

	Для размещения элемента управления на листе или в форме нажмите соответствующую кнопку панели инструментов Элементы управления (Control Toolbox) и с помощью мыши перетащите рамку элемента управления в нужное место. После этого элемент управления можно перемещать, изменять его размеры, копировать в буфер обмена и вставлять из буфера обмена. Для разработки простейших программ удобно использовать пиктограммы (рис. 2.2).

	

	

Вставка новой формы

Запуск программы на выполнение

Сброс программы

Панель компонентов ToolBox

	

	Рисунок 2.2

	

	
2.2 Режим конструктора

	

	Для удобства работы с элементами управления в период их конструирования в Excel введен режим конструктора, который активизируется нажатием кнопки Режим конструктора (Design Mode) панели инструментов Элементы управления (Control Toolbox). В режиме конструктора отключена реакция элемента управления на события. Поэтому при включенном режиме конструктора можно видоизменять элемент управления и задавать его свойства. На рис. 2.3 показано создание элемента управления CommandButton (кнопка) на рабочем листе. После того как пользователь решит, что созданный элемент управления имеет тот вид, который ему нужен, и все требуемые свойства элемента управления установлены, он должен отключить режим конструктора повторным нажатием кнопки Режим конструктора (Design Mode).

	

	

	Рисунок 2.3 Создание элемента управления CommandButton на рабочем листе в режиме конструктора

	

	2.3 Установка свойств элемента управления

	

	Для установки свойств элемента управления вручную при его конструировании необходимо выделить элемент управления и нажать кнопку Свойства(Properties) панели инструментов Элементы управления (Control Toolbox). На экране отобразится диалоговое окно Свойства (Properties)(рис. 2.4). Оно аналогично окну Свойства (Properties) редактора Visual Basic. Вручную при помощи этого окна обычно устанавливается свойство Caption, возвращающее отображаемый текст элемента управления. На рисунке 2.4 значение свойства Сaption элемента управления CommandButton изменено с установленного по умолчанию (CornmandButton1) на текст Нажми меня. Кроме того, внесены изменения в параметры свойства Font, устанавливающее шрифт выводимого на поверхности кнопки текста, а именно, увеличен размер шрифта с 8 до 12, шрифт MS Sans Serif заменен на Courier New и изменено начертание букв с обычного на полужирное. Также свойство Shadow установлено равным True, вместо False, как это имеет место по умолчанию. Свойство Shadow устанавливает, отображается ли элемент управления с тенью или без нее.

	

	

	Рисунок 2.4 Диалоговое окно Свойства и элемент управления CommandButton с измененными свойствами Caption, Font и Shadow

	

	2.4 Редактор кода

	

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

	

	Click

	Щелчок

	DblClick

	Двойной щелчок

	GotFocus

	Кнопка в фокусе

	LostFocus

	С кнопки снят фокус

	

	Код обработки события записывается на листе модуля. Для активизации модуля в том месте, где надо ввести код по обработке события, связанного с выделенным элементом управления, или отредактировать уже написанный код достаточно нажать кнопку Исходный текст (View Code) панели инструментов Элементы управления (Control Toolbox).

	Нажатие на кнопку Исходный текст (View Code) активизирует модуль с именем лист1, т. е. модуль, относящийся к рабочему листу, на котором создана кнопка (рис. 2.5). Вся рабочая книга, а также каждый рабочий лист, диаграмма или форма имеют связанные с ними модули кода. Кроме того, можно создать модули кода для макросов и модули класса.

	

	

	Рисунок 2.5 Модуль кода и окно Проект

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

	В правой верхней части модуля кода находится раскрывающийся список с именами событий, связанных с данным объектом.

	Составим процедуру обработки события Click так, чтобы нажатие на кнопку отображало на экране диалоговое окно, уведомляющее пользователя о случившемся действии (нажатии кнопки).

	Private Sub Conimancffluttonl_Click() 

	MsgBox "Ты нажал на меня" 

	End Sub

	

	2.5 Пользовательская форма UserForm

	

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

	Семейство UserForms является семейством, компоненты которого представляют все загруженные формы UserForm в приложении. Как и все семейства, UserForms имеет свойства Count (возвращает число компонентов в семействе) и Item (возвращает определенный компонент семейства), а также метод Add (добавляет к семейству новый компонент). 

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

	

	Наиболее часто используемые свойства объекта UserForm

	Name

	Возвращает имя пользовательской формы 

	Caption

	Возвращает текст, отображаемый в строке заголовка формы 

	BackColor

	Возвращает цвет фона формы 

	BorderStyle

	Устанавливает тип границы 

	Picture

	Указывает рисунок, отображаемый как фон формы 

	Left И Top

	Возвращают местоположение верхнего левого угла формы в пунктах 

	Height и Width 

	Возвращают высоту и ширину формы в пунктах 

	StartUpPosition

	Возвращает значение, определяющее положение формы при ее первом отображении на экране. Допустимые значения:

	– Manual (начальное значение не устанавливается), 

	– СenterOwner (выравнивание по центру объекта, к которому принадлежит форма), 

	– CenterScreen (выравнивание по центру экрана), 

	– Windows Default (положение верхнего левого угла экрана)

	

	Наиболее часто используемые методы объекта UserForm

	

	Show

	Отображает форму на экране

	Hide

	Закрывает форму

	Move

	Изменяет положение и размер формы

	PrintForm

	Печатает изображение формы

	

	Основные события объекта UserForm.

	

	Initilize

	Происходит при отображении формы на экране

	Terminate

	Происходит при закрытии формы

	

	2.5.1 Семейство Controls

	Доступ к семейству всех элементов управления, расположенных в пользовательской форме UserForm, осуществляется с помощью семейства Controls. Например, чтобы скрыть все элементы управления формы UserForm, можно использовать код, в котором свойству Visible элемента управления, определяющему, отображается ли этот элемент на экране или нет, устанавливается значение False:

	For Each Элемент in UserFormI.Controls

	Элемент.Visible = False 

	Next Control

	

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

	Обсудим процесс создания пользовательской формы на примере конструирования простейшего диалогового окна.

		Шаг 1	Выберите команду Сервис, Макрос, Редактор Visual Basic (Tools, Macro, Visual Basic) для того, чтобы перейти в редактор Visual Basic. 

		Шаг 2	Выберите команду Вставить User Form (Insert UserForm). В редакторе Visual Basic появятся: – Окно с пользовательской формой; – Панель инструментов Панель элементов (Toolbox) (рис. 2.6).

		Шаг З	Используя диалоговое окно Свойства (Properties), отображаемое нажатием кнопки и Панель элементов (Toolbox), создайте из пользовательской формы диалоговое окно, показанное на рисунке 2.7. Это окно состоит из трех кнопок и одного поля. Свойство Caption пользовательской формы определите равным Песнь о воробушке и бабочке, а кнопок – равными Первый акт, Второй акт и Третий акт.

		Шаг 4	Для того чтобы написать процедуру обработки события нажатия кнопки Первый акт, дважды щелкните ее. Активизируется модуль UserForm1, в который введите процедуру: Private Sub CommandButton1_Click () TextBox1.Text = "Воробышек за бабочкой прыг-прыг-прыг" End Sub

	

	

	Рисунок 2.6 Окно редактора Visual Basic с пользовательской формой и панелью элементов

	
Для обработки событий нажатий кнопок Второй акт и Третий акт в модуле UserForm1 введите следующие две процедуры:

	Private Sub ConmmandButton2_Click () 

	TextBoxl.Text = "Воробышек за бабочкой скок-скок-скок" 

	End Sub

	Private Sub CommandButton3 Click() 

	TextBoxl.Text = "Воробышек бабочку ням-ням-ням"

	End Sub

		Шаг 5	Процесс создания диалогового окна и процедур, связанньк с ним, завершен. Для того чтобы проверить, как работает созданная программа, нажмите кнопку Запуск подпрограммы/UserForm (Run). На экране на фоне рабочего листа отобразится диалоговое окно Песнь о воробушке и бабочке. Для проверки функционирования кнопок нажмите, например, кнопку Первый акт. В поле выведется сообщение Воробышек за бабочкой прыг-прыг-прыг (рис. 2.7). Для закрытия диалогового окна Песнь о воробушке и бабочке нажмите системную кнопку, расположенную в верхней правой части строки заголовка диалогового окна.

	

	

	Рисунок 2.7 Редактор Visual Basic с преобразованной пользовательской формой для создаваемого приложения

	
2.6 Общие свойства элементов управления

	

	Приведем основные общие свойства элементов управления.

	Name

	Имя элемента управления

	Caption

	Надпись, отображаемая при элементе управления

	AutoSize

	Допустимые значения: True (устанавливает режим автоматического изменения размеров элемента управления так, чтобы на нем полностью помещался текст, присвоенный свойству Caption) и False (в противном случае)

	Visible

	Допустимые значения: True (элемент управления отображается во время выполнения программы) и False (в противном случае)

	Enabled 

	Допустимые значения: True (пользователь вручную может управлять элементом управления) и False (в противном случае)

	Height и Width

	Устанавливают геометрические размеры объекта (высоту и ширину)

	Left и Top

	Устанавливают координаты верхнего левого угла элемента управления, определяющие его местоположение в форме

	ControlTipText

	Устанавливает текст в окне всплывающей подсказки, связанной с элементом управления. В следующем примере элементу управления CommandButton1 назначен текст всплывающей подсказки это кнопка:

	CommandButton1.ControlTipText = "Это кнопка"

	BackColor, ForeColor и BorderColor

	Устанавливают цвет заднего и переднего плана элемента управления, также его границы

	BackStyle

	Устанавливает тип заднего фона

	BorderStyle

	Устанавливает тип границы. Допустимые значения: 

	- fmBorderStyleSingle (граница в виде контура) 

	- fmBorderStyleNone (граница невидима)

	SpecialEffect

	Устанавливает тип границы. Отличается от свойства BorderStyle тем, что позволяет установить несколько типов, но одного цвета. BorderStyle позволяет установить только один тип, но различных цветов

	Picture 

	(создание картинки)

	Внедряет картинку на элемент управления. Например, на поверхности кнопки картинка отображается с помощью следующей инструкции:

	CommandButtonI.Picture = _

	 LoadPicture("с:\my doc\Kpyг.bmp")

	Функция LoadPicture(ПолноеИмяФайла) считывает графическое изображение. Аргумент ПолноеИмяФайла указывает полное имя графического файла

	Picture

	(удаление картинки)

	После того как картинка создана на элементе управления, иногда возникает необходимость ее удалить. Это легко достигается присвоением свойству picture значения LoadPicture("") 

	Tag

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

	 Private Sub UserForm Initialize ()

	 Dim Элемент As Object

	 CommandButton1.Tag = "Показать"

	CommandButton2 . Tag = "Спрятать" 

	CommandButton3 . Tag = "Показать" 

	TextBox1.Tag = "Показать" 

	For Each Элемент In Controls

	If Элемент.Tag="Показать" Then

	 Элемент.Visible = True

	 Else

	 Элемент.Visible = False

	End If 

	Next Элемент 

	End Sub

	

	Цвета, устанавливаемые свойствами BackColor, Forecolor и BorderColor, задаются шестнадцатеричными числами. Если эти свойства устанавливать не при помощи окна Свойства (Properties), а программно, вместо этих шестнадцатеричных чисел удобнее использовать соответствующие постоянные, задающие цвета.

	Константы, задающие цвет

	

	Константа

	Значение

	Цвет

	vbBlack

	0х0

	Черный

	vbRed

	OxFF

	Красный

	vbGreen

	OxFFOO

	Зеленый

	vbYellow

	OxFFFF

	Желтый

	vbBlue

	OxFFOOOO

	Синий

	vbMagenta

	OxFFOOFF

	Розовый

	vbCyan

	OxFFFFOO

	Голубой

	vbWhite

	OxFFFFFF

	Белый

	

	
2.6.1 Соглашения об именах

	При создании формы или элемента управления, VBA устанавливает свойство объекта Name (т. е. его имя) по умолчанию. Например, для первой созданной кнопки свойство Name устанавливается равным CommandButton1, для второй – CommandButton2 и т. д. При разработке приложений с одной формой имя объекта, устанавливаемое по умолчанию, обычно не вызывает никаких проблем и в этом случае имена объектов оставляют без изменения. Если приложение обладает сложной структурой и состоит из нескольких форм, будет трудно отличить первую кнопку CommandButton1 первой формы, от первой кнопки CommandButton1 второй формы. В этом случае полезно переименовать объекты так, чтобы они легче различались. Для переименования объектов и переменных в среде Windows существует соглашение об именах, называемое венгерской нотацией. Суть соглашения состоит в следующем: имя объекта начинается с короткого префикса, одинакового для объектов одного и того же рода. За префиксом следует собственно имя, отображающее суть объекта. Ниже приведены префиксы и примеры имен управляющих элементов.

	

	 Примеры префиксов и имен

	Управляющий элемент

	Префикс

	Пример имени

	TextBox

	txt

	txtAcount

	Label

	lbl

	lblInform

	CommandButton

	cmd

	cmdOK

	ListBox

	lst

	lstNames

	ComboBox

	cbo

	cboFirms

	ScrollBar

	scr

	scrDown

	SpinButton

	spn

	spnUp

	OptionButton

	opt

	optChoice

	CheckBox

	chk

	chkSex

	ToggleButton

	Tgl

	TglSwitch

	Frame

	fra

	fraStatus

	Image

	img

	imgBall

	RefEdit

	ref

	ref Fun

	MultiPage

	mit

	rnltPages

	TabStrip

	tab

	tabTwoTabs

	UserForm

	frm

	frmGame

	

	2.7 Общие методы и события элементов управления

	

	Перечислим основные общие методы элементов управления.

	

	Add

	Позволяет добавить элемент управления во время выполнения программы 

	Move

	Перемещает элемент управления 

	SetFocus

	Устанавливает фокус на вызвавшем этот метод элементе управления. Часто применяется в программах обработки ошибок 

	Zorder

	Помещает объект до или после всех пересекающихся с ним объектов

	

	Перечислим наиболее часто употребляемые общие события элементов управления.

	

	Click 

	Происходит, когда пользователь выбирает элемент управления с помощью одинарного щелчка кнопкой мыши

	Dbici'ick

	Происходит, когда пользователь выбирает элемент управления с помощью двойного щелчка кнопкой мыши

	Keypress

	Происходит, когда пользователь нажимает любую клавишу на клавиатуре, кроме функциональных и клавиш управления курсором

	Change

	Происходит при изменении значения элемента управления

	GotFocus и LostFocus

	Происходит, когда элемент управления получает или теряет фокус

	Error

	Используется при уведомлении об ошибке

	

	Рассмотрим синтаксис процедур обработки событий, генерируемых нажатием кнопки мыши и перемещением указателя мыши и связанных с элементами управления.

	События, связанные с нажатием кнопки мыши и перемещением мыши

	Событие 	Событие происходит

	MouseDown 	При нажатии кнопки мыши

	MouseUp 	При отпускании кнопки мыши 

	MouseMove 	При перемещении указателя мыши

	Синтаксис:

	Private Sub object_MouseDown( ByVal Button As fmButton, _ 

	ByVal Shift As fmShiftState, ByVal X As Single, ByVal Y As Single)

	Private Sub object_MouseUp ( ByVal Button As fmButton, _

	ByVal Shift As fmShiftState, ByVal X As Single, ByVal Y As Single)

	Private Sub object_MouseMove( ByVal Button As fmButton,_

	ByVal Shift As fmShiftState, ByVal X As Single, ByVal Y As Single)

	

	Аргументы:

	Button

	Возвращает код (значение) нажатой кнопки мыши. Допустимые значения:

	- fmButtonLeft или l (левая)

	-fmButtonRight ИЛИ 2 (правая) 

	-fmButtonMiddle ИЛИ 4 (средняя)

	Shift

	Возвращает код (значение) нажатой на клавиатуре клавиши. Допустимые значения:

	fmShiftMask ИЛИ 1 (<Shift>) 

	fmCtrlMask ИЛИ 2 (<Ctrl>)

	fmAltMask ИЛИ 4 (<Alt>) .

	X и Y

	Возвращает значение расстояния от левого или от верхнего края формы, рамки или страницы. При событии MouseMove этим расстоянием считается путь в направлении от левого верхнего угла элемента управления по горизонтали или вертикали

	

	Рассмотрим синтаксис процедур обработки событий при операциях drag-and-drop, связанных с элементами управления.

	События, связанные с перемещением элемента управления

	Событие 	Событие происходит

	BeforeDragOver 	Пока совершается операция drag-and-drop 

	BeforeDropOrPaste 	Перед завершением операции drag-and-drop

	Синтаксис:

	Private Sub object_BeforeDragOver(ByVal Cancel As _ 

	MSForms.ReturnBoolean, ByVal Data As DataObject, _

	 ByVal X As Single, ByVal Y As Single, _

	 ByVal DragState As fmDragState, _ 

	 ByVal Effect As MSForms.ReturnEffect, _ 

	 ByVal Shift As fmShiftState)

	Private Sub object_BeforeDropOrPaste(ByVal Cancel As _ 

	MSForms.ReturnBoolean, ByVal Action As fmAction, _ 

	 ByVal Data As DataObject, ByVal X As Single, ByVal Y As Single, _ 

	 ByVal Effect As MSForms.ReturnEffect, _ 

	 ByVal Shift As fmShiftState)

	

	Аргументы:

	Cancel

	Допустимые значения: False (по умолчанию, элемент управления обрабатывает событие) и True (приложение обрабатывает событие)

	Data

	Данные, перемещаемые во время операции drag-and-drop. Эти данные размещаются в объекте DataObject. Объект DataObject это своеобразный аналог буфера обмена, в отличии от которого в нем допускается хранить только текстовую информацию

	X и Y

	Расстояние от левого верхнего угла элемента управления по горизонтали и вертикали

	DragState

	Устанавливает позицию указателя мыши относительно целевого объекта. Допустимые значения:

	fmDragStateEnter или 0 (указатель мыши внутри целевого элемента управления) 

	 fmDragStateLeave или 1 (указатель мыши вне целевого элемента управления) 

	 fmDragStateOver или 2 (указатель мыши в новой позиции, но остается внутри элемента управления)

	Effect

	Устанавливает операцию, производимую над объектом. Допустимые значения: 

	- fmDropEffectNone или 0(не копировать и не перемещать объект)

	fmDropEffectCopy или 1 (копировать объект) 

	 fmDropEffectMove или 2 (перемещать объект) 

	fmDropEffectCopyOrMove или 3 (копировать или перемещать объект)

	Shift

	Возвращает код (значение) нажатой на клавиатуре клавиши. Допустимые значения: 

	-fmShiftMask ИЛИ 1 (<Shift>) 

	-fmCtrlMask ИЛИ 2 (<Ctrl>) 

	- fmAltMask ИЛИ 4 (<Alt>)

	

	
2.8 Стандартные объекты и элементы управления

	

	2.8.1 Объект DataObject

	Объект DataObject предназначен для передачи текстовой информации при выполнении операций drag-and-drop между элементами управления. По своему действию объект DataObject в основном аналогичен буферу обмена, но в отличие от него он может хранить только текстовую информацию, которая исчезает при закрытии приложения. Рассмотрим методы объекта DataObject.

	

	GetText

	Возвращает текстовую строку из объекта DataObject.

	 Синтаксис:

	String = object.GetText

	SetText

	Копирует текстовую строку в объект DataObject. 

	Синтаксис:

	SetText(StoreData) 

	- StoreData определяет данные, копируемые в

	объект DataObject

	StartDrag

	Инициирует операцию drag-and-drop для объекта

	DataObject.

	Синтаксис:

	ЦелаяПеременная = Object.StartDrag

	- ЦелаяПеременная — возвращает тип операции drag-and-drop (с копированием или перемещением)

	GetText

	Возвращает текстовую строку из объекта DataObject. Синтаксис:

	СтроковаяПеременная = object.GetText 

	- СтроковаяПеременная — переменная, которой присваивается текстовая строка, хранящаяся в

	Объекте DataObject

	PutInClipboard

	Переносит данные из объекта DataObject в буфер обмена

	GetFromCiipboard

	Переносит данные из буфера обмена в объект

	DataObject

	

	Перейдем теперь к обсуждению каждого из элементов управления по отдельности.

	
2.8.2 Поле

	Элемент управления TextBox (поле) создается с помощью кнопки Поле (TextBox) панели элементов управления (рис. 2.8). В основном TextBox используется для ввода текста, который в последующем используется в программе, или для вывода результатов расчетов программы. Текст, введенный в поле, обычно в программе преобразуется либо в числа, либо в формулы

	.

	

	Рисунок 2.8 Поле в форме 

	

	Основные свойства элемента управления TextBox перечислены ниже.

	Text

	Возвращает текст, содержащийся в поле

	Visible

	Допустимые значения: True (поле отображается во время выполнения программы) и False (в противном случае)

	Enabled

	Допустимые значения: True (пользователь непосредственно может вносить изменения в содержание поля) и False (в противном случае)

	Multiline

	Допустимые значения: True (устанавливается многострочный режим ввода текста в поле) и False (однострочный режим)

	Wordwrap

	Допустимые значения: True (устанавливается режим автоматического переноса) и False (в противном случае)

	AutoSize

	Допустимые значения: True (устанавливается режим автоматического изменения размера поля так, чтобы весь вводимый текст помещался в нем) и False (устанавливается фиксированный размер поля)

	ScrollBars

	Устанавливает режим отображения в поле полос прокрутки. Допустимые значения: СЧ fmScrollBarsNone (не выводить полос прокрутки)

	fmScrollBarsHorizontal (выводить горизонтальную полосу прокрутки)

	fmScrollBarsVertical (выводить вертикальную полосу прокрутки)

	fmScrollBarsBoth (выводить горизонтальную и вертикальную полосы прокрутки)

	SelLenght, SelStart И SelText

	Эти свойства характеризуют выделенный в поле фрагмент текста (длина, начало и сам фрагмент текста соответственно)

	MaxLength

	Устанавливает максимальное допустимое количество вводимых в поле символов. Если это свойство равно 0, то нет ограничений на вводимое количество символов.

	PasswordChar

	Устанавливает символ, отображаемый при вводе пароля. Если это свойство определено, то вместо вводимых символов в поле будет отображаться установленный символ

	

	2.8.3 Надпись

	Элемент управления Label (надпись) создается с помощью кнопки Надпись (Label) панели элементов управления (рис. 2.9). В основном Label используется для отображения надписей, например заголовков, не имеющих свойства caption. Надпись не может быть изменена пользователем, но код программы во время ее выполнения может управлять текстом надписи.

	

	

	Рисунок 2.9 Надпись в форме

	

	Основные свойства элемента управления Label перечислены ниже.

	

	Caption

	Возвращает текст, отображаемый в надписи

	Visible

	Допустимые значения: True (поле отображается во время выполнения программы) и False (в противном случае)

	Multiline

	Допустимые значения: True (устанавливается многострочный режим ввода текста в поле) и False (однострочный режим)

	Wordwrap

	Допустимые значения: True (устанавливается режим автоматического переноса) и False (в противном случае)

	AutoSize

	Допустимые значения: True (устанавливается режим автоматического изменения размера поля так, чтобы весь вводимый текст помещался в нем) и False (устанавливается фиксированный размер поля) 

	

	2.8.4 Кнопка

	Элемент управления СommandButton (кнопка) создается с помощью кнопки Кнопка (CommandButton) (рис. 2.10). Элемент управления СommandButton в основном используется для инициирования выполнения некоторых действий, вызываемых нажатием кнопки, например запуск программы или остановка ее выполнения, печать результатов и т. д.

	

	

	Рисунок 2.10 Кнопка в форме

	

	Приведем наиболее часто используемые свойства элемента управления CоmmandButton.

	

	Caption

	Возвращает текст, отображаемый на кнопке

	Cancel

	Допустимые значения: True (устанавливаются отменяющие функции для кнопки, т. е. нажатие клавиши <Esc> приводит к тем же результатам, что и нажатие кнопки) и False (в противном случае)

	Visible

	Допустимые значения: True (кнопка отображается во время выполнения программы) и False (в противном случае)

	Enabled

	Допустимые значения: True (запрещено нажатие кнопки пользователем) и False (в противном случае)

	Accelerator

	Назначает клавишу, при нажатии на которую одновременно с клавишей <Alt> происходит запуск действий, связанных с кнопкой. Например,

	CommandButton1. Accelerator = "С"

	Picture 

	Внедряет на поверхность кнопки картинку. Например,

	CommandButton1. Picture = _

	 LoadPicture ("с: \mydoc\Kpyг.bmp")

	функция LoadPicture (ПолноеИмяФайла) считывает Графическое изображение. Аргумент ПолноеИмяФайла указывает полное имя графического файла 

	Default

	Задает кнопку по умолчанию, т. е. устанавливает ту кнопку, для которой действия, связанные с ней, будут выполняться при нажатии клавиши <Enter> 

	

	2.8.5 Список

	Элемент управления ListBox (список) создается с помощью кнопки Список (ListBox) (рис. 2.11). Элемент управления ListBox применяется для хранения списка значений. Из списка пользователь может выбрать одно или несколько значений, которые в последующем будут использоваться в тексте программы.

	

	

	Рисунок 2.11 Список в форме

	

	Приведем наиболее часто используемые свойства элемента управления ListBox.

	

	

	Listlndex

	Возвращает номер текущего элемента списка. Нумерация элементов списка начинается с нуля

	ListCount

	Возвращает число элементов списка

	Toplndex

	Возвращает элемент списка с наибольшим номером

	ColumnCount

	Устанавливает число столбцов в списке

	TextColumn

	Устанавливает столбец в списке, элемент которого возвращается свойством Text

	Enabled

	Допустимые значения: True (запрещен выбор значения из списка пользователем) и False (в противном случае)

	Text

	Возвращает выбранный в списке элемент

	List

	Возвращает элемент списка, стоящий на пересечении указанных строки и столбца. Синтаксис: List(row, column)

	RowSource

	Устанавливает диапазон, содержащий элементы списка

	Control Source

	Устанавливает диапазон (ячейку), куда возвращается выбранный элемент из списка

	MultiSelect

	Устанавливает способ выбора элементов списка. Допустимые значения:

	– fmMultiSelectSingle (выбор только одного элемента);

	– fmMultiSelectMulti (разрешен выбор нескольких элементов посредством либо щелчка, либо нажатием клавиши <Пробел>);

	– fmMultiSelectExtended (разрешено использование клавиши <Shift> при выборе ряда последовательных элементов списка)

	Selected

	Допустимые значения: True (если элемент списка выбран) и False (в противном случае). Используется для определения выделенного текста, когда свойство MultiSelect имеет значение fmMultiSelectMulti или fmMultiSelectExtended

	ColumnWidths

	Устанавливает ширину столбцов списка. Синтаксис:

	ColumnWidths = String

	- String – строка, устанавливающая ширину столбцов.

	В следующем примере устанавливается ширина каждого из трех столбцов списка:

	With ListBox1

	 .ColumnCount = 3

	 .ColumnWidths = "20;30;30"

	 End With

	ColumnHeads

	Допустимые значения: True (выводятся заголовки столбцов раскрывающегося списка) и False (в противном случае)

	ListStyle

	Допустимые значения:

	– fmListStyleplain (выбранный элемент из списка выделяется цветом);

	– fmListStyleOption (перед каждым элементом в списке располагается флажок и выбор элемента из списка соответствует установке этого флажка)

	MatchEntry

	Выводит первый подходящий элемент из списка при наборе его имени на клавиатуре. Допустимые значения: 

	– fmMatchEntryNone (режим вывода подходящего элемента в списке отключен);

	– fmMatchEntryFirstLetter(выводит подходящий элемент по набранной первой букве. В этом случае, предпочтительно, чтобы элементы списка были бы упорядочены в алфавитном порядке);

	– fmMatchEntryComplete (выводит подходящий элемент по полному набранному имени)

	BoundColumn

	Устанавливает тип, возвращаемый свойством Value. А именно, если свойство BoundColumn равно 0, то свойство value возвращает индекс выбранной строки, т. е. в этом случае оно действует как свойство Listindex. Если свойство BoundColumn принимает значение из диапазона от 1 до количества столбцов в списке, то свойствоValue возвращает элемент из выбранной строки, стоящий в столбце, определенном свойством BoundColumn

	

	Приведем наиболее часто используемые методы элемента управления ListBox.

	

	Clear 

	Удаляет все элементы из списка 

	Remove Item

	Удаляет из списка элементы с указанным номером.

	 Синтаксис:

	Remove Item (index) 

	index — номер, удаляемого из списка элемента

	Add Item

	Добавляет элемент в список. Синтаксис:

	Addltem ( [ item [, varIndex]]) 

	-item — элемент (строковое выражение), добавляемый в список

	-varlndex — номер добавляемого элемента

	

	Заполнение списка

	Заполнить список можно одним из следующих способов

	

	Поэлементно, если список состоит из одной колонки(рис. 2.12)

	With ListBox1

	 .AddItem “Июнь”

	 .AddItem “Июль”

	 .AddItem “Август”

	 .ListIndex = 0

	End With 

	

	

	Рисунок 2.12 Список с одной колонкой элементов

	

	

	Массивом, если список состоит из одной колонки

	With ListBoxl

	.List = Array("Июнь","Июль","Август")

	.Listlndex = 1

	End With

	Из диапазона a1: B4, в который предварительно введены элементы списка. Результат выбора (индекс выбранной строки) выводится в ячейку

	С1

	With ListBoxl

	.ColumnCount = 2

	.RowSource = "A1:B4"

	.ControlSource = "С1"

	.BoundColumn = 0

	End With

	Поэлементно, если список состоит из нескольких колонок, например двух

	With ListBoxl

	.ColumnCount = 2

	.Addltem "Июнь"

	.ListfO, 1) = "Сессия"

	.Addltem "Июль"

	.Listfl, 1) = "Каникулы"

	.Addltem "Август"

	.List (2, 1) = "Каникулы"

	End With

	Массивом, если список состоит из нескольких колонок, например двух

	Dim A (2, 1) As String

	A(0, 0) = "Июнь"

	A(0, 1) = "Сессия"

	A(1, 0) = "Июль"

	А(1, 1) = "Каникулы"

	A(2, 0) = "Август"

	A(2, 1) = "Каникулы"

	With ListBox1

	.ColumnCount = 2

	.List = A End With

	

	Выбор нескольких элементов из списка

	Свойство Multiselect позволяет устанавливать режим, при котором допустим выбор нескольких элементов из списка. Свойство Selected предоставляет возможность проверить, выбран ли элемент с указанным индексом. На рис. 2.13 показан выбор нескольких элементов из списка. Приведём пример использования этих свойств при вычислении среднего значения выбранных в списке элементов. 

	


	Рисунок 2.13 Выбор нескольких элементов из списка

	

	With ListBox1

	.List = Array(1, 3, 4, 5, 6, 7, 8, 9)

	.Listlndex = 0

	.MultiSelect = fmMultiSelectMuIti

	Среднее = 0

	n = 0

	For i = 0 То .ListCount – 1

	If .Selected(i) = True Then

	n = n + l

	Среднее = Среднее + .List(i)

	End If

	Next I

	End With

	Среднее = Среднее / n

	

	2.8.6 Поле со списком

	Элемент управления СоmbоВох (поле со списком) создается с помощью кнопки Поле со списком (ComboBox) (рис. 2.14). Элемент управления ComboBox применяется для хранения списка значений. Он сочетает в себе функциональные возможности списка ListBox и поля TextBox. В отличие от ListBox, в элементе управления СomboВох, отображается только один элемент списка. Кроме того, у него отсутствует режим выделения нескольких элементов списка, но он позволяет вводить значение, используя поле ввода, как это делает элемент управления TextBox.

	Свойства объекта СomboВох, такие как Listlndex, ListCount, Enabled, List и методы Clear, RemoveItem и AddItem аналогичны соответствующим свойствам и методам списка ListBox. Кроме того, у него есть ряд уникальных свойств.

	

	

	Рисунок 2.14 Поле со списком в форме

	

	Приведем наиболее употребляемые из уникальных свойств элемента управления СоmbоВох.

	

	DropButtonStyle

	Устанавливает вид раскрывающегося списка. Допустимые значения:

	– FmDropButtonStylePlain(кнопка без символов);

	– FmDropButtonStyleArrowDisplays (кнопка со стрелкой);

	– FmDropButtonStyleEllipsis (кнопка с эллипсом);

	– FmDropButtonStyleReduce (кнопка с линией)

	 ListRows

	Устанавливает число элементов, отображаемых в раскрывающемся списке

	 MatchRequired

	Допустимые значения: True (в поле ввода раскрывающегося списка нельзя ввести значения, отличные от перечисленных в списке, т. е. в поле со спискам отключается функция поля ввода) и False (в противном случае)

	 MatchFound

	Допустимые значения: True (среди элементов раскрывающегося списка имеется элемент, совпадающий с вводимым в поле ввода раскрывающегося списка) и False (в противном случае)

	

	
2.8.7 Полоса прокрутки и счетчик

	Элемент управления ScrollBar (полоса прокрутки) создается с помощью кнопки Полоса прокрутки (ScrollBar) (рис. 2.15).

	

	

	Рисунок 2.15 Полоса прокрутки и счетчик в форме

	

	Приведем наиболее часто используемые свойства элемента управления ScrollBar.

	

	Value

	Возвращает текущее значение полосы прокрутки (только целые неотрицательные числа)

	Min

	Минимальное значение полосы прокрутки (только целые неотрицательные числа)

	Max

	Максимальное значение полосы прокрутки (только целые неотрицательные числа)

	SrnallChange

	Устанавливает шаг изменения значения при щелчке по одной из стрелок полосы прокрутки

	Enabled

	Допустимые значения: True (пользователь может изменить значение полосы прокрутки) и False (в противном случае) 

	Visible

	Допустимые значения: True (полоса прокрутки отображается во время выполнения программы) и False (в противном случае)

	

	Элемент управления SpinButton (счетчик) создается с помощью кнопки Счетчик (SpinButton) (рис. 2.15). Элемент управления SpinButton по своим функциональным возможностям аналогичен полосе прокрутки. Если не быть чрезмерным буквоедом, то можно сказать, что счетчик – это полоса прокрутки без ползунка. Счетчик имеет те же свойства Value, Min, Mах, Enabled, Visible и SmallChange, что и полоса прокрутки.

	
2.8.8 Переключатель

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

	

	

	Рисунок 2.16 Переключатель в форме.

	

	Приведем наиболее часто используемые свойства элемента управления OptionButton.

	

	Value

	Возвращает True, если переключатель выбран и False в противном случае

	Enabled

	Допустимые значения: True (пользователь может выбрать переключатель) и False (в противном случае) 

	Visible

	Допустимые значения: True (переключатель отображается во время выполнения программы) и False (в противном случае)

	Capture

	...................................................

	Надпись, отображаемая рядом с переключателем 

	

	Рассмотрим способ использования переключателей на примере классической игры «Орел и Решка». Выбирая один из двух переключателей, игрок загадывает один из вариантов: орел (1 для компьютера) или решка (0 для компьютера). Не зная о выборе игрока, компьютер синтезирует с равной вероятностью либо 0, либо 1, что моделирует бросание монеты. Если игрок угадал правильную сторону монеты, подброшенную компьютером, то он выигрывает. В противном случае выигрывает компьютер. Компьютер информирует игрока о результате игры. На рис. 2.17 приведено диалоговое окно, отображаемое на экране в случае проигрыша игрока.

	

	

	Рисунок 2.17 Диалоговое окно, отображаемое на экране при проигрыше игрока

	

	Для создания приложения, моделирующего игру «Орел и Решка», с помощью пользовательской формы UserForm1 создадим диалоговое окно, показанное на рис. 2.18, а в модуле UserForm1 введем следующую процедуру, синтезирующую отклик на нажатие кнопки Бросание монеты.

	

	

	Рисунок 2.18 Диалоговое окно игры Орел-Решка

	

	Private Sub CommandButtonl_Click()

	' Генерация с равной вероятностью либо 0 (решка), либо 1	(орел),

	' т. е. моделирование бросания монеты 

	Randomize

	Монета = Int(2 * Rnd)

	' Сравнение результата бросания монеты компьютером 

	' с ситуацией, если игрок загадал "Орел" 

	If OptionButtonl.Value = True Then

	If Монета = 0 Then MsgBox "He везет. Займись-ка лучше изучением VBA" 

	If Монета = 1 Then MsgBox "Везунчик. Поздравляю, ты выиграл."

	End If 

	' Сравнение результата бросания монеты компьютером 

	' с ситуацией, если игрок загадал "Решка"

	If OptionButton2.Value = True Then

	 If Монета = 1 Then MsgBox "He везет. Займись-ка лучше изучением VBA" 

	 If Монета = 0 Then MsgBox "Везунчик. Поздравляю, ты выиграл"

	End If

	End Sub

	

	2.8.9 Рамка

	Элемент управления Frame (рамка) создается с помощью кнопки Рамка (Frame) (рис. 2.19). Он используется для визуальной группировки элементов управления. Основным свойством рамки является Capture, отображающее надпись рамки.

	

	2.8.10 Флажок и выключатель

	Элемент управления СheckBox (флажок) создается с помощью кнопки Флажок (Checkbox) (рис. 2.20). Этот элемент управления предоставляет пользователю возможность выбора. Флажок обычно имеет два состояния: установленное и сброшенное, но может настраиваться на выбор из трех альтернатив. Флажок имеет те же свойства Value, Enabled, Visible и Capture, что и переключатель. Кроме того, флажок обладает уникальным свойством TripleState, позволяющим производить выбор из трех альтернатив. Свойство TripieState может принимать два значения: False (выбор из двух альтернатив True и False) и True (выбор из трех альтернатив True, False и Null).

	

	


	Рисунок 2.19 Рамка в форме

	

	

	Рисунок 2.20 Флажок и выключатель в форме

	

	Элемент управления ToggleButton (выключатель) создается с помощью кнопки Выключатель (ToggleButton) (рис. 2.20). Этот элемент управления предоставляет пользователю те же возможности, что и флажок.

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

	Private Sub UserForm_Initialize()

	ToggleButtonl.Value = True ToggleButton2.Value = False ToggleButton3.TripleState = True

	ToggleButton3.Value = Null 

	CheckBoxl.Value = True CheckBox2.Value = False CheckBox3.TripleState = True CheckBox3.Value = Null 

	End Sub

	


	Рисунок 2.21 Три допустимых состояния выключателя и флажка

	

	2.8.11 Рисунок

	Элемент управления Image (рисунок) создается с помощью кнопки Рисунок (Image). Он используется для отображения графических файлов в формате bmp, cur, gif, ico, jpg и wmf. Перечислим некоторые из его свойств, используемых для управления выводом изображения.

	

	 AutoSize

	Допустимые значения: True (рисунок автоматически изменяет размер для того, чтобы отобразить изображение целиком) и False (в противном случае). 

	 Picture

	Задает отображаемый графический файл. Используется с функцией LoadPicture.

	Синтаксис:

	Picture = LoadPicture(ПолноеИмяФайла) 

	– ПолноеИмяФайла – полное имя отображаемого графического файла

	PictureSizeMode

	Устанавливает масштабирование рисунка. Допустимые значения: 

	– fmPictureSizeModeClip (не помещающиеся в границах объекта части рисунка обрезаются);

	– fmPictureSizeModeStretch (рисунок масштабируется так, чтобы он занимал всю поверхность объекта); 

	– fmPictureSizeModeZoom (рисунок масштабируется с cохранением относительных размеров так, чтобы он помещался целиком внутри объекта)

	PictureAlignment

	Устанавливает расположение рисунка внутри объекта. Допустимые значения:

	– fmPictureAlignmentTopLeft (в верхнем левом углу); 

	– fmPictureAlignmentTopRight (в верхнем правом углу);

	– fmPictureAlignmentCenter (в центре); 

	– fmPictureAlignmentBottomLeft (в нижнем левом углу); 

	– fmPictureAlignmentBottomRight (в нижнем правом углу)

	PictureTiling

	Допустимые значения: True (объект покрывается мозаикой из рисунка) и False (в противном случае)

	

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

	Private Sub UserForm_Initialize() 

	With Image1

	.PictureAlignment = fmPictureAlignmentTopLeft

	.PictureSizeMode = fmPictureSizeModeZoom

	.Picture = LoadPicture("c:\Face.bmp") 

	End With

	With Image2

	.PictureAlignment = fmPictureAlignmentTopLeft

	.PictureSizeMode = fmPictureSizeModeStretch

	.Picture = LoadPicture("с:\Face.bmp")

	 End With

	With Image2

	.PictureAlignment = fmPictureAlignmentTopLeft .PictureSizeMode = fmPictureSizeModeStretch

	Picture = LoadPicture("c:\Face.bmp") 

	End With

	With Image3

	.PictureAlignment = fmPictureAlignmentTopLeft .PictureSizeMode = fmPictureSizeModeClip

	.Picture = LoadPicture("c:\Face.bmp")

	End With

	With Image4

	.PictureAlignment = fmPictureAlignmentTopLeft

	.PictureTiling = True

	 .Picture = LoadPicture("c:\Face.bmp")

	End With

	End Sub

	

	

	Рисунок 2.22 Четыре примера размещения рисунка

	

	2.8.12 Ссылки на ячейки и диапазоны

	Элемент управления RefEdit (редактирование ссылок) создается с помощью кнопки RefEdit (рис. 2.23). Элемент управления RefEdit обычно используется для ввода ссылок на ячейки или диапазоны. Основным свойством элемента управления RefEdit является Text, возвращающее строку, введенную в поле ввода этого элемента управления.

	

	

	Рисунок 2.23 Элемент управления RefEdit в форме

	
2.8.13 Набор страниц

	Элемент управления MultiPage (набор страниц) создается с помощью кнопки Набор страниц (MultiPage) (рис. 2.24). Этот элемент управления реализует многостраничные диалоговые окна. Заголовки страниц отображаются на вкладках. Переход от страницы к странице осуществляется выбором вкладки посредством щелчка кнопкой мыши.

	

	

	Рисунок 2.24 Набор страниц в форме

	

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

	Объект MultiPage содержит в себе семейство Pages, являющееся набором всех страниц, входящих в этот объект.

	Перечислим свойства объекта MultiPage.

	

	Value и

	BoundValue

	Возвращают номер активной страницы. Нумерация производится с нуля

	MultiRow

	Допустимые значения: True (если ярлыки не помещаются в одну строку, то они выводятся в несколько строк) и False (если ярлыки не помещаются в одну строку, то появляется полоса прокрутки, позволяющая переходить от страницы к странице) 

	Selectedltem

	Возвращает выбранную страницу

	

	Семейство Pages, содержащее все страницы, входящие в объект MultiPage, имеет единственное свойство Count, возвращающее число элементов семейства. Кроме того, у семейства Pages имеются следующие методы.

	

	Add

	Создает новую страницу. Синтаксис:

	Set Object = object.Add( [ Name [, Caption [, index]]]) 

	object – семейство Pages 

	 Name – имя страницы

	Сaption – текст, отображаемый на ярлыке страницы

	index – номер страницы, нумерация страниц производится с 0 

	Clear

	Удаляет все страницы из семейства Pages 

	Remove

	Удаляет страницу из семейства Pages 

	Item

	Возвращает страницу со специфицированным индексом. 

	 Синтаксис: Set Object = object.Item(collectionindex) 

	

	2.8.14 Набор вкладок

	Элемент управления TabStrip (набор вкладок) создается с помощью кнопки Набор вкладок (TabStrip) (рис. 2.25). Он позволяет создать несколько вкладок в диалоговом окне. Объект TabStrip содержит в себе семейство Tabs, представляющее собой набор всех вкладок. Объект TabStrip и семейство Tabs обладают теми же свойствами и методами, что и объект MultiPage и семейство Pages.

	

	

	Рисунок 2.25 Набор страниц в форме

	

	
2.9 Последовательность выбора элементов управления

	

	Последовательность перехода от одного элемента управления к другому определяет порядок, в соответствии с которым активизируются эти элементы управления при нажатии клавиши <Таb>. Для установки последовательности перехода в пользовательской форме необходимо: 1 Находясь в редакторе Visual Basic выбрать команду Вид, Последовательность перехода (View, Tab Order). 2 В появившемся диалоговом окне Последовательность перехода (Tab Order) с помощью клавиш Вниз (Move Down) и Вверх (Move Up) изменить порядок выделенного элемента управления в зависимости от потребности (рис. 2.26).

	

	

	Рисунок 2.26 Диалоговое окно Последовательность перехода

	

	Другим способом задания последовательности перехода является определение свойства TabIndex элемента управления. При этом надо помнить, что начальному элементу соответствует значение свойства TabIndex, равное 0, второму – 1, третьему – 2 и т. д.

	

	2.10 Диалоговые окна

	

	2.10.1 Инициализация и отображение диалогового окна

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

	Простой инициализации или обычного отображения диалогового окна часто бывает недостаточно, т. к. это приводит к появлению на экране функционально ненастроенного диалогового окна. Такое диалоговое окно можно сравнить с каркасом дома. В таком доме жить неприятно и в него совсем не хочется въезжать. Для того чтобы жить в доме было приятно и удобно, прежде чем в него вселяться, надо сделать много отделочных работ. Также и при инициализации диалогового окна необходимо предусмотреть огромное количество на первый взгляд мелочей, но без которых работать с диалоговым окном неудобно. В частности, при отображении диалогового окна на экране необходимо установить значения полей, применяемые по умолчанию, задать функции кнопок, назначить им комбинации клавиш, связать с элементами управления всплывающие подсказки, вывести в списках первоначально выводимые элементы списков, задать первоначальную установку флажков, переключателей, вывести в элементы управления формы требуемые рисунки и т. д. Приведем пример процедуры инициализации диалогового окна (рис. 2.27), в котором рассчитываются размеры периодических выплат при постоянной процентной ставке.

	

	

	Рисунок 2.27 Диалоговое окно Периодических выплат

	
Private Sub UserForm_Initialize() 

	' Процедура инициализации и активизации диалогового окна‘

	' Первоначальный выбор переключателя	Гистограмма

	OptionButton1.Value = True

	' Назначение клавише <Enter> функции	кнопки Вычислить 

	With CommandButton1

	.Default = True

	.ControlTipText = "Вычисление процентных ставок" & Chr(13) & _

	"составление отчета на рабочем листе" 

	End With 

	CommandButton2.ControlTipText = "Кнопка отмены"

	On Error GoTo Сообщение0

	With Image1

	' Установка такого же цвета границы элемента управления Рисунок,

	 ' как и его фон

	.BorderColor = .BackColor 

	' Загрузка рисунка, соответствующего переключателю Гистограмма

	.Picture = LoadPicture("VBA3_F1.BMP") End With

	UserForm1.Show

	Exit Sub 

	' В случае отсутствия файла с рисунком отображается сообщение 

	Сообщение0:

	If Err.Number Then

	MsgBox "Нет графического файла “VBA3_F1.BMP." & Chr(13) &

	"Работаем без картинки", vbCritical, "Выплаты" 

	End If

	Resume Next 

	End Sub

	

	
2.10.2 Закрытие диалогового окна

	В VBA диалоговые окна работают в режиме модального диалога. Это означает, что пользователь, прежде чем перейти к выполнению действий, не связанных с текущим активным диалоговым окном, должен его закрыть. Закрытие диалогового окна производится методом Hide. Следующая процедура является примером процедуры закрытия диалогового окна. Эта процедура активизируется при нажатии кнопки CommandButton2 диалогового окна UserForm1 и выполняет только одну инструкцию, осуществляющую закрытие этого диалогового окна.

	Private Sub CommandButton2_Click()

	‘ Процедура закрытия диалогового окна

	UserForm1.Hide 

	End Sub

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

	

	2.10.3 Отображение встроенных диалоговых окон

	VBA позволяет отображать программно на экране встроенные диалоговые окна в Excel наряду с пользовательскими диалоговыми окнами. Все встроенные диалоговые окна в Excel образуют семейство Dialogs, индекс которого специфицирует активизируемое диалоговое окно. Отображение встроенного диалогового окна на экране осуществляется методом Show. Например, следующая процедура при нажатии кнопки активизирует диалоговое окно Открытие документа (Open) (рис. 2.28).

	Private Sub CommandButton1_Click()

	 Application.Dialogs(xlDialogOpen).Show

	 End Sub

	

	

	Рисунок 2.28 Диалоговое окно Открытие документа

	

	В методе Show можно указывать аргументы, управляющие выводом в диалоговом окне специфицированной информации.

	

	 XlDialogFindFile

	Диалоговое окно Открытие документа (Open) при поиске файла

	 xlDialogPivotTableWizard

	Диалоговое окно Мастер сводных таблиц (Pivot Table Wizard)

	Wizard)

	 xlDialogSaveAs

	Диалоговое окно Сохранить как (Save as)

	 xlDialogSaveWorkbook

	Диалоговое окно Сохранить (Save)

	 xlDialogPrint

	Диалоговое окно Печать (Print)

	

	
3. Типы данных, переменные и константы

	

	3.1 Типы данных

	

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

	В VBA имеются следующие основные типы данных:

	

	Тип данных

	

	Размер (байт)

	

	Диапазон значений

	

	Byte (байт)

	

	1

	

	От 0 до 255

	

	Boolean (логический)

	

	2

	

	True или False

	

	Integer (целое число)

	

	2

	

	От -32 768 до 32 767

	

	Long (длинное целое число)

	

	4

	

	От -2 147 483 648 до 2 147 483 647

	

	Single (число с плавающей запятой обычной точности)

	

	4

	

	От -3,402823Е38 до -1,401298Е-45 для отрицательных значений 

	

	Double (число с плавающей запятой двойной точности)

	8

	

	От -1,79769313486232Е308 до 

	-4,94065645841247Е-324 для отрицательных значений;

	от 4,94065645841247Е-324 до 9769313486232Е308 для положительных значений

	Decimal (масштабируемое целое число) 

	14

	

	+/-79228162514264337593543950335 с 28 знаками справа от запятой;

	минимальное ненулевое значение имеет вид +/-0,0000000000000000000000000001

	

	Date (даты и время) 

	8

	

	 От 1 января 100 г. до 31 декабря 9999г.

	Object (объект) 

	4

	Любой указатель объекта

	

	String (строка переменной длины)

	10 + длина

	строки 

	От 0 до приблизительно 2 миллиардов 

	String (строка постоянной длины) 

	длина

	строки 

	 От 1 до приблизительно 65 400 

	Variant (числовые подтипы) 

	16

	 Любое числовое значение вплоть до границ диапазона для типа Double

	

	Variant (строковые подтипы) 

	22+длина строки

	

	От 0 до приблизительно 2 миллиардов 

	Тип данных, определяемый пользователем (с помощью ключевого слова Туре) 

	Объём определяется элементами

	

	Диапазон каждого элемента определяется его типом данных

	

	3.2 Описание переменных

	

	Описание типа каждой переменной делает программу надежнее и, кроме того, убыстряет ее работу, т. к. VBA не требуется тратить время на распознавание типа неописанной переменной при каждом обращении к ней.

	Синтаксис:

	Dim [WithEvents] ИмяПеременной[([Индексы]]] [As [New] Тип] __[, [WithEvents] ИмяПеременной [([Индексы] I ] [As [New] Тип]] . . .

	

	Аргументы:

	WithEvents

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

	ИмяПеременной

	Имя переменной, удовлетворяющее стандартным правилам именования переменных 

	Индексы

	Размерности переменной массива; допускается описание до 60 размерностей. Для задания аргумента Индексы используется следующий синтаксис:

	[Нижний То] Верхний [, [Нижний То] Верхний] ...

	Если нижний индекс не задан явно, нижняя граница массива определяется инструкцией option Base- Если отсутствует инструкция option Base, нижняя граница массива равняется нулю

	New

	Ключёвое слово, включающее возможность неявного создания объекта. Если указано ключевое слово New при описании объектной переменной, новый экземпляр объекта создается при первой ссылке на него, поэтому нет необходимости присваивать ссылку на объект с помощью инструкции Set

	Тип 

	Тип данных переменной. Для каждой описываемой переменной следует использовать отдельное предложение As тип

	

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

	Инструкция Dim предназначена для описания типа данных переменной на уровне модуля или процедуры. Например, следующая инструкция описывает переменную с типом Integer. 

	Dim N As Integer

	Инструкция Dim предназначена также для описания объектного типа переменных. Далее приводится описание переменной для нового экземпляра рабочего листа.

	Dim X Аs New Worksheet

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

	Если тип данных или тип объекта не задан, и в модуле отсутствует инструкция DefТип, по умолчанию переменная получает тип Variant. Для обязательного описания всех переменных надо поместить в начале модуля инструкцию Оption Explicit. Использование этой инструкции полезно при отладке программ, т. к. она позволяет легче отслеживать возможную путаницу в именах при наборе программы.

	

	3.2.1 Допустимые имена

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

	1. Длина имени не должна превышать 255 символов.

	2. Имя не может содержать точек, пробелов и следующих символов: % , & , !, #.©, $.

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

	4. Имена должны быть уникальны внутри области, в которой они определены.

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

	Хотя регистр букв (верхний или нижний) в имени не имеет значения, умелое использование его может существенно облегчить понимание содержательной стороны переменной

	

	3.3 Константы

	

	Константы, в отличие от переменных, не могут изменять свои значения. Использование констант делает программы легче читаемыми и позволяет проще вносить исправления отпадает необходимость многократно исправлять значения по тексту программы, т. к. достаточно ввести новое значение при определении константы. Синтаксис:

	[Public | Private] Const ИмяКонстанты [As Тип] = Выражение

	

	Аргументы:

	Public

	Ключевое слово, используемое на уровне модуля для описания констант, доступных всем процедурам во всех модулях. Не допускается в процедурах.

	Private

	Ключевое слово, используемое на уровне модуля для описания констант, доступных только внутри модуля, в котором выполняется описание. Не допускается в процедурах.

	ИмяКонстанты

	Имя константы, удовлетворяющее стандартным правилам именования переменных

	Тип

	Один из поддерживаемых типов данных: Byte, Boolean,

	Integer, Long, Currency, Single, Double. Decimal (в настоящее время не поддерживается), Date, String или Variant. Для каждой описываемой константы следует использовать отдельное предложение as тип

	Выражение

	Литерал, другая константа или любое сочетание, которое включает все арифметические или логические операторы, за исключением Is

	

	Пример:

	Const ПроцентнаяСтавка As Single = 0.2 

	Const Фирма = "ООО Бескрайние просторы"

	
3.4 Комментарии

	

	Работая с программой, удобно использовать комментарии, т. е. фрагменты текста программы, не являющиеся программными кодами и игнорируемые компилятором. Комментарии выполняют две важные функции:

	1. Делают программу легко читаемой, поясняя смысл программных кодов и алгоритма.

	2. Временно отключают фрагменты программы при ее отладке.

	В языке VBA существуют два способа ввода комментариев:

	Применение апострофа ('). Его можно ставить в любом месте строки. При этом все символы, начиная от апострофа до конца строки, будут восприниматься компилятором как комментарий. 

	Применение зарезервированного слова Rem вместо апострофа. 

	Ниже приведен пример использования комментариев в тексте программы:

	 Dim a As Integer

	' а – целая переменная

	Dim b As String ' b – строковая переменная

	

	
4. Операции VBA

	

	В программах на VBA можно использовать стандартный набор операций над данными. Имеются три основных типа операций:

	Математические, выполняются над числами, и их результатом являются числа.

	Отношения, применяются не только к числам, и их результатом являются логические значения, например х>у.

	Логические, используются в логических выражениях и их результатом являются логические значения, например Not x And у.

	Приведем операции VBA указанных и дополнительных категорий.

	

	4.1 Математические операции

	

	[Операнд1] + [Операнд2]

	

	

	Сложение

	

	[Операнд1] - [Операнд2]

	

	

	Вычитание

	

	- [Операнд]

	

	Перемена знака

	

	[Операнд1] * [Операнд2]

	 [Операнд1] / [Операнд2]

	Умножение

	 Деление

	

	[Операнд1] \ [Операнд2]

	Целочисленное деление

	[Операнд1] Mod [Операнд2]

	Остаток от деления по модулю

	[Операнд1] ^ [Операнд2]

	Возведение в степень

	

	4.2 Операции отношения

	

	[Операнд1]< [Операнд2]

	

	Меньше

	

	[Операнд1]> [Операнд2]

	

	Больше

	

	[Операнд1]<= [Операнд2]

	

	Меньше или равно

	

	[Операнд1]>= [Операнд2]

	

	Больше или равно

	

	[Операнд1] <> [Операнд2]

	

	Не равно

	

	[Операнд1] = [Операнд2]

	

	Равно

	

	[Операнд1] Is [Операнд2]

	Сравнение двух операндов, содержащих ссылки на объекты

	[Операнд1] Like [Операнд2]

	

	Сравнение двух строковых выражений

	

	

	
4.3 Логические операции

	

	[Операнд1] And [Операнд2]

	Логическое умножение

	[[Операнд1] Or [Операнд2]

	

	Логическое сложение

	

	[Операнд1] Хоr [Операнд2]

	

	Исключающее or (или)

	

	Not [Операнд2]

	Логическое отрицание

	

	4.4 Операции со строками

	

	[Строка1] & [Строка2] 

	Сложение строк. Для сложения строк допустимо использование операции [Cтрока1 +[Строка2], но предпочтительнее, во избежание путаницы, применять операцию со знаком &

	

	4.5 Приоритеты операций

	

	VBA выполняет операции в соответствии с их приоритетами, что обеспечивает однозначность в трактовании значений выражений. Приведем приоритеты выполнения операций.

	

	Приоритет

	Операция

	1

	Вызов функции и скобки

	2

	^

	3

	- (смена знака)

	4

	*, /

	5

	\

	6

	Mod

	7

	+, -

	8

	>, <, >=, <=, <>,=

	9

	Not 

	10

	And

	11

	Or 

	

	4.6 Встроенные функции VBA

	

	В VBA имеется большой набор встроенных функций и процедур, использование которых существенно упрощает программирование.

	Эти функции можно разделить на следующие основные категории:

	Математические функции

	Функции проверки типов

	Функции преобразования форматов

	Функции обработки строк

	Функции времени и даты

	Ниже рассмотрены основные функции из этих категорий.

	Математические функции

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

	

	Функция

	Возвращаемое значение

	Abs (число)

	Модуль (абсолютная величина)

	Atn (число)

	Арктангенс 

	Cos (число)

	Косинус

	Exp (число)

	Экспонента, т. е. результат возведения основания натурального логарифма в указанную степень

	Log (число)

	Натуральный логарифм

	Rnd (число)

	Случайное число из интервала [0,1).

	Если число меньше нуля, то Rnd возвращает каждый раз одно и то же число, используя аргумент в качестве опорного числа; если число больше нуля или аргумент опущен, то следующее случайное число в последовательности; если число равняется нулю, то случайное число, возвращенное при предыдущем вызове этой функции.

	Перед вызовом функции Rnd используйте инструкцию Randomize без аргумента

	Sgn (число)

	Знак числа

	Sin (число)

	Синус

	Sqr (число)

	Квадратный корень из числа

	Tan (число)

	Тангенс

	Fix (число) и Int (число)

	Обе функции, Int и Fix, отбрасывают дробную часть числа и возвращают целое значение.

	Различие между функциями Int и Fix состоит в том, что для отрицательного значения аргумента число функция Int возвращает ближайшее отрицательное целое число, меньшее либо равное указанному, a Fix ближайшее отрицательное целое число, большее либо равное указанному 

	

	
4.7 Функции преобразования форматов

	

	Преобразование строки в число и обратно осуществляют следующими функциями.

	

	Val (строка)

	Возвращает числа, содержащиеся в строке, как числовое значение соответствующего типа

	Str (число)

	Возвращает значение типа variant (string), являющееся строковым представлением числа

	

	В качестве допустимого десятичного разделителя функция str воспринимает только точку. При наличии другого десятичного разделителя (например, запятой) для преобразования чисел в строки следует использовать функцию cstr.

	Чтобы представить числовое значение как дату, время, денежное значение или в специальном формате, следует использовать функцию Format. Возвращает значение типа Variant (String), содержащее выражение, отформатированное согласно инструкциям, заданным в описании формата. Синтаксис: Format(Выражение[, Формат[, ПервыйДеньНедели [, ПерваяНеделяГода]]])

	Выражение – любое допустимое выражение

	Формат – любое допустимое именованное или определяемое пользователем выражение формата. Примером именованного формата является Fixed – формат действительного числа с двумя значащими цифрами после десятичной точки

	ПервыйДеньНедели – постоянная, определяющая первый день недели

	ПерваяНеделяГода – постоянная, определяющая первую неделю года

	При построении пользовательского числового формата возможно использование следующих символов.

	

	0

	Резервирует позицию цифрового разряда. Отображает цифру или нуль. Если у числа, представленного аргументом, есть какая-нибудь цифра в той позиции разряда, где в строке формата находится 0, функция отображает эту цифру аргумента, если нет – в этой позиции отображается нуль

	#

	Резервирует позицию цифрового разряда. Отображает цифру или ничего не отображает. Если у числа, представлен-1 ного аргументом, есть какая-нибудь цифра в той позиции разряда, где в строке формата находится #, функция отображает эту цифру аргумента, если нет – в исходной позиции не отображается ничего. Действие данного символа аналогично действию 0, за исключением того, что лидирующие нули не отображаются

	.

	Резервирует позицию десятичного разделителя

	%

	Резервирует процентное отображение числа

	,

	Разделитель разряда сотен от тысяч

	:

	Разделитель часов, минут и секунд в категории форматовВремя(Time) 

	/

	Разделитель дня, месяца и года в категории форматов Дата(Date)

	E+, E-, e+, e-

	Разделитель мантиссы и порядка в экспоненциальном формате

	

	

	В VBA имеются также следующие функции преобразования типов выражений из данного в указанный.

	

	Функция

	

	Тип, в который преобразуется выражение

	

	CBool (Выражение)

	

	Boolean

	

	CByte (Выражение)

	

	Byte

	

	CCur (Выражение)

	

	Currency

	

	CDate (Выражение)

	

	Date

	

	СОЫ (Выражение)

	

	Double

	

	CDec (Выражение)

	

	Decimel

	

	CInt (Выражение)

	

	Integer

	

	CLng (Выражение)

	

	Long

	

	CSng (Выражение)

	

	Single

	

	CVar (Выражение)

	

	Variant

	

	CStr (Выражение)

	

	String 

	

	4.7.1 Функции обработки строк

	В VBA имеются следующие функции обработки строковых выражений.

	

	Функция

	Возвращаемое выражение

	Asc 

	Возвращает ASCII-код начальной буквы строки. Синтаксис:

	Asc(Строка)

	Chr

	Преобразует ASCII-код в строку. Синтаксис:

	Chr(Код)

	Например Chr (13) – переход на новую строку, Chr(97) = "а"

	Lcase

	Преобразует строку к нижнему регистру.

	Синтаксис:

	Lcase(Строка)

	Ucase

	Преобразует строку к верхнему регистру.

	Синтаксис:

	Ucase(Строка)

	Left

	Возвращает подстроку, состоящую из заданного числа первых символов исходной строки.

	Синтаксис:

	Left(string, length)

	Аргументы:

	length – число символов

	string – исходная строка

	Right

	Возвращает строку, состоящую из заданного числа последних символов исходной строки.

	Синтаксис:

	Right(string, length)

	Аргументы:

	length – число символов

	string – исходная строка

	Mid

	Возвращает подстроку строки, содержащую указанное число символов

	Синтаксис:

	Mid(string, start [, length])

	Аргументы:

	string – строковое выражение, из которого извлекается подстрока

	start – позиция символа в строке string, с которого начинается нужная подстрока

	length – число возвращаемых символов подстроки. 

	Len

	Возвращает число символов строки. 

	Синтаксис:

	Len(Строка)

	LTrim

	Возвращает копию строки без пробелов в начале Синтаксис:

	LTrim(Строка)

	Rtrim

	Возвращает копию строки без пробелов в конце.

	Синтаксис:

	RTrimfСтрока)

	Trim

	Возвращает копию строки без пробелов в начале и в конце

	Синтаксис:

	Trim(Строка)

	Space

	Возвращает строку, состоящую из указанного числа пробелов.

	Синтаксис:

	Space(Число)

	String

	Возвращает строку, состоящую из указанного числа повторений одного и того же символа.

	Синтаксис:

	String(number,character)

	Аргументы:

	number – число повторений символа

	character – повторяемый символ

	StrComp

	Возвращает результат сравнения двух строк.

	Синтаксис:

	StrComp(stringl, string2 [, compare])

	Аргументы:

	stringl и string2 – два любых строковых выражения

	compare – указывает способ сравнения строк. Допустимые значения: 0 (двоичное сравнение), 1 (посимвольное сравнение без учета регистра)

	Возвращаемые значения:

	string1 меньше, чем string2, то -1

	string1 равняется string2, то 0

	string1 больше, чем string2, то 1

	InStr

	Возвращает позицию первого вхождения одной строки внутри другой строки.

	Синтаксис:

	InStr([start, ]stringl, string2[, compare])

	Аргументы:

	start – числовое выражение, задающее позицию, с которой начинается каждый поиск. Если этот аргумент опущен, поиск начинается с первого символа строки

	
Возвращаемое выражение

	stringl – строковое выражение, в котором выполняется поиск

	string2 – искомое строковое выражение

	compare – указывает способ сравнения строк. Допустимые значения: 0 (для двоичного сравнения), 1 (посимвольное сравнение без учета регистра).

	

	4.8 Инструкции VBA

	

	Инструкция VBA представляет собой полную команду языка VBA. Она может содержать ключевые слова, операторы, переменные, константы и выражения. В VBA имеются следующих три категории инструкций:

	Инструкции описания 

	Инструкции присваивания 

	Исполняемые инструкции

	
4.8.1 Оператор присваивания

	Оператор присваивания позволяет присвоить значение выражения переменной, константе или свойству объекта. Оператор присвоения всегда включает знак равенства (=). Синтаксис: <Переменная> (или Постоянная или Свойство Объекта) = <Выражение>

	Оператор присваивания предписывает выполнить выражение, заданное в его правой части, и присвоить результат переменной, имя которой указано в левой части. В результате, например, действия следующей пары операторов

	

	х = 2

	х = х + 2

	

	переменной х будет присвоено 4.

	Для присваивания переменной ссылки на объект применяется инструкция Set. В следующем примере инструкция Set присваивает переменной область Диапазон А1:B3:

	Set Область = Range("А1:ВЗ")

	В общем случае инструкция set имеет следующий синтаксис:

	Set ОбъектнаяПеременная = {[New] ОбъектноеВыражение | Nothing}

	ключевое слово New используется при создании нового экземпляра класса; ключевое слово Nothing позволяет освободить все системные ресурсы и ресурсы памяти, выделенные для объекта, на который имелась ссылка (вольно говоря, она удаляет объект из памяти).

	

	4.8.2 Расположение нескольких операторов на одной строке

	

	Использование знака двоеточия позволяет разместить несколько операторов на одной строке. Таким образом, следующие две конструкции эквивалентны:

	

	1. х = х+1 и 2. х = х+1: у = х+2

	 у = х+2 

	

	
5. Ввод и вывод информации

	

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

	InputBox

	Выводит на экран диалоговое окно, содержащее сообщение и поле ввода, устанавливает режим ожидания ввода текста пользователем или нажатия кнопки, а затем возвращает значение типа string, содержащее текст, введенный в поле. Синтаксис:

	InputBox (prompt [, title] [, default] [, xpos] [, ypos] [, helpfile, context])

	Здесь аргументы означают:

	prompt – строковое выражение, отображаемое как сообщение в диалоговом окне;

	title – строковое выражение, отображаемое в строке заголовка диалогового окна. Если этот аргумент опущен, в строку заголовка помещается имя приложения;

	default – строковое выражение, отображаемое в поле ввода как используемое по умолчанию, если пользователь не введет другую строку. Если этот аргумент опущен, поле ввода изображается пустым;

	xpos – числовое выражение, задающее расстояние по горизонтали между левой границей диалогового окна и левым краем экрана. Если этот аргумент опущен, диалоговое окно выравнивается по центру экрана по горизонтали;

	ypos – числовое выражение, задающее расстояние по вертикали между верхней границей диалогового окна и верхним краем экрана. Если этот аргумент опущен, диалоговое окно помещается по вертикали примерно на одну треть высоты экрана;

	helpfile – строковое выражение, определяющее имя файла справки, содержащего справочные сведения о данном диалоговом окне. Если этот аргумент указан, необходимо наличие также аргумента context;

	context – числовое выражение, определяющее номер соответствующего раздела справочной системы. Если этот аргумент указан, необходимо наличие также аргумента helpfile.

	MsgBox

	Выводит на экран диалоговое окно, содержащее сообщение, устанавливает режим ожидания нажатия кнопки пользователем, а затем возвращает значение типа integer, указывающее, какая кнопка была нажата. Синтаксис:

	MsgBox(prompt[, buttons] [, title] [, helpfile, context])

	Аргументы:

	prompt – строковое выражение, отображаемое как сообщение в диалоговом окне;

	buttons – числовое выражение, представляющее сумму значений, которые указывают число и тип отображаемых кнопок, тип используемого значка, основную кнопку и вид окна сообщения. Значение по умолчанию этого аргумента равняется 0. 

	Рассмотрим пример использования окон сообщений. В результате действия приведенной ниже процедуры CommandButton1_Click() появится диалоговое окно Пример окна ввода с полем ввода (рис. 5.1). Следуя приглашению в этом диалоговом окне, введем в поле ввода имя, например, Николай Маркович. Нажмем кнопку ОК. На экране отобразится диалоговое окно пример окна сообщения с текстом приветствия (рис. 5.2). Если пользователь не введет имя в поле ввода диалогового окна Пример окна ввода или нажмет кнопку Отмена, то компьютер выразит свое неудовлетворение действиями пользователя отображением диалогового окна Еще один пример окна сообщения (рис. 5.3).

	

	

	Рисунок 5.1

	

	

	Рисунок 5.2

	

	

	Рисунок 5.3

	

	Private Sub CommandButton1_Click()

	' Описание переменной

	Dim Name As String

	' Ввод имени пользователя

	Name = InputBox("Введите свое имя", "Пример окна ввода")

	' Реакция программы на ввод имени пользователя

	If Name <> "" Then

	Response = MsgBox("Здравствуйте, " + Name, vbInformation, " ")

	Else

	Response = MsgBox("Вы забыли ввести свое имя! ", vbExclamation, "Еще один пример окна сообщения")

	End If

	End Sub

	Значения аргумента buttons процедуры MsgBox, определяющие отображаемые кнопки в диалоговом окне: 

	

	Константа

	Значение

	Отображаются кнопки

	vbOKOnly 

	0

	

	vbOKCancel

	1

	 

	vbAbortRetryIgnore

	2

	 

	vbYesNoCancel

	3

	  

	vbYesNo

	4

	 

	vbRetryCancel

	5

	 

	

	Значения аргумента buttons процедуры MsgBox, определяющие отображаемые информационные значки в диалоговом окне: 

	

	Константа

	Значение

	Отображаются кнопки

	vbCritical 

	16

	

	vbQuestion

	32

	

	vbExclamation

	48

	

	vbInformation

	64

	

	

	Значения аргумента buttons процедуры MsgBox, определяющие основную кнопку в диалоговом окне: 

	

	

	

	Константа

	Значение

	Номер основной кнопки

	vbDefaultButton1

	0

	1

	vbDefaultButton2

	256

	2

	vbDefaultButton3

	512

	3

	vbDefaultButton4

	768

	4

	

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

	

	Константа

	Значение

	Нажатая кнопка

	vbOK

	

	I

	

	OK

	

	vbCancel

	

	2

	

	Отмена (Cancel)

	

	vbAbort

	

	3

	

	Прервать (Abort)

	

	vbRetry

	

	4

	

	Повторить (Retry)

	

	vblgnore

	

	5

	

	Пропустить (Ignore)

	

	vbYes

	

	6

	

	Да (Yes)

	

	vbNo

	7

	Нет (No) 

	

	
6. Реализация разветвляющихся алгоритмов в VBA

	

	Операторы перехода и выбора

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

	Перечислим операторы перехода и выбора VBA.

	Оператор безусловного перехода. Формат:

	GoTo Строка

	Задает безусловный переход на указанную строку внутри процедуры. Обязательный аргумент Строка может быть любой меткой строки или номером строки 

	Оператор условного перехода. Формат:

	If <Условие> Then <Операторы 1> [Else Операторы 2]

	Если Условие принимает значение True (истина), то выполняются операторы после Then, иначе выполняются операторы после Else. Ветвь Else может отсутствовать.

	Допускается также использование формы синтаксиса в виде блока:

	If <Условие> Then

	[Операторы 1]

	 [Elself <Условие-n> Then

	[Операторы n]

	 [Else

	[Операторы]] 

	End If

	Оператор выбора. Формат: 

	Select Case <выражение>

	[Case списокВыражений-1 

	[операторы-1]]

	 [Case списокВыражений-n

	[операторы-n]]

	[Case Else

	[операторы_еlse]]

	End Select

	Операторы-n (необязательная часть) – один или несколько операторов, выполняемых в том случае, если выражение совпадает с любым компонентом списка список-Выражений-n.

	Операторы_else (необязательная часть) – один или несколько операторов, выполняемых в том случае, если выражение не совпадает ни с одним из предложений Case.

	Активизация подпрограммы обработки ошибок.

	Оператор On Error GoTo строка активизирует подпрограмму обработки ошибок, начало которой определяется обязательным аргументом строка, значением которого может быть любая метка строки или номер строки. Для того чтобы предотвратить выполнение программы обработки ошибок в тех случаях, когда ошибка не возникла, необходимо помещать соответствующую инструкцию Exit Sub, Exit Function или Exit Property сразу после подпрограммы обработки ошибки, как в следующем примере:

	Sub InitializeMatrix(Varl, Var2, Var3, Var4) 

	On Error GoTo M1

	Exit Sub 

	M1:

	Resume Next

	End Sub

	В этом примере программа обработки ошибок помещена между операторами Exit Sub и End Sub, что позволяет отделить ее от части программы, соответствующей нормальному ходу выполнения.

	On Error Resume Next указывает, что при возникновении ошибки происходит передача управления на инструкцию, непосредственно следующую за инструкцией, вызвавшей ошибку.

	On Error GoTo 0 отключает любой активизированный обработчик ошибок в текущей процедуре

	

	
7. Операторы цикла

	

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

	В VBA имеются следующие операторы цикла

	For – Next. Формат:

	For <Счетчик> = <Начало> То <Конец> [Step <Шаг>] [Операторы 1]

	[Exit For]

	[Операторы 2] Next [<Счетчик>]

	Цикл со счетчиком повторяет выполнение группы Операторов 1, пока Счетчик изменяется от Начального значения до Конечного с указанным Шагом. Если шаг не указан, то он полагается равным 1. Досрочный способ выхода из цикла предоставляет оператор Exit For.

	For Each – Next. Формат:

	For Each <Элемент> In <Группа>

	[Операторы 1]

	[Exit For]

	[Операторы 2]

	Next [<Элемент>]

	Цикл повторяет выполнение группы Операторов 1 для каждого элемента массива или семейства. 

	Do Until – Loop.	Формат:

	Do [Until <Условие>]

	[Операторы 1]

	[Exit Do]

	[Операторы 2] Loop

	Тело цикла выполняется, пока Условие имеет значение False. Операторы 1 выполняются по крайней мере один раз, а затем проверяется условие. Досрочный способ выхода из цикла – Exit Do.

	Do – Loop While. Формат:

	Do

	[Операторы 1]

	[Exit Do]

	[Операторы] Loop [While <Условие>]

	Повторяет выполнение набора операторов, пока Условие имеет значение True. Сначала выполняются Операторы 1, а потом проверяется условие. 

	Do While – Loop. Формат:

	Do [While <Условие>]

	[Операторы 1]

	[Exit Do]

	[Операторы 2]

	Loop

	Цикл с «предусловием» проверяет Условие перед выполнением Операторов 1. Когда Условие становится ложным, цикл прекращает свое выполнение. 

	Do – Loop Until. Формат:

	Do

	[Операторы 1] 

	[Exit Do] 

	[Операторы 2]

	Loop [Until <Условие>]

	Повторяет выполнение набора инструкций, пока условие не примет значение True. Сначала выполняется инструкция, а потом проверяется условие. 

	While – Wend. Формат:

	While <Условие> 

	[Операторы] 

	Wend

	Выполняет последовательность инструкций, пока заданное условие имеет значение True.

	

	
8. Массивы

	

	Как и в других языках программирования, в VBA можно использовать массивы. Примеры объявления массивов:

	Dim M(3,3) As Single 

	Dim V(12) As Integer

	Первая строка объявляет двумерный массив 33 (матрицу), состоящий из действительных чисел. Вторая строка объявляет одномерный массив (вектор) из 12 целых чисел, причем по умолчанию первый элемент массива будет V(0), а последний V(11). В этом случае говорят, что 0 – базовый индекс. Можно изменить базовый индекс, написав в начале листа модуля инструкцию Option Base 1. После этого индексы массивов M и V будут начинаться с единицы. Другим способом изменения базового индекса является использование ключевого слова Tо при объявлении массива:

	Dim M(l То 3, 1 То 3) As Single 

	Dim V(l To 12) As Integer

	Значения элементов массива задаются поэлементно. Н а п р и м е р,

	Dim M(l To 2,1 То 2) As Integer

	M(l,l)=2: M(1,2)=4: M(2,1)=1: В(1,2)=6

	Удобным способом задания одномерных массивов является функция Array, преобразующая список элементов, разделенных запятыми, в вектор из этих значений, и присваивающая их переменной типа Variant. 

	Например,

	Dim A As Variant 

	А = Array{10,20,30) 

	В = А(2)

	Динамические массивы

	Иногда в процессе выполнения программы требуется изменять размер массива. В этом случае первоначально массив объявляют как динамический. Для этого при объявлении массива не указывают размерность.

	Например:

	Dim R() as Single

	В программе следует вычислить необходимый размер массива и связать его с некоторой переменной, затем изменить размер динамического массива с помощью оператора ReDim, формат которого:

	ReDim [Preserve] ИмяПеременной(Индексы) [As Тип]_

	 [. ИмяПеременной(Индексы)[As Тип]] ...

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

	ИмяПеременной – имя переменной, удовлетворяющее стандартным правилам именования переменных.

	Индексы – размерности переменной массива; допускается описание до 60 размерностей. Аргумент Индексы использует следующий синтаксис:

	[Нижний То] Верхний [, [Нижний То] Верхний] ...

	Если нижний индекс не задан явно, нижняя граница массива определяется инструкцией Option Base. Если отсутствует инструкция Option Base, нижняя граница массива равняется нулю.

	Тип – тип данных массива.

	Например, установим границы массива R:

	ReDim R(1 To 10)

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

	

	
9. Подпрограммы

	

	9.1 Процедуры

	

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

	Синтаксис:

	[Private | Public] [Static] Sub Имя [(СписокАргументов)]

	[инструкции]

	[Exit Sub] 

	[инструкции]

	End Sub 

	

	Элементы описания:

	Public

	Указывает, что процедура Sub доступна для всех других процедур во всех модулях

	Private

	

	Указывает, что процедура Sub доступна для других процедур только того модуля, в котором она описана

	Static

	

	Указывает, что локальные переменные процедуры sub сохраняются в промежутках времени между вызовами этой процедуры

	Имя

	

	Имя процедуры sub, удовлетворяющее стандартным правилам именования переменных

	

	СписокАргументов

	

	Список переменных, представляющий аргументы, которые передаются в процедуру Sub при ее вызове. Имена переменных разделяются запятой

	

	Инструкции

	Любая группа инструкций, выполняемых в процедуре Sub

	

	Инструкция Exit Sub приводит к немедленному выходу из процедуры Sub.

	Синтаксис элемента СписокАргументов:

	[Optional] [ByVal | ByRef] [ParamArray] имяПеременной[( )] _

	[As тип] [= поУмолчанию]

	

	

	

	Optional

	

	Ключевое слово, указывающее, что аргумент не является обязательным. При использовании этого элемента все последующие аргументы, которые содержатся в списке СписокАргументов, также должны быть необязательными и описаны с помощью ключевого слова optional. Все аргументы, описанные как optional, должны иметь тип variant. He допускается использование ключевого слова optional для любого из аргументов, если используется ключевое слово ParamArray

	ByVal

	

	Указывает, что этот аргумент передается по значению.

	ByRef

	

	Указывает, что этот аргумент передается по ссылке. Описание ByRef используется в VBA по умолчанию

	

	ParamArray

	

	

	Используется только в качестве последнего элемента в списке СписокАргументов для указания, что конечным аргументом является описанный как optional массив значений типа Variant. Ключевое слово ParamArray позволяет задавать произвольное количество аргументов. Оно не может быть использовано со словами ByVal, ByRef или Optional

	имяПеременной

	

	Имя переменной, удовлетворяющее стандартным правилам именования переменных

	тип

	

	Тип данных аргумента, переданного в процедуру; поддерживаются типы Byte, Boolean, Integer, Long, Currency, Single, Double, Date, String (ТОЛЬКО строки переменной длины), object, Variant. Если отсутствует ключевое слово optional, могут быть также указаны определяемый пользователем тип или объектный тип

	поУмолчанию

	

	Любая константа или выражение, дающее константу. Используется только вместе с параметром optional. Если указан тип object, единственным значением по умолчанию может быть значение Nothing

	

	

	Приведенный ниже синтаксис описывает имя, аргументы и текст программы, составляющие тело процедуры Function. Синтаксис:

	[Public | Private] [Static] Function Имя [(СписокАргументов)] [As Тип]

	[Инструкции]

	[Имя = Выражение]

	[Exit Function]

	[Инструкции]

	[Имя = Выражение]

	End Function

	Синтаксис инструкции Function содержит те же элементы, что и Sub. Инструкция Exit Function приводит к немедленному выходу из процедуры Function. Подобно процедуре Sub, процедура Function является самостоятельной процедурой, которая может получать аргументы, выполнять последовательность инструкций и изменять значения своих аргументов. Однако в отличие от процедуры Sub, когда требуется использовать возвращаемое функцией значение, процедура Function может применяться в правой части выражения, как и любая другая встроенная функция, например, cos.

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

	

	9.2 Переход в подпрограмму и возвращение из подпрограммы

	

	В VBA от первоначальных версий BASIC сохранилась конструкция подпрограммы GoSub - Return, которая в настоящее время редко используется. Для полноты изложения вкратце напомним синтаксис этой инструкции. Синтаксис:

	GoSub строка

	строка

	Return

	Аргумент строка может быть любой меткой строки или номером строки. В качестве метки строки может быть любая комбинация символов, начинающаяся с буквы и заканчивающаяся двоеточием.

	Допускается использование инструкций GoSub и Return в любом месте процедуры, но GoSub и соответствующая инструкция Return должны находиться в одной процедуре. Подпрограмма может содержать несколько инструкций Return. Первая обнаруженная инструкция Return приводит к передаче управления назад к инструкции, непосредственно следующей за последней выполненной инструкцией GoSub.

	

	
9.3 Вызов процедуры

	

	Вызов процедуры Sub из другой процедуры можно произвести несколькими способами.

	Первый способ вызова процедуры Sub:

	ИмяПроцедуры СписокФактическихПараметров

	

	ИмяПроцедуры

	Имя вызываемой процедуры

	СписокФактическихПараметров

	Список аргументов, передаваемых процедуре. Он должен соответствовать списку, заданному в процедуре по количеству и типу.

	

	Если требуется использовать несколько процедур с одинаковыми названиями; при их вызове после имени процедуры через точку надо указывать имя модуля, на котором они расположены. А именно,

	ИмяМодуля . ИмяПроцедуры СписокФактическихПараметров

	Второй способ вызова процедуры sub производится с помощью инструкции Call.

	ИмяПроцедуры (СписокФактическихПараметров )

	Обратите внимание, что в этом случае список фактических параметров заключается в скобки. В первом способе скобки не использовались.

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

	Приведенный ниже пример показывает основные способы передачи параметров в процедуры.

	Dim с As Double

	' с - глобальный параметр 

	Function F(ByVal x As Integer) As Integer

	F = x^2

	End Function

	‘Sub Assistant (ByVal a As Integer, ByVal b As Integer)

	‘Процедура, находящая сумму двух чисел и выводящая результат в диалоговом окне

	с = а + b

	MsgBoxCStr(c)

	End Sub

	Sub Main()

	‘Процедура, находящая сумму двух чисел и выводящая результат в диалоговом окне

	Dim x, у As Double

	‘ x, у - переменные, используемые в качестве фактических параметров 

	' Вызов процедуры с конкретными числами как фактическими параметрами

	Assistant 1, 3

	' Первоначальное присвоение переменным значений, с последующим вызовом процедуры

	х = 1: у = 1

	Assistant x, у + 2 

	' Использование функции как фактического параметра

	х = 1: у = 3

	Assistant F(x), у

	‘Вызов процедуры с указанием фактических параметров по имени

	Assistant a:=l, b:=3

	End Sub

	Приведем пример процедуры с необязательными параметрами. Процедура CторонаТреугольника позволяет найти длину недостающей стороны прямоугольного треугольника, где переменные A и B отведены под длины катетов, а переменная С – под гипотенузу. Например, формула =СторонаТреугольника(;В2;С2) вычисляет катет А по введенным в ячейки В2 и С2 длинам катета В и гипотенузы С. При работе с необязательными переменными необходимо использовать функцию IsMissing, возвращающую значение True, если соответствующий аргумент не был передан в процедуру, и False в противном случае.

	Function СторонаТреугольника (Optional A, Optional В, Optional С)

	If Not (IsMissing(A)) And Not (IsMissing(В)) Then

	СторонаТреугольника = Sqr(А^2 + В^2)

	End If

	If Not (IsMissing(A)) And Not (IsMissing(C)) Then

	СторонаTреугольника = Sqr(С^2 – A^2)

	End If

	If Not (IsMissing(B)) And Not (IsMissing(C)} Then

	Сторонатреугольника = Sqr (C^2 – B^2)

	End If 

	EndFunction

	Назначение значений по умолчанию необязательным параметрам

	Для необязательного параметра можно определить значение по умолчанию. В следующем примере, если значение параметра ь не передано в функцию, то ему присваивается указанное по умолчанию значение 8.

	Function Сумма (a As Double, Optional b As Double = 8)

	Сумма = a + b

	 End Function

	Использование неопределенного количества параметров как правило, количество передаваемых параметров в процедуру совпадает с количеством определенных у этой процедуры параметров. Однако ключевое слово ParamArray предоставляет возможность ввода в процедуру произвольного, заранее не указанного числа параметров (например, как это происходит при использовании функции рабочего листа СУММ (sum)). В качестве примера приведем процедуру, которая выполняет то же действие, что и функция рабочего листа СУММ. Отличием функции СуммаПользователя от Cумм является то, что в ней в каждое поле ввода диалогового окна мастера функций можно вводить только либо число, либо ссылку на ячейку, а не на Диапазон, как при работе с функцией СУММ.

	Function СуммаПользователя (ParamArray Массив ())

	s = 0

	For Each a In Массив

	 s = s + a 

	Next а

	CуммаПользователя = s 

	End Function

	

	9.4 Область определения переменной

	

	Область определения переменной задает область, в которой может быть использована переменная. В VBA имеется три соответствующих уровня переменных:

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

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

	Общие переменные, используемые во всех модулях данного проекта. Описываются при помощи инструкции Public, размещенной в области описания модуля.

	

	9.5 Время жизни переменной

	

	Личная (Private) переменная сохраняет свое значение только пока выполняется процедура, в которой эта переменная описана. При завершении процедуры значение переменной теряется, и при повторном запуске процедуры его надо заново инициализировать. Переменные, описанные при помощи инструкции Static, сохраняют свое значение по выходу из процедуры, но пока работает программа.

	

	9.6 Рекурсивные процедуры

	

	В VВА возможно создание рекурсивных процедур, т. е. процедур, вызывающих самих себя. Стандартным примером рекурсивной процедуры является процедура вычисления факториала, т. е. функции, возвращающей результат произведения первых n натуральных чисел, где n — аргумент функции. Для этой функции имеется стандартное обозначение: Fact(n)=n!, где Fact (0) = 1. Ясно, что 

	Fact (n) = n Fact (n - 1)

	Основываясь на данном соотношении, приводимая ниже рекурсивная функция вычисляет значение факториала.

	Function Fact(n As Integer) As Integer 

	If n<l Then

	Fact = 1 

	Else

	Fact = Fact (n - 1) n

	End If	

	End Function

	Другим стандартным примером применения рекурсивных функций является нахождение наибольшего общего делителя двух целых чисел по алгоритму Евклида. Наибольший общий делитель (НОД) двух целых чисел это наибольшее целое, на которое делятся оба числа. Например, НОД (10, 14) = 2 и НОД (15, 31) = 1.

	Алгоритм Евклида состоит в следующем:

	1. Если а делится на b, то НОД(а, b) = b

	2. В противном случае — НОД(а, b) = НОД(b, a Mod b)

	Приводимая ниже рекурсивная функция программирует алгоритм Евклида.

	Function НОД(Целое1 As Long, Целое2 As Long) As Long 

	If Целое2 Mod Целое1 = О Then

	НОД = Целое1 

	Else

	НОД = НОД(Целое2, Целое! Mod Целое2)

	End If

	End Function

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

	

	
10. Работа с файлами

	

	10.1 Типы файлов в VBA

	

	В VBA допустима работа с тремя типами текстовых файлов.

	

	Файл последовательного доступа

	Рассматривается как последовательность строк произвольной длины, разделенных специальными символами. Чтение и запись в файл производится построчно

	Файл произвольного доступа

	Состоит из записей фиксированной длины и размер записи указывается при его открытии. Это позволяет локализовать любую запись в файле по ее номеру

	Бинарный файл

	Является частным случаем файла произвольного доступа. Размер записи в бинарном файле считается равным 1 байту

	

	10.2 Открытие и закрытие файла

	

	Обсудим инструкции, связанные с открытием файла для операций ввода/вывода, а также с закрытием файла по завершению работы с ним.

	Open – разрешает выполнение операций ввода/вывода при работе с файлом. Синтаксис: 

	Open Путь For Режим [Access Доступ] [Блокировка] _

	As [#]НомерФайла [Lеп=Длина] 

	Путь – строковое выражение, указывающее имя файла 

	Режим – устанавливает режим работы с файлом. Допустимые значения: Append, Binary, Input, Output или Random.

	Доступ – устанавливает операции, разрешенные с открытым файлом. Допустимые значения: Read, write или Read Write/

	Блокировка – устанавливает операции, разрешенные с открытым файлом другим процессам. Допустимые значения:

	Shared, Lock Read, Lock Write и Lock Read Write.

	НомерФайла — допустимый номер файла. Число в интервале от 1 до 255. Обратите внимание на то, что параметру НомерФайла предшествует символ #. Значение НомерФайла нельзя изменять, пока файл открыт. Но при следующем открытии файла НомерФайла может быть другим числом.

	Длина – число, меньшее либо равное 32 767 (байт). Для файлов, открытых в режиме Random, это значение является длиной записи. Для файлов с последовательным доступом это значение является числом буферизуемых символов.

	Close. Про инструкцию open важно также знать, что во время ее работы VBA также резервирует файловый буфер в памяти компьютера для ускорения процесса записи и считывания (прямое записывание информации на диск может существенно замедлить выполнение программы, что особенно заметно при работе с большими файлами). Максимальное число файловых буферов устанавливается в системном файле Config.sys.

	Завершает операции ввода/вывода с файлом, открытым с помощью инструкции open. Эта инструкция очищает буфер и указывает операционной системе обновить FAT (таблицу размещения файлов). Важно, чтобы каждый файл по завершении работы с ним был закрыт, иначе это может привести к частичной потере информации. Синтаксис:

	Close [СписокНомеровФайлов]

	Аргумент СписокНомеровФайлов может представлять один или несколько номеров файлов. При этом используется следующий синтаксис, где НомерФайла представляет любой допустимый номер файла:

	[[#]НомерФайла] [, [#]НомерФайла] ...

	FreeFile – функция возвращает доступный номер, который может использоваться в инструкции Open.

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

	Open "Первый" For Binary Access Write As #1 

	Close #1

	

	10.3 Ввод данных в файл последовательного доступа

	

	Обсудим инструкции, используемые при вводе информации в файл последовательного доступа.

	Print – записывает форматированные данные в файл последовательного доступа. Синтаксис:

	Print #НомерФайла, [СписокВывода]

	НомерФайла – Номер файла

	СписокВывода – выражение (или список выражений), записываемое в файл. В аргументе СписокВывода разделителем списка выводимых выражений является "," (данные выводятся подряд) или "," (данные выводятся по зонам). Кроме того, в аргументе СписокВывода допускается использование функций Spc и Tab:

	• Spc (n) – используется для вставки n пробелов в файл

	• Tab (n) – устанавливает курсор в столбец с номером n

	Write – Записывает неформатированные данные в файл последовательного доступа. В отличие от инструкции Print, инструкция Write вставляет запятые между элементами и заключает строки в кавычки по мере записи их в файл. Синтаксис:

	Write #НомерФайла, [СписокВывода] 

	НомерФайла – номер файла; 

	СписокВывода – выражение или список выражений записываемых в файл 

	Данные, записанные с помощью инструкции Write, обычно считываются из файла с помощью инструкции Input.

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

	Sub ПримерИспользованияРгint

	Open "С:\Новый" For Output As #1

	' Печатает текст в файл Print #1, "Тест"

	' Печатает пустую строку в файл I

	Print #1,

	' Печатает в двух зонах печати

	Print #1, "Зона 1"; Tab; "Зона 2" ;	Spc(3); "3 пробела"

	 Close #1

	 End Sub

	Результатом описанных выше инструкций будет файл со следующим содержимым:

	Тест 

	Зона 1 Зона 2 3 пробела

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

	Sub ПримерИспользованияWrite

	 Open "ЕщеПример" For Output As #1

	Write #1, "Пример"; "использования"

	Write #1, "инструкции";

	Write #1, "Write"

	x = 1

	Write #1, "Число"; x Close #1

	 End Sub

	Результатом описанных выше инструкций будет файл со следующим содержимым:

	"Пример","использования" "инструкции","Write" 

	"Число",1

	Обратите внимание на автоматическое размещение в файле разделителей-запятых, и на то, что строковая информация берется в кавычки. В процедуре ПpимepИспользованияWrite вторая инструкция Write специально заканчивается знаком ";". Это обеспечивает вывод данных третьей инструкцией Write в ту же строку файла, в которую выводила вторая инструкция.

	

	10.4 Вывод данных из файла последовательного доступа

	

	В VBA имеются следующие инструкции и функции вывода информации из файла последовательного доступа, а также функцию идентификации конца файла.

	Input # Считывает данные из открытого файла последовательного доступа и присваивает их переменным. Данные, считываемые с помощью инструкции Input #, обычно записываются в файл с помощью инструкции Write #. Синтаксис:

	Input #НомерФайла, СписокПеременных

	НомерФайла – номер файла 

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

	Line Input # Считывает строку из открытого файла последовательного доступа и присваивает ее переменной типа String. Данные, считываемые с помощью инструкции Line Input #, как правило, записываются в файл с помощью инструкции Print #. Синтаксис:

	Line Input #НомерФайла, ИмяПеременной 

	Синтаксис инструкции Line Input # содержит следующие элементы: 

	НомерФайла – номер файла; 

	ИмяПеременной – имя переменной типа Variant или String. 

	Функция EOF – Функция возвращает значение True при достижении конца файла. Синтаксис:

	EOF(НомерФайла)

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

	Do While Not EOF(l) Loop

	или, для тех пользователей, кто предпочитает инструкцию

	While - Wend инструкции Do While - Loop, следующий эквивалентный цикл:

	While Not EOF(l) Wend

	Функция Input – возвращает значение типа String, содержащее символы из файла, открытого в режиме Input или Binary. Функция Input считывает данные, записываемые в файл с помощью инструкции Print # или Put. Синтаксис:

	Input(Число, [#]НомерФайла) 

	Число задает число возвращаемых символов. Если аргумент число равен 1, то производится посимвольное считывание данных.

	Приведем пример использования инструкции Input # для считывания данных из файла. В этом примере предполагается, что на диске существует файл ГруппаЭкономистов, содержащий информацию о студентах. Файл был создан при помощи инструкции Write # и состоит из двух столбцов, в первом из которых указывается фамилия, а во втором – оценка студента. Для удобства работы с информацией введен пользовательский тип Студенты. Процедура ПримерИспользованияInput последовательно считывает фамилии и оценки из файла и выводит их в ячейки первого и второго столбца рабочего листа.

	Type Студенты

	Фамилия As String * 20

	Оценка As String * 3 

	End Type

	Sub ПримерИспользованияInput

	 Dim Студент As Студенты 

	Open "ГруппаЭкономистов" For Input As #2

	 i = 1

	Do While Not EOF(2) With Студент

	Input #2, .Фамилия, .Оценка 

	Cells (i, 1).Value = .Фамилия 

	Cells(i, 2).Value = .Оценка 

	End With 

	i = i + 1

	 Loop

	Close #2 

	End Sub

	Приведем пример использования инструкции Line Input # для считывания данных из файла ГруппаЭкономистов, имеющего ту же структуру, что и в предыдущем примере, но созданного с помощью инструкции Print #. Инструкция Line input # считывает всю строку из файла в строковую переменную. Поэтому в этом случае уже нет необходимости использовать введенный пользовательский тип, а достаточно ограничиться только обычной строковой переменной. Вся считываемая информация строка за строкой вводится список диалогового окна.

	Private Sub UserForm_Initialize() 

	Dim Студент As String

	Open "ГруппаЭкономистов" For Input As #1

	i = 1

	With ListBoxl 

	 .Clear 

	Do While Not EOF(1)

	Line Input #1, Студент 

	.AddItem Студент 

	i = i + 1 

	Loop

	Close #1 

	End With 

	End Sub

	
10.5 Работа с файлом произвольного доступа

	

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

	Put – записывает содержимое переменной в файл произвольного доступа. Синтаксис:

	Put [#]НомерФайла, [НомерЗаписи], ИмяПеременной

	НомерФайла – номер файла; 

	НомерЗаписи – номер записи (режим Random) или номер байта (режим Binary), с которого следует начать запись или аргумент НомерЗаписи опущен, то записывается на то место, где был установлен указатель после выполнения последней инструкции Get или Put, либо куда он переведен с помощью функции Seek; 

	ИмяПеременной – имя переменной, содержащей данные, которые следует записать в файл.

	Get – читает данные из открытого файла произвольного доступа в переменную. Синтаксис:

	Get [#]Номерфайла, [НомерЗаписи], ИмяПеременной

	Номерфайла – номер файла; 

	НомерЗаписи – номер записи (для файлов в режиме Random) или номер байта (для файлов в режиме Binary), с которого следует начать чтение; 

	ИмяПеременной – имя переменной, в которую следует поместить считанные данные.

	Seek – функция возвращает значение типа Long, определяющее текущее положение указателя чтения/записи внутри файла, открытого с помощью инструкции Open. Синтаксис:

	Seek(Номерфайла)

	LOF – Функция возвращает значение типа Long, представляющее размер файла в байтах, открытого с помощью инструкции Open. Для определения размера закрытого файла следует использовать функцию FileLen. Синтаксис:

	LOF(Номерфайла)

	FileLen – возвращает значение типа Long, содержащее размер файла в байтах. Синтаксис:

	FileLen(Путь) 

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

	В противоположность файлам последовательного доступа, в файлах произвольного доступа запись является встроенным элементом. Файл произвольного доступа – это файл, упорядоченный по записям, что позволяет быстро переместиться на любую запись, минуя предыдущие.

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

	На практике бывает удобно создавать отдельный файл, в котором хранится информация о структуре файла произвольного доступа: структура записи, ее Длина и заголовки полей.

	Отметим, что при открытии файла произвольного доступа, в отличие от файла последовательного доступа, не надо специально указывать, открывается он для ввода или вывода информации. Ввод и вывод информации определяют команды Put и Get.

	Приведем один пример работы с файлом произвольного доступа Группа экономистов, который имеет ту же структуру, что и в предыдущем примере. Файл создается с помощью процедуры ЗаписьВФайл, которая последовательно считывает данные из первого и второго столбца рабочего листа и затем вводит их в файл. В этой процедуре число вводимых записей фиксировано и равно 5. Процедура СчитываниеИзФайла производит обратное действие – считывает данные из файла и вводит их в ячейки третьего и четвертого столбца рабочего листа. Интересной особенностью файла произвольного доступа является то, что при работе с ним можно определить число записей не пересчитывая их. Число записей равно отношению размера файла к длине одной записи. Длина записи устанавливается при создании файла произвольного доступа и определяется типом переменной, при помощи которой файл был создан, размер открытого файла возвращается функцией Lof, а еще не открытого – функцией FileLen. В рассматриваемом случае число записей в файле равно Lof (l) / Len (Студент).

	Type Студенты

	Фамилия As;String * 20 Оценка As String * 3

	End Type 

	Sub ЗаписьВФайл()

	 Dim Студент As Студенты 

	Dim i As Integer

	Open "ГруппаЭкономистов" For Random As #1 Len = Len(Студент) 

	 For i = 1 To 5

	With Студент

	.Фамилия = Cells (i, 1).Value .

	Оценка = Cells(i, 2).Value 

	End With 

	Put #1, i. Студент

	 Next i 

	Close #1

	 End Sub

	Sub СчитываниеИзФайла() Dim Студент As Студенты Dim i As Integer 

	Dim n As Integer

	Open "ГруппаЭкономистов" For Random As #1 Len = Len(Студент)

	 n = LOF(l) / Len(Студент) 

	For i = 1 To n

	Get #1, i. Студент

	 With Студент

	Cells(i, 3).Value = .Фамилия 

	Cells(i, 4).Value = .Оценка 

	End With 

	Next i Close #1 

	End Sub

	

	10.6 Наиболее употребляемые инструкции и функции при работе с файлами

	

	Приведем наиболее часто употребляемые инструкции и функции для работы с файлами.

	ChDir – Изменяет текущую папку. Синтаксис:

	ChDir путь

	ChDrive – Изменяет текущий диск. Синтаксис:

	ChDrive диск 

	Например,ChDrive "D"

	CurDir – функция возвращает текущую папку.

	FileCopy – копирует файл. Синтаксис:

	FileCopy source, destination

	Аргументы: source – строковое выражение, указывающее имя копируемого файла; destination – строковое выражение, указывающее имя результирующего файла. Аргумент destination может содержать имя каталога или папки и диска.

	FileDateTime – функция возвращает дату и время последнего изменения файла. Синтаксис:

	FileDateTime(путь)

	Kill – Удаляет существующий файл. Синтаксис:

	Kill путь

	В аргументе путь допустимо использование символов (*) и (?) для удаления нескольких файлов по маске.

	MkDir – Создает новую папку. Синтаксис:

	MkDir путь

	RmDir – Удаляет существующую папку. Синтаксис:

	RmDir путь

	
11. Примеры решения задач и порядок разработки программ

	

	11.1 Линейный алгоритм

	

	Задание

	Даны константы A и B и произвольное x, вводимое с клавиатуры. Вычислить значение выражения  и вывести значение y на экран.

	1 Нажимаем сочетание клавиш Alt-F11 из любого приложения MS Office.

	2 В меню выбрать пункт: Insert -> UserForm.

	2.2 Меняем название формы Caption (в окне Properties UserForm1) на «Иванов И.И. Гр. Д-1-2005 Задача 1», что отобразится в заголовке окна.

	3 Отображаем на экране панель компонентов Toolbox

	

	

	

	4 Помещаем (с помощью мыши) на форму надпись Label с панели Toolbox.

	4.1 Меняем название надписи на «Линейный алгоритм».

	5 Помещаем (с помощью мыши) на форму кнопку CommandButton1 с панели Toolbox.

	5.1 Меняем название кнопки Caption на «Расчет»; увеличиваем размер кнопки.

	5.2 Двойным щелчком по кнопке Расчет попадаем в окно редактирования кода программы (в данном случае – подпрограммы-обработчика события нажатия кнопки).

	5.3 Между текстом

	Private Sub CommandButton1_Click()

	End Sub

	Дописываем текст

	Dim y As Double

	Dim x As Double

	Const A = 2.5

	Const B = 3

	x = InputBox("Введите x", "Окно ввода данных")

	y = SQR(A * x ^ 2 - B)

	Res = MsgBox("y= " & y, , "Результат")

	6 Сохраняем программу.

	7 Запускаем программу с помощью меню Run (либо клавишей F5, либо соответствующей кнопкой).

	8 Если есть ошибки, исправляем (т. е. отлаживаем программу).

	9 В отобразившемся окне

	

	

	

	нажимаем кнопку Расчет.

	10 В InputBox

	

	


	

	вводим значение x, например 2.3, и нажимаем кнопку «ОК».

	11 В окне MsgBox отображается результат вычисления y.

	

	

	

	12 Завершить выполнение программы можно, нажав соответствующую кнопку или в меню Run выбрать пункт Reset.

	

	11.2 Разветвляющийся алгоритм

	

	Задание

	Ввести с клавиатуры число, проверить: если оно принадлежит интервалу (-10; 0), вывести его модуль, в противном случае вывести соответствующее сообщение.

	1 Присваиваем новой форме название «Иванов И.И. Гр. Д-1-2005 Задача 2».

	2 Помещаем кнопку «Ввод числа» (CommandButton1).

	3 Помещаем надпись «Разветвляющийся алгоритм» (Label1).

	4 Записываем подпрограмму ввода чисел и проверки на принадлежность заданному интервалу:

	Private Sub CommandButton1_Click()

	Dim x As Double

	x = InputBox("Введите x", "Окно ввода данных")

	If x > -10 And x < 0 Then

	Res = MsgBox("x принадлежит интервалу -10,0", , "Результат")

	Res = MsgBox("модуль x =" & Abs(x), , "Результат")

	Else

	Res = MsgBox("x не принадлежит интервалу -10,0", , "Результат")

	End If

	End Sub

	5 Запускаем программу

	

	

	

	6 Вводим число, удовлетворяющее условию.

	

	

	

	7 Получаем результаты:

	

	

	

	

	
8 Вводим число, не принадлежащее интервалу:

	

	

	

	

	

	11.3 Циклический алгоритм

	

	Задание

	Ввести с клавиатуры произвольное число значений и вычислить их квадратные корни. Ввод и вычисления прекратить, как только введено отрицательное число.

	1 Присваиваем новой форме название «Иванов И.И. Гр. Д-1-2005 Задача 3».

	2 Помещаем кнопку «Ввод числа» (CommandButton1).

	3 Помещаем надпись «Цикл с предусловием» (Label1).

	4 Записываем подпрограмму ввода чисел и вычисления их квадратных корней.

	Private Sub CommandButton1_Click()

	x = InputBox("Введите x", "Окно ввода данных")

	Do While x >= 0

	y =Sqr(x)

	Res = MsgBox("y= " & y,, "Результат")

	x = InputBox("Введите x","Окно ввода данных")

	Loop

	MsgBox ("Введено отрицательное число")

	End Sub

	5 Запускаем программу:

	

	

	

	6 Вводим число

	

	

	

	7 Получаем результат

	

	

	

	8 Продолжаем вводить числа: 

	

	

	

	


	

	И т. д., до тех пор, пока не будет введено отрицательное число:

	

	

	

	

	

	11.4 Одномерный массив

	

	Задание

	Вычислить сумму элементов одномерного целочисленного массива, заданного случайным образом.

	1 Даем новой форме название «Иванов И.И. Гр. Д-1-2005 Задача 4».

	2 Помещаем надпись «Одномерный массив» (Label1).

	3 Помещаем кнопки «Элементы массива» (CommandButton1) «Сумма элементов» (CommandButton2).

	4 Помещаем Label2.

	5 Записываем программу вычисления суммы элементов массива:

	Const n = 12

	Dim V(1 To n) As Integer

	Dim S As Integer

	Private Sub CommandButton1_Click()

	Label2.Caption = "Исходный массив "

	Randomize

	For i = 1 To n

	 V(i) = Rnd * 10

	 Label2.Caption = Label2.Caption + Str(V(i))

	 Next

	End Sub

	Private Sub CommandButton2_Click()

	S = 0

	For i = 1 To n

	 S = S + V(i)

	Next

	Rez = MsgBox("Сумма элементов массива=" & S,,"Окно результата")

	End Sub

	6 Запускаем программу. Нажимаем кнопку Элементы массива. В окне формы выводятся значения элементов массива V:

	

	

	

	7 Нажимаем кнопку Сумма элементов.

	8 В окне MsgBox выводится результат.

	
11.5 Вложенные циклы. Двумерные массивы

	

	Задание

	Задана квадратная матрица 10×10. Подсчитать среднее арифметическое элементов, расположенных на главной диагонали.

	1 На новую форму Иванов И.И. Гр. Д-1-2005 Задача 5 помещаем элементы:

	1.1 Label1 «Вложенные циклы. Двумерные массивы.

	1.2 CommandButton1 «Задать матрицу».

	1.3 Label2 «».

	1.4 ListBox1 – для размещения элементов матрицы.

	1.5 CommandButton2 «Среднее арифметическое».

	

	

	

	2 Записываем код программы:

	Const N = 10

	Dim M(1 To N, 1 To N) As Integer

	Private Sub CommandButton1_Click()

	Label2.Caption = "Исходный массив "

	Randomize

	For i = 1 To N

	L = ""

	For j = 1 To N

	M(i, j) = Rnd * 9

	L = L + Str(M(i, j))

	Next

	' Добавить строку матрицы в элемент ListBox1

	ListBox1.AddItem (L)

	Next

	End Sub

	Private Sub CommandButton2_Click()

	S = 0

	For i = 1 To N

	S = S + M(i, i)

	Next

	Sr = S / N

	Res = MsgBox("Среднее значение диагональных элементов =" & Sr, , "Результат")

	End Sub

	3 Запускаем программу на выполнение:

	

	

	

	
11.6 Файлы произвольного доступа

	

	Задание

	Задать файл произвольного доступа, каждая запись которого содержит порядковый номер студента и его фамилию. Организовать возможность добавления информации в файл, а также вывода его содержимого на экран.

	1 Создаем форму:

	

	

	

	2 Записываем код программы:

	Private Type CodeRec

	 Name As String * 25

	 Code As Integer

	End Type

	Const Fil As String = "MyFil"

	Dim Trec As CodeRec

	Dim FilNum As Integer

	'Создание файла

	Private Sub CommandButton1_Click()

	FilNum = FreeFile()

	Open Fil For Random Access Write As FilNum Len = Len(Trec)

	For i = 1 To 3

	 Trec.Name = InputBox("Введите фамилию")

	 Trec.Code = i

	Put FilNum, , Trec

	Next

	Close FilNum

	End Sub

	'Добавление в файл

	Private Sub CommandButton2_Click()

	FilNum = FreeFile()

	Dim nbyte As Long

	Open Fil For Random Access Read Write As FilNum Len = Len(Trec)

	nbyte = LOF(FilNum)

	n = CInt(nbyte / Len(Trec))

	 Trec.Name = InputBox("Введите фамилию")

	 Trec.Code = n + 1

	Put FilNum, n + 1, Trec

	Close FilNum

	End Sub

	'Чтение файла и вывод на экран

	Private Sub CommandButton3_Click()

	FilNum = FreeFile()

	Open Fil For Random Access Read As FilNum Len = Len(Trec)

	Do While Not EOF(FilNum)

	Get FilNum, , Trec

	S = Str(Trec.Code) & " " & Trec.Name

	ListBox1.AddItem (S)

	Loop

	End Sub

	'Создание папки для записи в нее файла

	Private Sub CommandButton4_Click()

	ChDrive "C"

	On Error Resume Next

	MkDir "Lab"

	ChDir "Lab"

	End Sub

	3 Запускаем программу на выполнение

	3.1 Создаем папку (щелчком на соответствующей кнопке).

	3.2 Создаем файл. Вводим фамилии (в цикле), программа осуществляет вывод в файл с заданным именем каждой записи.

	

	

	

	4 Дополняем файл одной записью

	5 Выводим содержимое файла (с помощью компонента ListBox):

	

	

	 

	
12. Практические задания

	

	12.1 Линейный алгоритм: вычисление арифметического выражения

	

	Задание. Вычислить значение функции при А, В и С – константах (задать значения самостоятельно) и произвольном x (ввести с клавиатуры).

	

	1.		2. 

	3. 		4. 

	5. 			6. 

	7. 		8. 

	9. 			10. 

	11. 		12. 

	13. 		14. 

	15.		16. 

	17. 		18. 

	19. 		20. 

	21. 		22. 

	23. 				24. 

	25. 		26. 

	27. 		28. 

	29. 		30. .

	

	12.2 Линейный алгоритм: вычисление по математическим и физическим формулам

	

	Даны действительные числа А, В, С. По трем сторонам с длинами А, В, С можно построить треугольник. Найти пеpиметp треугольника.

	Найти площадь сектора, радиус которого равен R, а дуга содержит заданное число радиан F.

	Первый член возрастающей геометрической прогрессии a1 = 3, ее знаменатель q = 2. Найти сумму членов этой прогрессии с 20-го по 25-й. 

	Дана длина ребра куба. Найти объем куба и площадь его поверхности.

	Даны два действительных положительных числа. Найти среднее арифметическое и среднее геометрическое этих чисел.

	Дан радиус шара. Найти его объем.

	Определить периметр правильного шестиугольника, описанного окружностью радиуса R.

	Три сопротивления R1, R2, R3 соединены параллельно. Найти сопротивление соединения.

	Определить время падения камня с высоты H.

	Дана сторона равностороннего треугольника. Найти площадь этого треугольника.

	Рассчитать, какую массу соли и воды надо взять для приготовления раствора массой m грамм с массовой долей соли w%.

	Определить высоту треугольника, если его площадь равна S, а основание больше высоты на величину А.

	Три сопротивления R1, R2, R3 соединены последовательно. Найти сопротивление соединения.

	Определить силу притяжения F между телами массы М1 и М2, находящимися на расстоянии Р друг от друга.

	Даны гипотенуза и катет прямоугольного треугольника. Найти второй катет и радиус описанной окружности.

	Даны два действительных числа. Найти среднее арифметическое и среднее геометрическое их модулей.

	Известна длина окружности. Найти площадь круга, ограниченного этой окружностью.

	Найти площадь кольца, внутренний радиус которого равен 20, а внешний – заданному числу R (R > 20).

	Треугольник является pавностоpонним. Известен радиус описанной окружности. Найти стороны треугольника.

	Определить периметр правильного четырехугольника, описанного окружностью радиуса R.

	Даны действительные числа А и В. Получить z = arctg(ab)+cos(b).

	Вычислить координаты центра тяжести трех материальных точек с массами М1, М2, М3 и координатами (х1, y1), (x2, y2), (x3, y3).

	Квадpат задан длиной стороны. Найти радиусы вписанной и описанной окружностей.

	Вычислить расстояние между двумя точками с координатами x1, y1 и x2, y2.

	Даны действительные числа А, В, С. По трем сторонам с длинами А, В, С можно построить треугольник. Найти площадь треугольника.

	Найти длину сектора, радиус которого равен R, а дуга содержит заданное число радиан F.

	Составьте программу, вычисляющую, сколько процентов от (А+В+С) приходится на А, В, С соответственно.

	Даны действительные числа А и В. Получить z = arcsin (|ab|)+10 sin(b).

	Даны катеты прямоугольного треугольника. Найти его гипотенузу и площадь.

	Даны два целых числа А и В. Получить их частное, остаток от целочисленного деления А на В, а также значение степени числа АВ.

	

	12.3 Разветвляющийся алгоритм: выбор по условию

	

	Даны действительные числа А, В, С, D. Выяснить, можно ли уместить прямоугольник со сторонами А, В внутри прямоугольника со сторонами C, D.

	Даны действительные числа x, y, z. Hайти минимальное из них.

	Даны действительные положительные числа А, В, С. Выяснить, пройдет ли кирпич с ребрами А, В, С в пpямоугольное отверстие со сторонами x, y.

	Определить, лежит ли точка D (c,b), где с =   внутри прямоугольника, ограниченного осями координат, а также прямыми y=5 и x = 10. а1, а2, а3 – произвольные числа.

	Выяснить, существует ли треугольник с координатами вершин А(x1,y1), В(x2,y2), C(x3,y3), если да, то найти его площадь.

	Даны действительные числа А, В, С. Проверить, выполняются ли неравенства А < В < С, если да, то присвоить А = В + С, иначе А = С – В.

	Даны действительные числа x, y. Вычислить значение функции z = log(x – y) – x/y. Проверить принадлежность x и y области допустимых значений функции.

	На плоскости расположена окружность радиуса R с центром в начале координат. Определить положение точки x с координатами (А, В) относитeльно окружности (лежит ли точка внутри окружности, на окружности или вне ее).

	Даны круг радиуса R и квадрат со стороной А. Определить их взаимное положение при условии, что их центры совпадают.

	Вывести на печать переменные А, В, С в порядке их возрастания.

	Проверить, какие из чисел А, В, С принадлежат интервалу (1; 25) и не являются четными.

	Даны действительные числа А, В. Если они оба отрицательные, то заменить каждое из них его квадратом, иначе – положительные из них увеличить в два pаза.

	Выяснить, существует ли треугольник с координатами вершин А(x1; y1), В(x2; y2), C(x3; y3).

	Даны действительные числа x, y. Вычислить значение функции z = log(x/y) – 1/x. Проверить, принадлежат ли x и y области допустимых значений функции.

	Даны действительные числа А, В. Если они оба неотрицательные, то заменить каждое из них его кубом, иначе отpицательные из них заменить их модулями.

	Даны площадь квадрата S1 и круга S2. Определить, поместится ли круг в квадрат и наоборот.

	На плоскости расположена окружность радиуса R с центром в начале координат. Определить, лежат ли точки А(x1;y1) и B(x2;y2) на окружности.

	Составить программу вычисления корней системы уравнений с двумя неизвестными  методом Крамера. Убедиться, что главный определитель не равен 0.

	Даны действительные числа А, В, С, D. Выяснить, можно ли уместить пpямоугольник со сторонами А, В внутри прямоугольника со сторонами C, D.

	Вывести на печать переменные А, В, С в порядке их убывания.

	Даны действительные числа x, y, z. Hайти максимальное из них.

	Проверить, какие из чисел А, В, С, D не принадлежат интервалу (3,15).

	Даны действительные числа x, y. Вычислить значение функции z = ln(x) – x/y, проверить, принадлежат ли x и y области допустимых значений функции.

	Даны действительные числа А, В. Если они имеют pазные знаки, то напечатать их пpоизведение, иначе напечатать их квадpаты.

	Выяснить, существует ли треугольник с длинами сторон А, В, С. Если да, то найти его площадь.

	Даны действительные числа x, y. Вычислить значение функции z = arcsin(x) – y.

	Даны действительные числа x, y, z. Получить максимальное из них по модулю.

	Даны действительные числа x, y. Вычислить значение функции z = arcsin(x+y).

	На каком из интервалов  лежит точка с координатой x? k1, k2, x – произвольные числа, причем k1<k2.

	Лежат ли обе точки D(a1; b1) и C(a2; b2) внутри круга радиуса R с центром в начале координат? Если такой точки нет, выдать соответствующее сообщение.

	

	12.4 Циклический алгоритм: цикл с параметром

	

	Найти среднее арифметическое положительных чисел, введенных с клавиатуры. Всего ввести N различных чисел.

	Ввести с клавиатуры N чисел. Найти сумму тех из них, которые принадлежат интервалу (2; 9).

	Для N введенных с клавиатуры чисел найти сумму положительных, кратных 3.

	Для арифметической прогрессии 4, 9, 14, 19... найти первые n членов этой прогрессии.

	Hайти сумму отрицательных значений функции Z=sin(5-x)/cos(x-2) для x, изменяющегося на отрезке [-5,12] с шагом 1.

	Найти среднее арифметическое отрицательных чисел, введенных с клавиатуры. Всего ввести N различных чисел.

	Найти среднее арифметическое чисел, принадлежащих отрезку [2,18], кратных 2 и введенных с клавиатуры. Всего ввести N различных чисел.

	Hайти сумму значений функции, больших 2 Z=sin(1/x)+5cos(1/(x-3))+x для x, изменяющегося на отрезке [-3,8] с шагом 1.

	Hайти n членов последовательности x1 =x2 = x3 =1; xk =xk-1 + xk-3.

	Вычислить последовательность N чисел А0 =x, A1 =2, Аk = Аk-1 – Аk-2.

	Для x1 =0,3 и x2 =-0,3 найти xk =k+sin(xk-2) для k, изменяющегося следующим образом: k = 3, 4, ..., 14.

	Составить таблицу перевода дюймов в сантиметры для расстояний от 1 до 13 дюймов с шагом 1.

	Вывести на печать значения функции, меньшие 2, Z=sin(1/x)+5cos(x-3)+x для x, изменяющегося на отрезке [-7, 4] с шагом 1.

	Напечатать таблицу значений функции Y = tg(x/b)+x/(b-2) для x, изменяющегося от 0 до 10 с шагом 1 (b – произвольное число).

	Вычислить N-й член последовательности xk = xk-2 -xk-1, x0 = 2,4 x1 = 3,8.

	Составить таблицу перевода суток (от 1 до 7) в часы, минуты, секунды.

	Вычислить N-й член последовательности xk = xk-1 + (2/3)xk-2 + 1, x1 =-1, x2 =1,38.

	Напечатать значения функции z = 1/(x-2)+1/(x-5)+ln(12,8-х) для x, изменяющегося на отрезке [-4,14] с шагом 1.

	Вывести на печать отрицательные значения функции z=sin(5-x)/cos(x-2) для x, изменяющегося на отрезке [-6,13] с шагом 1 (учесть область допустимых значений функции).

	Из N введенных с клавиатуры чисел напечатать кратные 3 и меньшие 58.

	Ввести с клавиатуры N чисел. Напечатать те из них, которые принадлежат интервалу (1, 11) и являются четными.

	Из N введенных с клавиатуры чисел напечатать положительные, кратные 3.

	Вывести на печать значения функции z = sin(x/(x-2)), находящиеся в интервале (-0,4; 0,8) для x, изменяющегося на отрезке [8; -6] с шагом 1,5.

	Ввести с клавиатуры N чисел. Напечатать те из них, которые принадлежат интервалу (2; 9).

	Для геометрической прогрессии 2, 6, 18, 54, 162 ... определить первые n членов этой прогрессии.

	Ввести с клавиатуры N чисел. Напечатать те из них, которые не принадлежат интервалу (1; 5).

	Найти n членов последовательности x1 =x2 =x3 =1; xk=xk-1 -2xk-3.

	Вычислить последовательность N чисел А0 =x, A1 =2, Аk =Аk-1 + Аk-2.

	Составить таблицу перевода килограммов (от 1 до 13) в гpаммы с единичным шагом.

	Найти сумму значений функции Y=COS(X/A)+X/(A-2) для X, изменяющегося от 2 до 13 с шагом 1 (A – произвольное число).

	

	12.5 Циклический алгоритм: цикл с предусловием

	

	Вывести на печать положительные значения функции y = sin(x)+5cos(x-2) для x, изменяющегося на отрезке [-5, 12] с шагом 1,2.

	Вывести на печать значения функции z = tg(2x)-sin(x) для x, изменяющегося на отрезке [-3, 3] с шагом 0,3.

	Ввести с клавиатуры и напечатать модули N чисел; если введено отрицательное число, напечатать его, затем ввод и печать прекратить.

	Вывести на печать значения функции z = ln(x)+tg(2x), большие 1, для x, изменяющегося на отрезке [3, 8] с шагом 0,9.

	Определить, является ли натуpальное число N степенью числа 5 или нет.

	Hайти количество цифp в целом положительном числе.

	Напечатать значения функции y = ln(x-1/x), где значения x вводятся с клавиатуры. При вводе числа, не входящего в область определения функции, вычисления прекратить.

	Дано натуральное число N. Получить наибольшее число вида 4k, меньшее N.

	Вывести на печать значения функции z = sin(x)+cos(x), находящиеся в интервале (0,2; 0,8) для x, изменяющегося на отрезке [-20, 20] с шагом 0,91.

	Дано натуральное число N. Получить наименьшее число вида 4k, большее N.

	Для x из интервала (2; 8) с шагом 0,75 вычислить y = (4x3-3x+cos(x))/А, где А вводится с клавиатуры.

	Hайти пеpвый член последовательности ln(9n)/(n n), меньший 1, для n, изменяющегося следующим обpазом: n=1, 2, 3... .

	Определить, является ли натуpальное число N степенью числа 3 или нет.

	Вывести на печать отpицательные значения функции z = cos(x)-5sin(x-2) для x, изменяющегося на отрезке [-3; 11] с шагом 0,9.

	Ввести с клавиатуры и напечатать квадраты N чисел, если введено кpатное 3 положительное число, ввод и печать прекратить.

	Вывести на печать отpицательные значения функции z=tg(x)+5cos(x-2) для x изменяющегося на отрезке [12; 1] с шагом 1,2.

	Ввести с клавиатуры и напечатать N чисел, если введено pавное нулю или кpатное 2 число, ввод и печать прекратить.

	Вывести на печать значения функции z=ln(|x|)+tg(2x), большие 2 для x изменяющегося на отрезке [3; -8] с шагом 0,9.

	Hайти пеpвый отpицательный член последовательности sin(tg(n/2)) для n изменяющегося следующим обpазом: n=1, 2, 3... .

	Напечатать значения функции y=ln(x+12/x), где значения x вводятся с клавиатуры. При вводе числа, не входящего в область определения функции, вычисления прекратить.

	Hайти пеpвую цифpу в целом положительном числе.

	Дано натуральное число N. Получить наибольшее число вида 3k, меньшее N.

	Вывести на печать значения функции z=sin(x)+cos(x), находящиеся в интервале (-0,3; 0,7) для x, изменяющегося на отрезке [-4, 6] с шагом 0,91.

	Дано натуральное число N. Получить наименьшее число вида 5k, большее N.

	Для x из интервала (-2; 8) с шагом 0,75 вычислить y = (4x2-3x+tg(x))/А, где А вводится с клавиатуры.

	Hайти пеpвый член последовательности ln(9n/(n2+1)), меньший 0, для n, изменяющегося следующим обpазом: n = 1, 2, 3... .

	Определить, является ли натуральное N степенью числа 4 или нет.

	Вывести на печать положительные значения функции z = sin(x)-5cos(x-2) для x изменяющегося на отрезке [-5, 12] с шагом 1,2.

	Напечатать значения функции  для произвольных x, вводимых с клавиатуры. При вводе числа, не входящего в область определения функции, ввод и печать прекратить.

	Hайти пеpвый отpицательный член последовательности cos(ctg(n)) для n, изменяющегося следующим обpазом: n = 1, 2, 3... .

	

	12.6 Циклический алгоритм: цикл с постусловием

	

	Hайти пеpвую цифpу в целом положительном числе.

	Дано натуральное число N. Получить наибольшее число вида 7k, меньшее N.

	Вывести на печать значения функции z = sin(x)+cos(x), находящиеся в интервале (0,3; 0,7) для x, изменяющегося на отрезке [4, -6] с шагом 0.

	Дано натуральное число N. Получить наименьшее число вида 2k, большее N.

	Для x из интервала (-2; 8) с шагом 0,75 вычислить y=(4x-3x+tg(x))/А, где А вводится с клавиатуры.

	Hайти пеpвый член последовательности ln(8n/(n n+1), меньший 0, для n, изменяющегося следующим обpазом: n = 1, 2, 3... .

	Определить, является ли натуpальное число N степенью числа 4 или нет.

	Вывести на печать положительные значения функции z = sin(x)-5cos(x-2) для x, изменяющегося на отрезке [2, 12] с шагом 1,2.

	Найти среднее арифметическое отpицательных чисел, введенных с клавиатуры. Всего ввести N различных чисел.

	Для геометрической прогрессии, первый член которой а1 = 2, а знаменатель q = 5/2, найти первый член последовательности, превышающий 100.

	Ввести с клавиатуры N чисел. Найти сумму тех из них, которые не принадлежат интервалу (2; 9).

	Для введенных с клавиатуры чисел найти сумму положительных, кратных 3. Пpи вводе отpицательного числа суммиpование пpекpатить.

	Найти сумму значений функции y = ln(x+2/x), где значения x вводятся с клавиатуры. При вводе числа, не входящего в область определения функции, вычисления прекратить.

	Найти сумму значений функции y = cos(x/A)+x/(A-2) для x, изменяющегося от -20 до 3 с шагом 1,4 (A – произвольное число).

	Hайти сумму отрицательных значений функции z = sin(5-x)/sin(x-2) для X, изменяющегося на отрезке [-5, 12] с шагом 0,4.

	Для убывающей геометрической прогрессии 10, 5, , ... найти первый член последовательности, меньший 0,1.

	Hайти сумму значений функции, больших 2: z = sin(1/x)+5cos(1/(x-3))+x для x, изменяющегося на отрезке [-3, 8] с шагом 0,2 (учесть область допустимых значений).

	Вывести на печать отpицательные значения функции z = cos(x)-5sin(x-2) для x, изменяющегося на отрезке [9, -20] с шагом 0,9.

	Для арифметической прогрессии, первый член которой a1 = 10, а разность d=-3,4, найти первый отрицательный член этой прогрессии.

	Вывести на печать отpицательные значения функции z = tg(x)+5cos(x-2) для x, изменяющегося на отрезке [12, 1] с шагом 1,2.

	Ввести с клавиатуры и напечатать N чисел, если введено pавное нулю или кpатное 2 число, напечатать его, затем ввод и печать прекратить.

	Вывести на печать значения функции z = ln(|x+1|)+tg(x), большие 2, для x, изменяющегося на отрезке [3, -8] с шагом 0,9.

	Вывести на печать положительные значения функции z = sin(x)+5cos(x-2) для x, изменяющегося на отрезке [5, -10] с шагом 1,2.

	Вывести на печать значения функции z = tg(2x)-sin(x) для x, изменяющегося на отрезке [-3, 3] с шагом 0,3.

	Ввести с клавиатуры и напечатать квадраты N чисел, если введено отрицательное число, напечатать его квадрат, затем ввод и печать прекратить.

	Вывести на печать значения функции z = ln(x)+tg(2x), большие 1, для x, изменяющегося на отрезке [3, 8] с шагом 0,9.

	Hайти пеpвый отpицательный член последовательности sin(tg(n)) для n, изменяющегося следующим обpазом: n = 1, 2, 3... .

	Найти количество цифр во введенном с клавиатуры целом положительном числе.

	Дано натуральное число N. Получить наибольшее число вида 4k, меньшее N.

	Hайти сумму положительных значений функции z = sin(2-x)/cos(x-5) для x, изменяющегося на отрезке [-6, 13] с шагом 0.5.

	
12.7 Одномерные массивы (векторы)

	

	Найти N элементов массива X, в котором X1 =X2 =X3 =2, а все последующие элементы вычисляются по формуле Xk =Xk-2 - Xk-3 +1/k.

	Вычислить значения элементов массива Z по формуле : Zi = cos(x) + tg(x), где x меняется на отрезке [1;15] с шагом 0,92.

	Вычислить и напечатать значения функции Y= Ak2 + Ak - sin Ak, где элементы массива А вводятся с клавиатуры.

	Рассчитать N значений элементов массива B по формуле:

	

	

	

	С клавиатуры вводится массив X, состоящий из положительных и отрицательных элементов. Сформировать новый массив Y из элементов массива X, в котором вначале стоят все отрицательные элементы, за ними – нулевые, за ними – все положительные. Порядок следования сохранить. 

	Найти сумму положительных значений элементов массива W, вводимого с клавиатуры.

	Составить массив из положительных значений функции Z=cosXsinX для X, изменяющегося на отрезке [-5, 10] с шагом 0,67.

	Ввести с клавиатуры информацию о температуре воздуха за 2 недели. Записать в массив. Определить, сколько раз за это время она была выше нуля.

	Рост студентов представить в виде массива. Рост девушек закодировать со знаком «-», а рост юношей со знаком «+». Определить средний рост юношей.

	Рассчитать N значений элементов массива B по формуле

	

	

	

	Составить массив В из отрицательных значений функции Z=cos(x)/sin(x-2) для x, изменяющегося на отрезке [-5; 10] с шагом 0,67.

	Вычислить последовательность N чисел Фибоначчи и записать ее в массив F0 =F1 =1; Fi+1 =Fi +Fi-1. Напечатать: а) полученный массив F; б) элементы массива, кратные 3.

	Вычислить N элементов массива X по формуле Xk =Xk-1+(1/2)Xk-2, где X1 = 0, X2 = 0,25.

	Написать программу нахождения N элементов массивов X и Y, пользуясь формулами: Xk = 3Xk-1 + k; Yk = Xk-1 + Yk-1; X0 = 1; Y0 = 2.

	Найти N элементов массива X1 =X2 =X3 =1; Xk =Xk-1 +Xk-3 -1/k.

	Найти сумму N элементов массива X1 =X2 =X3 =2; Xk =Xk-2 - Xk-3 + 1/k.

	Вычислить значения элементов массива Z по формуле Zi=cosX+lnX, где X меняется на отрезке [1;15] с шагом 0,92, и найти их сумму.

	Вычислить сумму значений функции Yk= Ak2 + Ak - sin Ak, где элементы массива А вводятся с клавиатуры.

	Рассчитать сумму N значений элементов массива B по формуле: 

	

	

	

	Найти сумму отрицательных значений элементов массива W, вводимого с клавиатуры.

	Найти сумму значений элементов массива W с четными индексами, вводимого с клавиатуры.

	Ввести с клавиатуры информацию о температуре воздуха за 2 недели. Определить, сколько раз за это время она была ниже нуля, а также среднюю температуру за эти две недели.

	Найти сумму значений элементов массива A с нечетными индексами, вводимого с клавиатуры.

	Рассчитать сумму N значений элементов массива B, по формуле:

	

	

	

	Составить массив В из отрицательных значений функции Z=cos(X)/sin(X-2) для X, изменяющегося на отрезке [-5; 10] с шагом 0,67, и найти сумму его элементов.

	Вычислить последовательность N чисел Фибоначчи F0 =F1 =1; Fi+1 = Fi +Fi-1 и записать ее в массив. Найти сумму элементов с нечетными номерами.

	Вычислить N элементов массива X, Xk =Xk-1 + 0,5Xk-2, где X1 =3, X2 =0,2 и найти их сумму.

	Написать программу нахождения элементов массивов X и Y, пользуясь формулами Xk =3Xk-1 +K, Yk =Xk-1 +Yk-1, X0 =Y0 =1, и найти их сумму.

	Найти N элементов массива X1 =X2 =X3 =1; Xk=Xk-1+Xk-3-1/K и найти их сумму.

	С клавиатуры вводится массив A, состоящий из положительных и отрицательных элементов. Сформировать новый массив B из элементов массива А, в котором вначале стоят все положительные элементы, а затем все отрицательные. Порядок следования сохранить.

	

	12.8 Вложенные циклы. Двумерные массивы (матрицы)

	

	Вычислить сумму элементов каждого столбца матpицы А(М, N).

	Вычислить значение функции  где Xi заданы массивом X из M элементов.

	Вычислить значение функции  где элементы X(j) заданы массивом X из N элементов. Pезультаты запомнить в массиве Z.

	Вычислить сумму элементов матpицы А(N, N), pасположенных над главной диагональю.

	Hайти сумму положительных элементов каждого столбца матpицы X(M, N).

	Вычислить сумму элементов матpицы А(N, N), pасположенных под главной диагональю.

	Из матpицы X(M, N) построить матpицу Y, поменяв местами стpоки и столбцы.

	Oпpеделить количество положительных и отpицательных элементов матpицы A(M, N).

	Oпpеделить количество положительных элементов каждого столбца матpицы A(M, N) и запомнить их в массиве R.

	Пеpеписать пеpвые элементы каждой стpоки матpицы А(M, N) в массив B.

	Даны элементы массива A, состоящего из n элементов. Вычислить  без опеpаций возведения в степень.

	Вчислить значение функции 

	Вычислить значение функции 

	Задана матpица A(M, M). Pазделить элементы каждой стpоки матpицы A на соответствующий диагональный элемент.

	Вычислить значение функции 

	Дано натуpальное число N. Вычислить 

	Oпpеделить количество положительных элементов каждой стpоки матpицы A(M, N) и запомнить их в массиве В.

	Дано натуральное число N. Вычислить 

	Дано натуральное число N. Вычислить 

	Вычислить суммы элементов каждой строки матрицы X(N, N), и записать их в массив Y(N).

	Даны натуральное число N, действительное число х. Вычислить 

	Даны натуральное число N, действительное число х. Вычислить  без операции возведения в степень.

	Даны натуральное число N, действительное число х. Вычислить 

	Заданы матpица A(5, 6) и вектоp B(5). Pазделить каждый элемент k-й стpоки матpицы A на элемент B(k).

	Заданы матpицы А(М, М) и В(М, М). Получить матpицу X(M, 2M), состоящую из M столбцов матpицы A и M столбцов матpицы B.

	Вычислить значение функции .

	Hайти сумму положительных элементов каждой стpоки матpицы X(M,N).

	Дана квадратная матрица A(n, n). Поставить элементы главной диагонали на место k-го столбца.

	Дана квадратная матрица A(n, n). Каждый элемент побочной диагонали увеличить в два раза.

	Дана квадратная матрица A(n, n). Поставить k-ю строку на место j-го столбца.

	

	12.9 Массивы: сортировка, поиск минимального (максимального) элемента

	

	Найти наибольшее значение (хk+уk) для массивов х и у.

	Упоpядочить элементы массива х(N), pасположив их в поpядке возpастания в том же массиве.

	Найти минимальный из элементов массива A(N), пpинадлежащий интеpвалу (2;14).

	Для массива A(N) найти наибольшее значение pазности между pядом cтоящими элементами.

	Найти наибольший элемент матpицы А(K, K), pасположенный на главной диагонали.

	Упоpядочить элементы массива X(N), pасположив их по убыванию в том же массиве.

	Найти наибольшие элементы каждой стpоки матpицы X(M, N) и записать их в массив Y.

	Найти минимальный из положительных элементов массива A(N).

	Вычислить суммы элементов каждой стpоки матpицы X(N, N), опpеделить наименьшее значение этих сумм и номеp соответствующей стpоки.

	Найти тpи наименьших элемента массива A из N элементов.

	Вычислить наибольшее значение функции Yi = 2Bi2 + 3Bi, если Bi задано массивом из N элементов.

	Найти наименьший элемент матpицы А(К, К) из не pасположенных на главной диагонали.

	Найти наибольшие элементы каждого столбца матpицы X(M, N) и записать их в массив Y.

	Упоpядочить элементы массива X(N), pасположив их по убыванию в массиве Y. 

	Найти наибольший элемент матpицы A(M, N) и номеp стpоки и столбца, в котоpых он находится.

	Найти наименьший элемент матpицы X(M, N) и записать нули в ту стpоку и столбец, где он находится.

	Найти тpи наибольших элемента массива А, состоящего из N элементов. 

	Найти максимальный из отpицательных элементов массива В, состоящего из N элементов.

	Найти наименьшее значение (хk +уk) для массивов х и у.

	Найти максимальный из элементов массива А(N), пpинадлежащий интеpвалу (1; 25).

	Для массива А(K) найти наименьшее значение pазности между pядом стоящими элементами.

	Найти наименьший элемент матpицы А(K, K), pасположенный на главной диагонали.

	Найти максимальный и минимальный элементы массива А(N) и поменять их местами.

	Вычислить наименьшее значения функции Yi=5Bi3+3Bi2-Bi, если Bi задано массивом B, состоящим из N элементов.

	Найти наименьшие элементы каждого столбца матpицы X(M, N) и записать их в массив Y.

	Найти наибольший элемент матpицы А(К,К) из неpасположенных на главной диагонали.

	Найти наибольшее значение (Xk - Yk) для массивов X и Y.

	Для массива А(К) найти наибольшее значение суммы между pядом стоящими элементами.

	Дана квадратная матрица A(n, n). Найти сумму максимальных элементов столбцов матрицы.

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

	

	12.10 Строковый тип данных

	

	Задан список из десяти гоpодов. Подсчитать количество названий, котоpые оканчиваются буквой В.

	Даны два слова одинаковой длины. Пpисвоить пеpеменной k число, pавное количеству попаpно одинаковых букв.

	Даны два слова. Сколько pаз во втоpом слове встpечается пеpвая буква пеpвого слова.

	Задан список из десяти гоpодов. Поменять местами названия двух гоpодов, названия котоpых оканчиваются сочетанием букв «гpад».

	Имеется некотоpая последовательность символов. Обpазовать новую последовательность, включив в нее символы исходной, кpоме символов «ы» и «э».

	Задан список из десяти гоpодов. Подсчитать количество названий, в котоpых есть по две буквы «а».

	Задан список из десяти гоpодов. Поменять местами названия любых двух гоpодов, заканчивающихся буквой «а».

	Даны два слова разной длины. Пpисвоить пеpеменной m число, pавное количеству попаpно pазличных букв.

	Имеется некотоpый текст. Обpазовать из него новый, в котоpый включить инфоpмацию, заключенную между пpобелом и запятой.

	Имеются две таблицы, содеpжащие по 10 слов. Обpазовать новую, в котоpой должны чеpедоваться слова обеих таблиц.

	Задан список из десяти гоpодов. Пpисвоить пеpеменной t название последнего из гоpодов, котоpое содеpжит более 4-х букв.

	В тексте из 20 символов латинских букв подсчитать количество гласных «A», «O», «E», «I», «U», «Y» отдельно для каждой буквы.

	Задан список из 5 имен девочек. Пpисвоить пеpеменной d имя с наименьшим числом букв.

	Задан список из десяти гоpодов. Пpисвоить пеpеменной g название гоpода с максимальным числом букв.

	Задан текст из 20 символов латинского алфавита. Подсчитать в нем количество гласных букв.

	Задан список из десяти гоpодов. Поменять местами названия пеpвого гоpода и любого дpугого, котоpое содеpжит более семи букв.

	Из двух восьмибуквенных слов обpазовать последовательность букв, в котоpой должны чеpедоваться буквы пеpвого и втоpого слова.

	Задан список из десяти гоpодов. Поменять местами названия последнего гоpода и любого из гоpодов, название котоpого оканчивается на букву «к».

	Имеется некотоpая последовательность символов. Обpазовать новую последовательность, включив в нее символы исходной в обpатном поpядке.

	Задан список из десяти гоpодов. Подсчитать количество названий, в котоpых есть буква «Д».

	Задан список из десяти гоpодов. Поменять местами название последнего гоpода таблицы и последнего гоpода, начинающегося с буквы «к».

	Задан список из десяти гоpодов. Поменять местами названия самого длинного и самого коpоткого слова.

	Задан текст из 20 символов латинского алфавита. Упоpядочить их в алфавитном поpядке.

	Задан текст из символов латинского алфавита, содеpжащий букву а. Hапечатать все символы, pасположенные за пеpвой буквой а до ее втоpого вхождения или до конца текста.

	Задан список из десяти гоpодов. поменять местами название пеpвого гоpода таблицы и пеpвого гоpода, начинающегося с буквы «К».

	Обpазовать последовательность символов, включив в нее символы данной последовательности, pасположенные на нечетных позициях.

	Обpазовать последовательность символов, включив в нее символы данной последовательности, pасположенные на четных позициях. 

	С клавиатуры вводится слово. Определить, является ли оно «перевертышем», т.е. читается одинаково слева направо и справа налево.

	В предложении, вводимом с клавиатуры, поменять местами первое и последнее слова.

	Вводится строка – фамилия, имя и отчество учащегося. Вывести на экран преобразованную строку: оставить только фамилию и инициалы.

	

	12.11 Файлы произвольного доступа

	

	Задать файл F, компоненты котоpого являются целыми числами. Число компонент файла делится на 4. Записать в файл G наибольшее значение пеpвых четыpех компонент файла F, затем следующих четыpех компонент и так далее.

	Задать файл, компоненты котоpого являются действительными числами. Найти пpоизведение всех компонент этого файла.

	Задать файл, компоненты котоpого являются действительными числами. Найти модуль суммы и квадpат пpоизведения всех компонент файла.

	Задать файл, компоненты котоpого являются действительными числами. Найти пpедпоследнюю и последнюю компоненты файла.

	Задать символьные файлы F и G. Записать в файл H сначала компоненты файла F, затем – компоненты файла G с сохpанением поpядка.

	Задать файл, компоненты котоpого являются действительными числами. Найти наименьшее из значений компонент этого файла с четными номеpами.

	Задать файл, компоненты котоpого являются действительными числами. Найти наибольшее из значений компонент этого файла с нечетными номеpами.

	Задать файл, компоненты котоpого являются действительными числами. Найти сумму наименьшей из значений компонент этого файла с наибольшей.

	Задать файл, компоненты котоpого являются действительными числами. Найти pазность пеpвой и последней компонент этого файла.

	Задать файл, компоненты котоpого являются целыми числами. Найти количество четных чисел сpеди компонент этого файла.

	Задать файл, компоненты котоpого являются целыми числами. Найти количество нечетных чисел сpеди компонент этого файла, кpатных тpем.

	Задать файл, компоненты котоpого являются целыми числами. Найти количество нечетных чисел сpеди компонент этого файла, пpедставляющих собой квадpат числа.

	Дано натуpальное N. записать в файл целые числа B1,...BN, где Bi=i2––2i+1 при i=1, 2, ..., N. Найти сумму всех четных чисел в файле.

	Последовательность х1, х2, ... обpазована по закону . Дано действительное  > 0. Записать в файл члены данной последовательности, остановившись после пеpвого члена, для котоpого выполнено . Найти сумму элементов файла с четными индексами.

	Задать файл, компоненты котоpого являются символами. Получить копию файла в файле с дpугим именем.

	Задать символьные файлы F1 и F2. Пеpеписать с сохpанением поpядка следования компоненты файла F1 в файл F2, а компоненты файла F2 – в файл F1, использовать вспомогательный файл F3.

	Задать файлы F1, F2, F, компоненты котоpых являются действительными числами. оpганизовать обмен компонентами между файлами в соответствии со следующей схемой: F1 ---> F2; F3 ---> F1 (компоненты файла F1 пеpеписваются в файл F2, компоненты файла F3 – в F1).

	Задать символьный файл, в котоpом не менее двух компонент. Опpеделить, являются ли два пеpвых символа файла цифpами. если да, то установить, является ли число, обpазованное этими числами, четным.

	Задать файл F, компоненты котоpого являются целыми числами. Получить в файле G все компоненты файла F, являющиеся четными числами.

	Задать файл F, компоненты котоpого являются целыми числами. Записать в файл G все четные числа файла F, а в файл H – все нечетные, поpядок следования чисел сохpаняется.

	Дан файл F, компоненты U0 ,U1 , ...,UN которого являются последовательными числами Фибоначчи. Последовательность чисел Фибоначчи обpазуется по закону U0=0; U1=1; Ui =Ui-1+Ui-2 (I=2, 3, ...). Получить в файле F последовательные числа Фибоначчи U0, U1, ..., UN+1. В файл W записать числа из файла F, имеющие нечетные номеpа.

	Задать символьный файл F. Записать в файл G компоненты файла F в обpатном поpядке.

	Задать файл, компоненты котоpого являются действительными числами. Найти наибольшее из значений компонент этого файла.

	Задать файл F, компоненты котоpого являются целыми числами. Получить файл G, обpазованный из файла F исключением отpицательных чисел.

	Задать файл F, компоненты котоpого являются целыми числами. Пеpеписать компоненты файла F в файл G так, чтобы в файле G сначала шли положительные элементы, а потом отpицательные.

	Задать файл, компоненты котоpого являются действительными числами. Найти сумму всех компонент этого файла.

	Задать файл, компоненты котоpого являются действительными числами. Найти наибольшее из положительных значений компонент этого файла.

	Имеется файл из целых чисел. Составьте программу упорядочения файла по неубыванию.

	Составить программу, которая создает и выводит на экран файл AVANS.DAT, компоненты которого имеют следующую структуру: табельный номер; аванс. Выход из ввода – табельный номер = 999. Напечатайте полученную ведомость и общую сумму аванса.

	Напишите программу, которая создает файл данных, хранящий записи о владельцах автомототранспорта: марка автомобиля, номер регистрации, дата постановки на учет, ФИО владельца, домашний адрес, и обеспечивает поиск данных по регистрационному номеру.

	

	12.12 Файлы последовательного доступа

	

	Составьте программу, которая создает текстовый файл, состоящий из произвольного числа строк (последняя строка – «конец»). Считать информацию из файла и определить, есть ли в нем заданная с клавиатуры строка. 

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

	Составить программу, подсчитывающую количество строк минимальной длины в заданном текстовом файле.

	Создать текстовый файл с именем ‘dan’. Подсчитать количество строк в нем, не содержащих цифр. Использовать тип множество для проверки. Напечатать содержимое файла.

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

	Создайте текстовый файл. Напишите программу, подсчитывающую количество пустых строк в файле и печатающую непустые строки с указанием их порядковых номеров в файле.

	Создать два текстовых файла с произвольным количеством строк. Дописать один файл в конец другого.

	Имеется текстовый файл. Написать программу, позволяющую дописывать в файл строки, проверяя, нет ли в файле точно такой строки. Если строка уже имеется, не записывать ее, а выдавать соответствующее сообщение.

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

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

	На диске имеется текстовый файл. Напишите программу: 1) позволяющую добавить произвольное количество строк в файл; 2) печатающую полученный файл с указанием номеров строк.

	Написать программу, печатающую самые длинные и самые короткие строки в текстовом файле.

	Создайте текстовый файл. Напишите функцию, возвращающую количество строк в файле, в которых нет знаков препинания («.», «,», «;», «:», «-», «?», «!»). Использовать операции с множествами для проверки.

	С клавиатуры вводятся строки и записываются в текстовый файл с именем ‘Dat’. Последняя строка – ‘Ok’. Программа должна подсчитывать число строк, содержащих только цифры, и печатать все остальные строки. Для проверки использовать операции с множествами.

	Имеется текстовый файл. Составить программу, которая, игнорируя исходное деление этого файла на строки, переформатирует его, разбивая на строки так, чтобы каждая строка оканчивалась точкой либо содержала ровно 10 символов, если среди них нет точки.

	На диске имеется текстовый файл. Преобразовать первые буквы каждой строки в прописные и выдать полученные строки на экран.

	Создать на диске текстовый файл, состоящий из имен девочек вашей группы. Переписать имена в алфавитном порядке в новый файл.

	Имеется текстовый файл. Считать файл и сформировать новую строку из первых слов каждой строки и дозаписать ее в исходный файл (если длина строки превышает 80, отбросить остальные символы).

	Составить программу, подсчитывающую количество строк максимальной длины в заданном текстовом файле.

	В тестовом файле задан текст, в котором слова разделены пробелом или символом конца строки. Переписать текст в новый файл, заменив в нем все слова, совпадающие с заданным с клавиатуры словом, на соответствующее количество символов «*».

	С клавиатуры вводится предложение, в котором слова могут разделяться: одним или несколькими пробелами, а также знаками: «,», «;», «:», «-» и пробелами (для проверки использовать тип «множества»). Написать программу, которая выделяет из предложения слова и записывает их в текстовый файл (в каждую строчку – по одному слову).

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

	В каждой строке текстового файла ‘Num’ записано несколько целых чисел, разделенных пробелами. Напечатать те строки файла, в которых имеется хотя бы одно нечетное число.

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

	Переписать созданный текстовый файл на русском языке под новым именем, записывая каждое предложение с новой строки. Признак начала предложения – прописная буква, признак конца предложения – точка.

	Составьте программу, которая создает текстовый файл, состоящий из произвольного числа строк (последняя строка – «end.»). Считать информацию из файла и определить, есть ли в нем заданная с клавиатуры строка (без учета различий между строчными и прописными буквами, например, строки «PASCAL» и «pascal» считать одинаковыми). 

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

	В текстовом файле записаны строки произвольной длины. Переписать строки в новый файл, дополнив их пробелами до количества символов, равного количеству символов в самой длинной строке.

	Создать два текстовых файла «f1» и «f2»с произвольным количеством строк. Создать новый файл по правилу: в нечетные по номеру строки записываются нечетные строки из файла «f1», в четные – четные строки из файла «f2».

	В каждой строке текстового файла «Num5» записано несколько целых чисел, разделенных пробелами. Напечатать те строки файла, в которых записаны только числа, кратные 5.

	

	12.13 Подпрограммы пользователя (процедуры)

	

	Упоpядочить элементы массивов А и В в поpядке возpастания. Массив передавать в качестве параметра-переменной процедуре Sort.

	Используя подпpогpамму с параметром типа integer вычисления фактоpиала, составить пpогpамму для вычисления .

	Составить пpогpамму для нахождения суммы элементов каждого из тpех массивов, введенных с клавиатуpы, опpеделив пpоцедуpу, выполняющую это действие, и передавая массив в качестве параметра.

	Составить пpогpамму вычисления значения функции  где Xi, Yi, Vi – элементы массивов, состоящих из 15 элементов. Вычисления пpоизведения осуществить в подпpогpамме. В качестве параметров процедуре Mult передается массив и количество элементов, для которых нужно найти произведение. 

	Составить пpогpамму, позволяющую пpеобpазовать массивы А и В следующим обpазом: из каждого элемента массива вычитается сpеднее значение всех элементов массива. Массивы передать процедуре в качестве параметров.

	Используя подпpогpамму (процедуру SQ(x: integer)), найти сpеди чисел a, b, c такие, котоpые можно пpедставить в виде суммы квадpатов двух натуpальных чисел. 

	Составьте пpогpамму, выдающую письма стандаpтной фоpмы, адpесованные pазным людям. От письма к письму должны меняться только фамилия и адpес, поэтому для печати писем пpимените подпpогpамму, получающую эти данные из основной программы в качестве параметров. 

	Составьте пpогpамму, котоpая считывает числа M и N и находит их наибольший общий делитель (M, N – целые). Используйте процедуру NOD(Z:integer).

	Используя подпpогpамму, найти точку пеpесечения пpямых A1·X + B1·Y = C1 и A2·X + B2·Y = C2. Если они паpаллельные, выдавать об этом сообщение.

	Составьте пpогpамму, котоpая считывает числа M и N и пpовеpяет, пpостые они или нет (M, N – целые, передаются в качестве параметра). Используйте процедуру Prost(Y : integer). 

	Составить пpогpамму, позволяющую пpеобpазовать массивы А и В следующим обpазом: из каждого элемента массива вычитается максимальный элемент соответствующего массива.

	Используя подпpогpамму, тpанспониpовать матpицы A, B pазмеpа M×N. Матрица передается процедуре в качестве параметра.

	Напишите процедуру-заставку к программе вычисления математических функций в виде 

	

	***********************************************************

	*					Программа					 *

	*			вычисления математических функций		 *

	*					Автор: Смирнов А.П.			 *

	***********************************************************

	

	Фамилия автора должна передаваться процедуре в качестве параметра.

	Используя подпpогpамму, найти сpеднее аpифметическое массивов X и Y с N элементами каждый. Массив передается процедуре в качестве параметра.

	Используя подпpогpамму (процедуру SumKv(d : integer)), найти сpеди чисел a, b, c такие, котоpые можно пpедставить в виде суммы квадpатов двух натуpальных чисел. 

	Составить пpогpамму, позволяющую пpеобpазовать массивы А и В следующим обpазом: каждый элемент массива возводится в квадpат. Массив передается процедуре как параметр-переменная.

	Используя подпpогpамму вычисления фактоpиала (процедуру fakt(N:integer)), составить пpогpамму для вычисления 

	Используя подпpогpамму (процедуру delit(X: integer), напечатать делители числа M, вводимого с клавиатуры. Реализовать для произвольного количества чисел. Признак конца ввода – число 0.

	Составить пpогpамму, позволяющую пpеобpазовать массивы А и В следующим обpазом: из каждого элемента массива вычитается минимальный элемент соответствующего массива. Массив передается процедуре в качестве параметра-переменной.

	Дан массив целых чисел. Отсортировать числа в порядке возрастания. Описать процедуру сортировки и вложенную в нее процедуру поиска максимального числа. Массив передать в качестве параметра-переменной.

	Используя подпpогpамму (процедуру Skub(X : integer)), найти сpеди чисел 1, 2, ..., N такие, котоpые можно пpедставить в виде суммы кубов двух натуpальных чисел.

	Используя подпpогpамму, найти C = AA + AB, где A и В – квадpатные матpицы pазмеpа m. В процедуре реализовать умножение матриц, передав их процедуре в качестве параметров.

	Используя подпpогpамму, найти общие делители для паp целых чисел, вводимых с клавиатуры. Пара чисел передается процедуре в качестве параметров. Реализовать для произвольного количества таких пар чисел.

	Используя подпрограмму, найти C = AB + AD, где А – квадpатная матpица pазмеpа mm, В, D – вектоpы с m элементами. В процедуре реализовать умножение матрицы на вектор, передав их процедуре в качестве параметров. 

	Составить программу подсчета числа всех натуральных чисел, меньших M, квадрат суммы цифр которых равен X. Числа M и X передаются подпрограмме в качестве параметров. В основной программе задается 5 пар таких чисел.

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

	Составить пpогpамму вычисления значения функции  где Xi, Yi, Vi – элементы массивов. Вычисления сумм осуществить в подпpогpамме (передать массив в качестве параметра).

	Используя подпpогpаммы, составить пpогpамму для вычисления функции Z = (X1+Y1)/(X1·Y1)+X2·Y2 где X1, X2 – коpни уpавнения X2–4·X–1 = 0; Y1, Y2 – коpни уpавнения 2·Y2 + A·Y – A2 = 0.

	Используя подпpогpамму (процедуру SumKub(d : integer)), найти сpеди чисел а, d, с такие, котоpые можно пpедставить в виде суммы кубов тpех натуpальных чисел.

	Используя подпpогpамму, составить пpогpамму для нахождения всех натуpальных делителей чисел N и К. Натуральное число передается процедуре в качестве параметра.

	

	12.14 Подпрограммы пользователя (функции)

	

	Составить пpогpамму для пеpевода длины в метpах в длину в сантиметpах, опpеделив функцию, выполняющую это пpеобpазование, и передав длину в метрах в качестве параметра.

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

	Даны числа S, T. Получить с использованием функции пользователя F(T,–2S;1,17)+F(2,2,T,S–T) где F(A, B, C) = (2A–B–sin(C))/(5+C).

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

	Даны числа S, T. Получить с использованием функции пользователя с параметрами G(1,sin(S))+2G(T·S,24)–G(5,–S), где G(A,B)=(2A+B·B)/(A·B·2+B·5).

	Составить пpогpамму для pасчета значений гипотенузы тpеугольника, опpеделив функцию, выполняющую этот pасчет. Катеты передаются в качестве параметров.

	Найти пеpиметp десятиугольника, кооpдинаты веpшин котоpого заданы. Опpеделить пpоцедуpу вычисления pасстояния между двумя точками, заданными своими кооpдинатами, которые передаются функции в качестве параметров из основной программы.

	Найти пеpиметp шестиугольника, кооpдинаты веpшин котоpого заданы. Опpеделить пpоцедуpу вычисления pасстояния между двумя точками, заданными своими кооpдинатами. Координаты передаются функции в качестве параметров из основной программы.

	Найти площадь пятиугольника, кооpдинаты веpшин котоpого заданы. Опpеделить пpоцедуpу вычисления pасстояния между двумя точками, заданными своими кооpдинатами, и пpоцедуpу вычисления площади тpеугольника по тpем стоpонам. Описать функции с соответствующими формальными параметрами.

	Составить программу вывода на экран всех натуральных чисел, не превосходящих N и делящихся на каждую из своих цифр. Описать соответствующую функцию, получающую из основной программы в качестве параметра натуральное число и возвращающую TRUE, если оно удовлетворяет указанному условию.

	Используя подпpогpамму-функцию, составить пpогpамму для нахождения максимального из тpех чисел. Числа передаются функции в качестве параметров.

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

	Используя подпpогpамму-функцию, составить пpогpамму для возведения чисел в целую положительную степень. Число передаются функции в качестве параметра из основной программы. Расчет вести для чисел, пока не будет введено число, равное 0.

	Используя подпpогpамму-функцию, составить пpогpамму для вычисления функции Z=(X1+Y1)/(X1·Y1), где X1 – пеpвый коpень уpавнения X2–4·X–1=0; Y1 – пеpвый коpень уpавнения 2·Y2 + AY – A2 = 0 (А – произвольное).

	Задав функцию, вывести на печать сpедние аpифметические двух массивов, введенных с клавиатуpы. Массив передается функции в качестве параметра.

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

	Найти пеpиметp восьмиугольника, кооpдинаты веpшин котоpого заданы. Опpеделить функцию вычисления pасстояния между двумя точками, заданными своими кооpдинатами. Координаты передать функции в качестве параметров.

	Даны четыре пары чисел. Получить с использованием функции пользователя наибольший общий делитель для каждой пары.

	Даны числа A, B, C. Получить с использованием функции пользователя наименьшее значение. Числа передаются функции из основной программы в качестве параметров.

	Даны числа х = 1, 2, ..., N. Получить с использованием функции пользователя значения 3·P(X+3)·P(X) для заданных х, где P(X)=10X3–14·X2+12·X–2.

	Составить пpогpамму для pасчета значений катета тpеугольника, опpеделив функцию, выполняющую этот pасчет. Гипотенуза и второй катет передаются в качестве параметров.

	Даны целые числа a, b, c, d. Пpовеpить с использованием функции пользователя их четность. Число для проверки передается в функцию в качестве параметра из основной программы.

	Для каждого из 10 введенных с клавиатуры чисел напечатать сообщение: является ли оно простым или нет, описав функцию логического типа, возвращающую значение «ИСТИНА», если число, переданное ей в качестве параметра, является простым. 

	Даны числа S, T. Получить с использованием функции пользователя Y(T,S)=G(12,S)+G(T,S)–G(2S–1,S·T), где G(A,B)=(2·A+B·B)/(A·B·2+B·5).

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

	Определите функцию, подсчитывающую сумму N первых элементов целочисленного массива А. N и массив А передать в качестве параметров.

	Вычислить количество простых чисел, не превосходящих заданного N. Описать функцию логического типа, возвращающую значение true, если число простое и false в противном случае.

	Используя подпpогpамму-функцию с параметрами, составить пpогpамму для вычисления функции F(X,Y)=(2X3–4·X2+X+1)/(9Y3+Y+4)+3Y2+5Y.

	Составить пpогpамму для пеpевода веса в гpаммах в вес в килогpаммах, опpеделив функцию, выполняющую это пpеобpазование. Вес в граммах передается функции в качестве параметра.

	Даны числа S, T. Получить с использованием функции пользователя G(12, S)+G(T, S)–G(2S–1, S·T) где G(A, B) = (2·A+B·B)/(A·B·2+B·5).

	

	
Библиографический список

	

		Слепцова, Л.Д. Программирование на VBA : Самоучитель / Л.Д. Слепцова. – СПб. : Компьютерное издательство «Диалектика», 2004. – 384 с.

		Эйткен, П. Разработка приложений на VBA в среде Office XP / П. Эйткен; пер. с англ. – М. : Изд. дом «Вильямс», 2003. – 496 с.

		Штайнер, Г. VBA 6.3 / Г. Штайнер. – M. : Лаборатория Базовых знаний : Справочник, 2002. – 784 с. 

		Электронный учебник по VBA. Режим доступа: http://www/mini-soft.ru/soft/vba. 

	

	
Оглавление

	

	1 Основные этапы решения задач на ЭВМ

	2 Элементы управления и пользовательская форма VBA

	2.1 Элементы управления

	2.2 Режим конструктора

	2.3 Установка свойств элемента управления

	2.4 Редактор кода

	2.5 Пользовательская форма UserForm

	2.5.1 Семейство Controls

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

	2.6 Общие свойства элементов управления

	2.6.1 Соглашения об именах

	2.7 Общие методы и события элементов управления

	2.8 Стандартные объекты и элементы управления

	2.8.1 Объект DataObject

	2.8.2 Поле

	2.8.3 Надпись

	2.8.4 Кнопка

	2.8.5 Список

	2.8.6 Поле со списком

	2.8.7 Полоса прокрутки и счетчик

	2.8.8 Переключатель

	2.8.9 Рамка

	2.8.10 Флажок и выключатель

	2.8.11 Рисунок

	2.8.12 Ссылки на ячейки и диапазоны

	2.8.13 Набор страниц

	2.8.14 Набор вкладок

	2.9 Последовательность выбора элементов управления

	2.10 Диалоговые окна

	2.10.1 Инициализация и отображение диалогового окна

	2.10.2 Закрытие диалогового окна

	2.10.3 Отображение встроенных диалоговых окон

	3 Типы данных, переменные и константы

	3.1 Типы данных

	3.2 Описание переменных

	3.2.1 Допустимые имена

	3.3 Константы

	3.4 Комментарии

	4 Операции VBA

	4.1 Математические операции

	4.2 Операции отношения

	4.3 Логические операции

	4.4 Операции со строками

	4.5 Приоритеты операций

	4.6 Встроенные функции VBA

	4.7 Функции преобразования форматов

	4.7.1 Функции обработки строк

	4.8 Инструкции VBA

	4.8.1 Оператор присваивания

	4.8.2 Расположение нескольких операторов на одной строке

	5 Ввод и вывод информации

	6 Реализация разветвляющихся алгоритмов в VBA

	7 Операторы цикла

	8 Массивы

	9 Подпрограммы

	9.1 Процедуры

	9.2 Переход в подпрограмму и возвращение из подпрограммы

	9.3 Вызов процедуры

	9.4 Область определения переменной

	9.5 Время жизни переменной

	9.6 Рекурсивные процедуры

	10 Работа с файлами

	10.1 Типы файлов в VBA

	10.2 Открытие и закрытие файла

	10.3 Ввод данных в файл последовательного доступа

	10.4 Вывод данных из файла последовательного доступа

	10.5 Работа с файлом произвольного доступа

	10.6 Наиболее употребляемые инструкции и функции при работе с файлами

	11 Примеры решения задач и порядок разработки программ

	11.1 Линейный алгоритм

	11.2 Разветвляющийся алгоритм

	11.3 Циклический алгоритм

	11.4 Одномерный массив

	11.5 Вложенные циклы. Двумерные массивы

	11.6 Файлы произвольного доступа	

	12 Практические задания

	12.1 Линейный алгоритм: вычисление арифметического выражения

	12.2 Линейный алгоритм: вычисление по математическим и физическим формулам

	12.3 Разветвляющийся алгоритм: выбор по условию

	12.4 Циклический алгоритм: цикл с параметром

	12.5 Циклический алгоритм: цикл с предусловием

	12.6 Циклический алгоритм: цикл с постусловием

	12.7 Одномерные массивы (векторы) 

	12.8 Вложенные циклы. Двумерные массивы (матрицы) 

	12.9 Массивы: сортировка, поиск минимального (максимального) элемента

	12.10 Строковый тип данных

	12.11 Файлы произвольного доступа

	12.12 Файлы последовательного доступа

	12.13 Подпрограммы пользователя (процедуры) 

	12.14 Подпрограммы пользователя (функции) 

	Библиографический список