Добавил:
По своей натуре перфекционист. Поэтому люблю все аккуратно оформлять и упорядочивать, складывать по полочкам. Вот, не пропадать же добру, нажитому за четыре кропотливых семестра. Тут я выложил все мои ответы, курсовые, отчеты и некоторые ДЗ. Они могут вам помочь для получения зачета или сдачи экзамена. Если чего-то не нашли в папочках, то попытайте удачу в разделе НЕОТСОРТИРОВАННОЕ на моей страничке, там все 4 семестра разложены по папкам. ГРУППА КТ-43-15. Годы обучения 2015-2019. Коллекция будет пополняться. Что ж, удачки :З Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

VBA (Стеценко) / VBA_ЛБ_13v2

.pdf
Скачиваний:
46
Добавлен:
15.09.2017
Размер:
1.87 Mб
Скачать

Стеценко А. А.

71

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

Строку, полученную от InputBox, можно программными средствами преобразовать в любой требуемый тип данных. наиболее часто требуется преобразование строки в число. Здесь нет никаких проблем, если пользователь не ошибается и вводит правильные данные, не "захламляет" поле ввода посторонними символами. Например, если требуется ввести целое число и в поле ввода будут только цифры, можно просто записать

Dim k As Long

k = InputBox(Mess, theTitle, Def)

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

Проблема в том, что всегда, когда требуется получить что-то от живого человека, необходимо учитывать "человеческий фактор": людям свойственно ошибаться. Программу нужно строить так, чтобы случайная ошибка в действиях пользователя не ставила его в недоумённое положение. Вернёмся к программе в листинге 35 и попытаемся убедить пользователя ввести 1, 2, 3 или 4 и нажать <Enter> или щелкнуть по кнопке ОК. Одно из возможных приводится в листинге 36.

Листинг 36

Dim k As Integer, Counter As Integer, Limit As Integer On Error Resume Next

k = 0 Limit = 3

For Counter = 1 To Limit

k = InputBox(Mess, theTitle, Def)

If (k >= 1) And (k <= 4) Then Exit For If Counter = Limit Then

MsgBox "Сколько раз можно ошибаться?" + _ vbLf + vbLf + "Good Luck!"

Exit Sub End If

Next Counter

Цикл For может исполниться максимум Limit раз, и каждый раз на экран выводится окно InputBox с приглашением ввода. Если пользователь нажмёт 1, 2, 3 или 4 (и <Enter> или ОК), цикл прекращается и программа продолжает работать. В последнем походе по циклу на экран выводится сообщение о невозможности продолжения работы.

Метод Excel InputBox

Синтаксис метода Excel InputBox:

Application.InputBox(Prompt _

[, Title] [, Default] _

72 Программирование в среде электронных таблиц Microsoft Excel

[, Left] [, Top] _

[, HelpFile, HelpContextID] _ [, Type])

Отличия синтаксиса метода Excel InputBox от синтаксиса аналогичной функции VBA небольшие (отличия в именах некоторых аргументов не в счёт). Перед именем метода нужно указать объект Application, а к аргументам функции VBA добавляется необязательный аргумент Type. Этот аргумент обозначает тип данного, возвращаемого методом InputBox. Если функция VBA возвращает только строку (данное типа String), то метод Excel может возвратить данные разных типов (табл. 5).

Таблица 5 Типы возвращаемых данных метода Excel InputBox

Значение аргумента Type

Тип возвращаемого данного

0

Формула

1

Число

2

Строка

4

Логическое

8

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

16

Значение ошибки

64

Массив значений

Типы данных можно комбинировать, для этого нужно сложить соответствующие числа. Например, Type = 65 (1+64) обозначает массив числовых значений. Ссылку на диапазон ячеек можно либо вводить с клавиатуры, либо очертить мышью на экране. В программе МестоВывода (листинг

Листинг 37

Sub МестоВывода()

Dim RngA As Range, Result

. . .

On Error GoTo Выход

Set RngA = Application.InputBox( _

Prompt:="Введите диапазон для вывода", _ Title:="Вывод результата", _ Default:=Selection.Aggress, _

Type:=8) RngA = Result

. . . 'Какие-то действия

End Sub

Функция VBA MsgBox

Выводит окно сообщения, ждёт ответа от пользователя и возвращает число типа Integer, обозначающее нажатую кнопку.

Синтаксис:

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

Стеценко А. А.

73

prompt – сообщение, единственный обязательный аргумент.

buttons – числовое выражение, определяющее начинку окна кнопками, функциональную пиктограмму и модальность (см. табл. 6). По умолчанию принимается 0.

title – заголовок окна. По умолчанию выводится "Microsoft Excel". helpfile и context – файл и раздел справки.

Таблица 6

Составляющие аргумента buttons (выборка)

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

Значение

Описание

константы

 

 

vbOKOnly

0

Только кнопка OK

vbOKCancel

1

Кнопки OK и Cancel

vbAbortRetryIgnore

2

Кнопки Abort, Retry и Ignore

vbYesNoCancel

3

Кнопки Yes, No и Cancel

vbYesNo

4

Кнопки Yes и No

vbRetryCancel

5

Кнопки Retry и Cancel

vbCritical

16

 

 

 

 

vbQuestion

32

 

 

 

 

vbExclamation

48

 

 

 

 

vbInformation

64

 

 

 

 

vbApplicationModal

0

Модальность приложения: пока

 

 

не закрыто окно сообщения,

 

 

приложение блокируется.

vbSystemModal

4096

Системная модальность: пока не

 

 

закрыто окно сообщения, все

 

 

приложения блокируются.

vbMsgBoxHelpButton

16 384

В окно сообщения добавляется

 

 

кнопка "Справка" (Help).

VbMsgBoxSetForeground

65 536

Окно сообщения расположить

 

 

поверх других окон.

К функции MsgBox можно обращаться и как к процедуре, и как к функции. Если требуется просто проинформировать пользователя о возникшей ситуации, применяется обращение к процедуре. В программе InputSelection (листинг 23) инструкция

MsgBox "Необходимо выделить диапазон ввода"

выводит на экран окно сообщения с одной кнопкой ОК, которую нужно щёлкнуть, чтобы закрыть окно сообщения.

Обращение к MsgBox как к функции строится немного иначе. Имя функции указывается в правой части инструкции присваивания, а в левой части указывается целочисленная переменная, значение которой определяется кнопкой,

. . .
Case vbNo
. . .
End Select
. . .

74

Программирование в среде электронных таблиц Microsoft Excel

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

 

 

Таблица 7

 

Возвращаемые значения функции MsgBox

 

 

 

Кнопка

Именованная константа

Значение константы

OK

vbOK

1

Cancel

vbCancel

2

Abort

vbAbort

3

Retry

vbRetry

4

Ignore

vbIgnore

5

Yes

vbYes

6

No

vbNo

7

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

Листинг 38

Private Sub tstMsgBox()

Dim thePrompt As String, theTitle As String Dim theButtons As Long, theAnswer As Long Dim thePath As String

theTitle = "Открытие исходного файла"

thePrompt = "Исходный файл не найден" + vbLf + _ "Изменить путь к исходному файлу?"

theButtons = vbYesNo + vbQuestion

theAnswer = MsgBox(thePrompt, theButtons, theTitle) Select Case theAnswer

Case vbYes

thePath = InputBox("Введите путь к исходному файлу", _ theTitle, "D:\InputFiles\")

'Какие-то действия

'Какие-то действия

'Какие-то действия

End Sub

Рабочее задание. Создать и опробовать программы, использующие функции VBA InputBox и MsgBox и метод Excel

InputBox

Выполнение

Р1. Добавьте новый модуль в Ваш проект, дайте ему имя “Boxes”.

Р2. Проанализируйте листинги 35 и 36 и составьте программу, использующую функции VBA InputBox и MsgBox.

Р3. Наберите и выполните в пошаговом режиме подготовленную программу, внимательно проследите за действиями в программе.

Стеценко А. А.

75

Р4. Проанализируйте программу "МестоВывода" (листинг 37). Наберите и испытайте программу "МестоВывода". Оцените возможность ввода диапазона в программу.

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

Покажите результат преподавателю. Сохраните и закройте книгу. скопируйте книгу на личный носитель.

Контрольные вопросы

К1. Объясните назначение функции VBA InputBox.

К2. Объясните, как можно применить функцию InputBox в программе VBA. Приведите примеры.

К3. Объясните назначение метода Excel InputBox. Почему название "метод" а не функция?

К4. Объясните возвращаемое значение функции VBA InputBox. К5. Объясните возвращаемое значение метода Excel InputBox. К6. Объясните назначение функции VBA MsgBox.

К7. Сколько кнопок может быть в окне MsgBox?

К8. Что является возвращаемым значением функции MsgBox?

К9. Как программа может узнать, по какой кнопке щёлкнул пользователь в окне MsgBox? Приведите примеры.

К10. Диалоговое окно функции MsgBox может быть модальным уровня приложения и уровня системы. Объясните эти понятия.

Работа VBA13. Восточный календарь

Цель работы: закрепление навыков программирования циклов, диалоговых окон InputBox и MsgBox, интерфейса с программой.

Введение

Восточный солнечно-юпитерный календарь строится из 60-летних циклов. В один такой цикл входят пять 12-летних циклов Юпитера и два 30-летних цикла Сатурна. Внутри юпитерного цикла присваивается имя выбранного животного. 30-летние циклы состоят из трёх 10летних циклов цветов (стихий), которых всего 5 и каждый цвет назначается на 2 года.

Программа должна по заданному году по григорианскому календарю определить номер года в 12-летнем цикле и номер цвета в 10-летнем цикле.

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

76

Программирование в среде электронных таблиц Microsoft Excel

знаком \) и операция Mod, вычисляющая остаток от деления. Рассмотрим следующую небольшую программу (листинг 39)

Листинг 39

Private

Sub tstDivide()

 

Dim

p As Integer, q As Integer, r As Integer

Dim

s As Integer, t As Integer

p =

13

 

q =

7

 

r =

p / q

 

s =

p \ q

 

t =

p Mod q

 

Debug.Print "r = "; r, "s = "; s, "t = "; t

End Sub

 

 

 

Программа выдаёт в окно Immediate следующее:

r = 2

s = 1

t = 6

Для вычисления переменных r и s применяются разные операции деления, которые в данном случае дают разные результаты. Отличие на 1 в индексе может дать совершенно другой результат, поэтому ещё раз отметим, что операциях с индексами должна применяться арифметика целых чисел.

Индексы массивов в VBA по умолчанию отсчитываются от 0. Индексы членов коллекций отсчитываются от 1, и программист не может изменить это положение. Что же касается индексов массивов, то программисту даётся полная свобода назначать свои границы индексов. Во-первых, в пределах модуля можно назначить нижнюю границу равной 1 с помощью директивы Option Base 1. Директива должна располагаться в начале модуля. Во-вторых, при объявлении массива программист может явно указать границы индексов для каждого массива, например:

Dim Arr1(-7 to 17), Arr2(5 to 48)

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

Будем считать нижние значения индексов равными 0.

Для хранения названий животных нужен массив. Дадим ему имя TheAnimals. Для инициализации элементов массива в VBA имеется функция Array. Она уже использовалась в программе UserForm_Initialize (листинг 28) для составления списка туров. Названия животных будем давать в родительном падеже, чтобы можно было строить фразы "год тигра", "год дракона" и т.д. Соответствующие программные тексты будут следующие:

Dim TheAnimals

'Массив должен имеет

тип

Variant

TheAnimals = Array("мыши", "коровы", "тигра",

"зайца", _

"дракона", "змеи", "лошади",

"барана", _

 

 

 

 

Стеценко А. А.

77

"обезьяны", "курицы", "собаки", "свиньи")

Преобразуем календарный год по григорианскому календарю в индекс массива TheAnimals. Пусть год YBase начинает очередной 60-летний цикл (году YBase соответствует индекс q = 0). Тогда для некоторого года YBirth получим

p

=

(YBirth – YBase) Mod 60 'Номер года в 60-летнем цикле

q

=

p \ 12

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

Для хранения корневой чисти названий цветов (или стихий) организуем массив ЦветКорень (необходимо считаться с нормами языка). Всего цветов 5, но они занимают 10-летний цикл (один цвет имеет место два года подряд). Индекс r в массиве ЦветКорень определяется аналогично индексу q, но уменьшается вдвое:

r = (p \ 10) \ 2

Массив ЦветКорень:

ЦветКорень = Array("сине", "красно", "желто", "бело", _ "черно")

К корню нужно добавить окончание родительного падежа, которое зависит от рода слова животного. Для этого подходит инструкция Select Case. Чтобы не напутать, составим таблицу слов:

 

 

 

Таблица 8

 

Тектовые значения для массивов формирования названий

Индекс q

Значение в TheAnimals

Корень в массиве ЦветКорень

Окончание

 

0

мыши

сине

й

 

1

коровы

сине

й

 

2

тигра

красно

го

 

3

зайца

красно

го

 

4

дракона

желто

го

 

5

змеи

желто

й

 

6

лошади

бело

й

 

7

барана

бело

го

 

8

обезьяны

черно

й

 

9

курицы

черно

й

 

10

собаки

сине

й

 

11

свиньи

сине

й

 

Инструкция Select Case примет вид:

Select Case q

Case 0, 1, 5, 6, 8 To 11

Окончание = "й"

Case 2 To 4, 7

Окончание = "го"

End Select

78

Программирование в среде электронных таблиц Microsoft Excel

Оформим все действия в подпрограмме Восток60. Исходным для неё является аргумент – год YBirth, результатом Result является строка вида "синей мыши" или "красного тигра". С заголовком всё ясно:

Sub Восток60(YBirth As Integer, Result As String)

Объявления локальных переменных сведём в один раздел:

Dim p As Integer, q As Integer, r As Integer

Dim TheAnimals, ЦветКорень

Dim Окончание As String

Константы расчёта снабдим именами и разместим в разделе констант:

Const YBase = 1024, Цикл60 = 60, Цикл12 = 12, Цикл10 = 10

В расчётные инструкции вставим именованные константы:

p = (YBirth – YBase) Mod Цикл60

q= p \ Цикл12

r= (p \ Цикл10) \ 2

Формируем результат:

Result = "год " & ЦветКорень(r) & Окончание & _ " " & TheAnimals(q)

Осталось добавить концевую строку End Sub и вводный комментарий. Подпрограмма готова.

В главной программе предусмотрим следующие действия:

а) ввод имени и года рождения с помощью функции InputBox;

б) определение квалификаторов года по восточному календарю с помощью подпрограммы Восток60;

в) формирование и вывод с помощью функции MsgBox строки результата. С первой частью проблем не видно:

Dim Имя As String, Год As Integer

Имя = InputBox("Введите Ваши имя и фамилию", _ "Ввод имени", "Илья Муромец")

Год = InputBox("Введите год Вашего рождения", _ " Ввод года рождения", "1148")

Вторая часть – это обращение к функции Восток60:

Dim Восток As String

Call Восток60(Год, Восток)

или так, без Call:

Восток60 Год, Восток

Третья часть – это обращение к функции MsgBox, но сначала нужно сформировать строку сообщения:

Dim Вывод As String

Вывод = Имя + "!" + vbLf + "Вы родились в " + Восток MsgBox Вывод, vbInformation, "Восточный календарь"

Стеценко А. А.

79

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

Рабочее задание

Р1. Проработайте введение к настоящей работе и подготовьте полный текст подпрограммы "Восток60" (можете дать подпрограмме другое имя).

Р2. Откройте свою книгу, в среде VBA вставьте модуль, дайте ему подходящее имя, например, "ВосточныйКалендарь", и наберите в нём подпрограмму "Восток60".

Р3. Проверьте подпрограмму "Восток60" на синтаксические ошибки (команда

Debug | Compile VBAProject).

Р4. По образцу программы "tstMsgBox" (листинг 38) подготовьте главную программу для испытания подпрограммы "Восток60". Согласуйте текст программы с преподавателем.

Р5. Проведите испытание подготовленного программного комплекса. Покажите результат преподавателю.

Р6. Установите на рабочий лист кнопку для запуска подпрограммы "Восток60" (см. работу VBA11). Для этого выберите рабочий лист, дайте ему подходящее имя, например, "ВосточныйКалендарь", разместите на нём командную кнопку. Свойству Caption дайте значение "Восточный календарь", свойство AutoSize установите значение True.

Р7. Двойным щелчком по кнопке перейдите в среду VBA и скопируйте в программу CommandButton1_Click программу, подготовленную в п. Р4.

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

Сохраните и закройте книгу, скопируйте её на личный носитель.

Контрольные вопросы к работе VBA13

К1. Объясните, как объявляются массивы в программе VBA. К2. Для чего служит директива Option Base 1?

К3. Объясните инструкцию

Dim Arg(1024) As Long

К4. Объясните инструкцию

p = (YBirth – YBase) Mod 60

К5. Объясните инструкцию

Вq = p \ 12

К6. Объясните арифметические операции в программе tstDivide (листинг 39). К7. Объясните назначение инструкции Select Case… в подпрограмме "Во-

сток60".

К8. Объясните назначение функции Array в подпрограмме "Восток60".

80

Программирование в среде электронных таблиц Microsoft Excel

К9. Объясните, как в подпрограмме "Восток60" по значению аргумента Год определяется индекс в массиве TheAnimals.

К10. Объясните, как в подпрограмме "Восток60"по значению аргумента Год определяется цвет.

К11. Объясните обращения к функции InputBox в программе, подготовленной в п. Р4.

К12. Объясните, как установить на рабочий лист кнопку для запуска подпрограммы "Восток60".

К13. Объясните, как строится в программе, подготовленной в п. Р4, текст сообщения.

К14. Объясните назначение операции Mod в подпрограмме "Восток60".

Работа VBA14. Разработка функции рабочего листа

Цель работы: освоение приёмов разработки функции пользователя для использования функциях рабочего листа.

Введение

Функция VBA видима Мастером функций и доступна в формулах рабочего листа, если она

размещается в модуле общего назначения;

объявлена ключевым словом Function;

не содержит квалификатор Private;

не имеет аргументов, которые не могут быть размещены в ячейках рабочего листа;

возвращает единственное значение;

не имеет побочных эффектов.

Более правильно следовало бы сказать, что функция должна быть объявлена с квалификатором Public, но Public принимается по умолчанию, поэтому следующие два объявления функции равнозначны:

Function Pqr(X As Long) As Currency

Public Function Pqr(X As Long) As Currency

Функция может иметь произвольное число аргументов, но все аргументы должны размещаться в ячейках рабочего листа. Это условие очевидно: если аргумент функции не может находиться в ячейке, то, во-первых, где его искать, а, во-вторых, для чего на рабочем листе нужна функция, которая вычисляет нéчто, не связанное с ячейками рабочего листа.

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

В листинге 40 даётся пример описания функции, которую можно применять в формулах рабочего листа.

Соседние файлы в папке VBA (Стеценко)
  • #
    15.09.201752.92 Кб19SergeevA.xlsm
  • #
    15.09.20171.87 Mб46VBA_ЛБ_13v2.pdf
  • #
    15.09.2017799 б16ВосГазСорт.dat
  • #
    15.09.2017799 б16ВоспламГаз.dat
  • #
    15.09.201724.18 Кб18ВосплГаз.xlsm