Вы находитесь на странице: 1из 52

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ

РОССИЙСКОЙ ФЕДЕРАЦИИ

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


высшего профессионального образования
«КАЗАНСКИЙ ГОСУДАРСТВЕННЫЙ
ЭНЕРГЕТИЧЕСКИЙ УНИВЕРСИТЕТ»

Н.К. ПЕТРОВА, Л.Р. БЕЛЯЕВА

ПРОГРАММИРОВАНИЕ НА VBA
В ПРИМЕРАХ И ЗАДАЧАХ
ЧАСТЬ II. РАБОТА С СИМВОЛЬНЫМИ
ДАННЫМИ И МАССИВАМИ
Практикум

Казань 2011
2

УДК 681.3
ББК 32.973
П30
Рецензенты:
кандидат физико-математических наук, доцент
Казанского государственного
энергетического университета Т.Р.Абдульмянов;
кандидат педогогических наук, доцент Казанского государственного
энергетического университета С.М. Куценко

П30 Петрова Н.К., Беляева Л.Р.


Программирование на VBA. Часть II. Работа с символьными пере-
менными и массивами. Практикум / Н.К. Петрова, Л.Р. Беляева. – Ка-
зань: Казан. гос. энерг. ун-т, 2011. – 50 с.
Предлагается своего рода «Задачник» по программированию,
ориентированный на обучение студентов основам алгоритмизации математических и
инженерных задач средствами языка VBA в приложении к Excel.
Содержание второй части охватывает разделы программы, посвященные
работе с символьными переменными и массивами. Изложение материала оформлено
в виде отдельных разделов, в которых кратко представлены основные теоретические
сведения.
Типовые задачи даются с подробными решениями. Имеется большое
количество задач для самостоятельной работы. Наряду с типовыми задачами,
практикум содержит большое количество задач повышенной сложности. Задания
делятся на 2 типа: 1 – умение «читать» готовые программы, 2 – разрабатывать
программы по шаблонному алгоритму и программы с неявным алгоритмом.
Практикум предназначен для студентов всех специальностей КГЭУ,
изучающих «Информатику», «Информационные технологии».

УДК 681.3
ББК 32.973

© Казанский государственный энергетический университет, 2011


3

“Года работы над искусственным интеллектом достаточно,


чтобы заставить поверить в Бога.”
Перлис Алан

Предисловие

В учебной литературе имеется не так много пособий по практической


работе на языке VBA (Visual Basic for Application), ориентированных на
решение математических, инженерных задач. Данный практикум разработан
с целью восполнить существующий пробел. Он предназначен для обучения –
самостоятельно или под руководством преподавателя – основам
алгоритмизации с использованием языка VBA в приложении к одному из
самых популярных приложений MS Office – MS Excel.
Во второй части практикума включены типовые задачи и даются
методы и примеры их решения. Каждому разделу предшествует краткое
теоретическое введение, состоящее из определений и описания операторов
языка. Достаточно большое количество примеров демонстрируют разные
возможности работы с символьными и индексированными переменными.
Задачи основаны на полученных в первой части практикума знаниях по
работе с ячейками рабочего листа Excel, с диалоговыми окнами ввода и
вывода.
Многие задачи на «чтение программ» снабжены ответами.
В тексте практикума приняты такие соглашения:
1. Элементы языка VBA в текстовой части практикума выделены
таким стилем.
2. Курсивом выделены новые термины, имена переменных в текстовой
части практикума, в комментариях к операторам программ. “Таким 
шрифтом” записаны значения для ввода или вывода данных.
3. Тексты программ приводятся, как правило, копией листа модуля.
4. При описании структуры операторов [необязательные
операнды] взяты в квадратные скобки, альтернативные параметры – Yes |
No – написаны через вертикальную черту.
5. В тексте используются следующие сокращения:
ОП – оперативная память; ПК – компьютер; п/п – программа-процедура;
п/ф – программа-функция.
При подготовке данного практикума авторы использовали
многолетний опыт работы по преподаванию курса информатики в Казанском
государственном энергетическом университете и Казанском федеральном
университете.
4

I. ОБРАБОТКА СИМВОЛЬНЫХ ПЕРЕМЕННЫХ

1. Средства VBA для работы с символьными


переменными

1.1. Символьные переменные, строковые функции

Компьютер работает не только с числами, но и с символами. Последо-


вательность символов, используемых программе, называется строкой. Сим-
вольные или строковые константы представляют собой набор произвольных
символов, принадлежащих языку Basic. Строковые константы на VBA поме-
щаются в кавычки, например “Луна” или “X=12”.  Для описания строковых
переменных используется опция String или постфикс $. В табл. 1 показаны па-
раметры двух разновидностей опции String.

Таблица 1
Строковые типы данных

От 0 до
10 байт + 1 байт
Текстовая информация приблизительно
String на каждый
(строка) переменной длины 2 миллиардов
символ
символов
От 1 до
Строка постоянной длины
String*n Длина строки приблизительно
в n символов
65 400

В VBA предусмотрен специальный набор средств, чтобы можно было


выполнять разнообразные операции со строками.
Объединение строк (конкатенация) выполняется с помощью опера-
тора & (можно также использовать +). При объединении двух строк вторая
помещается в конец первой, например, в результате команды “пример “ &
“№1” получим строку “пример №1”, а по команде
“25” & “693” получим строку “25693”..
Кроме указанного оператора, в VBA используется большое количество
встроенных строковых функций. Рассмотрим некоторые из них.
Функция Len( ) используется для определения длины строки. Общий
вид команды:
n% = Len(строка).
Например, функция Len(“файл”) возвращает число 4.
5

Функция Instr([номер позиции], строка, подстрока) – осуществляет


поиск подстроки в строке, начиная с символа, указанного [номером пози-
ции]. Если [номером позиции] не указан, то поиск осуществляется с 1-го
символа. Например:

В приведенном примере сочетание “форма” встретилось в слове “Ин‐


форматика”, начиная с позиции номер 3.
Функции UCase( ) и LCase( ) используются, чтобы изменить регистр
символов заданной строки на верхний или нижний соответственно. Напри-
мер:
a$ = “Информатика“ : b$ = Ucase(a$) : c$ = LCase(a$).
В результате переменная b$ = “ИНФОРМАТИКА”, а
c$ = “информатика“.
Функции Left( ), Right( ) и Mid( ) используются для выделения части
строки. Общий вид команд Left или Right:
Новая строка = Left | Right (Исходная строка, число символов).
Например, в результате команды Left(“самолет”, 3) получим строку «сам», а
по команде Right (“пароход”, 3) получим строку «ход».
Функция Mid( ) является более универсальной и часто заменяет собой
Left( ) и Right( ). Общий вид команды:
Новая строка = Mid (Исходная строка, начальная позиция, [число симво-
лов]).
Например, в результате команды Mid (“информатика”, 3, 5) получим
строку «форма». Если необязательный параметр [число символов] опущен,
то выделяются символы, начиная с с начальной позиции до конца строки, на-
пример, по команде Mid (“подберезовик”, 4) получим строку «березовик». Ес-
ли начальная позиция указана равной нулю или больше длины строки, то ре-
зультатом выполнения функции будет пустая строка. Например, если строка
программы содержит операторы:
a$ = Mid (“процессор”, 10, 2): b$ = Mid (“процессор”, 0, 3),
то результатом их выполнения будет значение ”” (пусто) для обеих перемен-
ных a$ и b$.
6

Функции LTrim ( ), RTrim ( ) и Trim ( ) отсекают пробелы с начала, конца


или с обеих сторон строки соответственно.
В VBA используются также встроенные функции преобразования ти-
пов данных.
Функция SPACE (n) – формирует строку из n пробелов.
Функция STRING (n, строка_символов) – формирует строку из n оди-
наковых символов, равных первому символу в строке_символов:

1.2. Функции преобразования типов данных и прочие полезные функции

Функция Str( ) преобразует число в строку текста. Если число положи-


тельное, то первым символом в полученной строке будет пробел. Общий вид
команды:
Строка = Str(число)
Например, в результате команды Str(895) получим строку « 895», а по коман-
де Str (-5678) получим строку «‐5678».
Функция Val( ) преобразует строку, содержащую цифры, в число, по-
следовательно считывая символы строки, пока не встретится нецифровой
знак. Общий вид команды:
Number$ = Str (Строка)
Например, в результате команды Val(“45Т89”) получим число 45, а по
команде Val (“К593”) получим число 0.
Функция Date возвращает текущую дату компьютера в формате
“дд.мм.гггг” значением типа Variant.
7

Функция Chr( ) преобразует ASCII-код символа в соответствующий


символ. Например, в результате команды Chr(72) получим символ H, а по ко-
манде Chr (65) получим символ А. Одним из распространенных символов при
формировании строк является Chr (13) – переход к началу новой строки:

   

Функция Asc ( ) выполняет обратную задачу: преобразует символ в


соответствующий ему ASCII-код. Например, в результате команды Asc(“0”)
получим код 48, а по команде Asc (”a“)  получим код 97.

2. Пример решения типовых задач и задачи для


самостоятельного решения

2.1. Пример решения типовых задач

На листе Excel вызвана определенная пользователем функция text, фак-


тические параметры которой указаны в приведенной ниже палитре функции.
Какой результат появится на листе?

Решение:
1. Сопоставляем формальные (a$, b$) и фактические параметры:
8

a$ = "Kazan Power Engineering University"


b$ = "U"
2. nl равно числу символов в строке a$ – считаем, получается nl = 34.
3. Открываем цикл по i:
Проверяем i = 1 < nl?, Да! Следовательно, приступаем к выполнению функ-
ции Instr: начиная с первой позиции, просматривается строка a$ и в ней ищет-
ся позиция, на которой стоит заглавная U – это позиция № 25. Значит k = 25.
4. k не равно нулю, следовательно переходим на оператор с меткой 20,
досрочно покидая цикл For … Next.
5. Рассчитываем величину nl – k + 1 = 34 – 25 + 1 = 10.
6. Берем 10 правых символов из строки a$, получаем строку
“University”. 
Заканчиваем программу.
Ответ: На листе Excel появится слово “University”. 

2.2. Задания для самостоятельного чтения программ

Задание 1. Какое сообщение появится после выполнения предложенной


программы?
Текст программы:

Задание 2. Какие данные появятся на листе Excel при вызове пользова-


тельской функции test2, фактические параметры которой указаны на палитре
функции?
9

Задание 3. На компьютере установлена дата 12 июля 2010 г. Какое со-


общение появится после выполнения предложенной программы?
Текст программы:

Задание 4. Какие данные появятся на листе Excel при вызове пользова-


тельской функции test4 при вводе данных, показанных на палитре функции?
Какое сообщение будет выведено оператором Msgbox? Как вы ответите на
вопрос программы?

Задание 5.Какое сообщение появится после выполнения предложенной


программы?
Текст программы:
10

Задание 6. Какой результат будет показан в окне сообщения програм-


мы? Как вы ответите на вопрос программы?
Текст программы:

Задание 7. В ячейке А2 листа вызвана функция test7 с указанными фак-


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

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


test8, если в диалоговом окне ввода ввести слово “SALUTE!”?
Текст программы:
11

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


test9, если в диалоговом окне ввода ввести фразу “Когда  компьютеры  были 
большими ‐ программы были маленькими.”?
Текст программы:

Задание 10. Какой результат будет показан в окне сообщения програм-


мы test9, если в диалоговом окне ввода ввести фразу “Капля никотина убива‐
ет лошадь, а чашка кофе ‐ клавиатуру ”?
Текст программы:
12

2.3. Задания на разработку программ с неявно заданным алгоритмом

1. В заданном тексте удалить часть текста, заключенную в скобки (вме-


сте со скобками).
2. В тексте убрать лишние пробелы между словами, оставив по одному.
3. Напечатать самое длинное слово из текста.
4. Определить, какой процент слов в тексте содержит удвоенную со-
гласную.
5. В данном предложении определите слова, которые начинаются с за-
данной буквы.
7. Ввести фразу «Thy Kingdom come! Thy Will be done in Earth as it is in
Heaven!» Сколько букв "e" в фразе стоит на четных местах?
8. Даны два слова. Поменяйте местами буквы этих слов, занимающие
одинаковые позиции.
9. Составьте программу шифрования текстового сообщения. Можно
использовать такой способ шифрования: шифровальщик задает ключ шиф-
ровки – целое число, которое определяет величину смещения букв русского
алфавита, например ключ = 3, тогда в тексте буква "а" заменяется на "г" и т.д.
Используются все буквы русского алфавита.
10. Составьте программу дешифрования текстового сообщения, за-
шифрованного программой из задачи 9.
11. Даны две символьные строки А и В. Определите, в какой из них
больше символов и на сколько.
12. Найдите первую и последнюю букву «К» во введенном тексте и
символы между ними замените звездочками.
13. Дана строка символов. Дано слово. Удалить из строки это слово.
13

14. Составить программу-функцию, которая определяет счастливое или


не счастливое число и выводит соответствующее сообщение. Число считает-
ся «счастливым», если сумма цифр первой половины числа равна сумме
цифр второй половины, при этом количество цифр в числе четное. Число
вводится через формальный параметр.
15. Ввести произвольную символьную фразу (через диалоговое окно,
или формальный параметр). Вывести номер позиции, в которой первый раз
встречается буква «Б», и остаток фразы, которая начинается со следующей
после «Б» буквы. Если такой буквы нет, то выдать об этом сообщение.
16. Ввести в программу любое (больше двухзначного) число. Найти
среднее арифметическое его цифр.
17. Подсчитать среднее геометрическое цифр числа 243516. Указание:
среднее геометрическое равно корню n-й степени из произведения n цифр.
18. Составить программу-функцию, которая удаляет среднюю букву
строки с нечетным числом символов.
19. Ввести произвольную символьную фразу. Разделить все слова зна-
ком «*».
20. Разработать программу, которая давала бы в окне сооб-
щения следующую фигуру (знак «*» вытесняется знаком подчер-
кивания «_»).
14

II. ОБЩИЕ ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ ПО РАБОТЕ С


МАССИВАМИ НА VBA

1. Понятие массив и индексированные переменные

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


одного типа, обращение к которым осуществляется при помощи имени и ин-
декса (т.е. порядкового номера элемента).
Ниже представлены примеры данных, которые могут быть описаны
массивами.
В математике принято компоненты вектора или элементы определите-
лей или матриц обозначать одной переменной, к которой приписывается
справа один или два, или несколько индексов:
a 11 a 12 L a 1n
r ⎧⎪ 1 ⎫⎪
x
x = ⎨x 2 ⎬ a = a 21 a 21 L a 21
⎪⎩ x 3 ⎪⎭ L L L L
a m1 a m2 a mn
Предусматривать свое имя для каждой компоненты неудобно: для про-
ведения однотипных операций, даже над тремя переменными, потребуется
несколько раз повторить один и тот же оператор, например, оператор ввода.
Массивами удобно описывать однородную информацию, которая со-
держит большое количество однотипных данных. Например, каждый студент
в группе обладает рядом параметров: ФИО, год рождения, оценки за экзаме-
ны и т.д. Каждый параметр будет описан своим именем, но их количество
будет равно количеству студентов в группе, а связь с носителем информации
будет зафиксирована порядковым номером или индексом. При программиро-
вании на VBA этот индекс записывается после идентификатора в скобках,
например: F(1) – фамилия первого студента; a(i) – дата рождения i-го студен-
та; b(1, 3) – оценка первого студента по третьему экзамену. Очевидно, что
индексы могут быть как числовыми константами, так и числовыми перемен-
ными, в том числе числовыми арифметическими выражениями: d(k, l); c(i + 2,
j – 3).
Количество индексов у перемененной определяет размерность масси-
ва, а общее число элементов в массиве – размер. В Basic предусмотрена воз-
можность образования одномерных и двумерных массивов. На VBA возмож-
ны многомерные массивы до 32 измерений. Наиболее распространенными в
обычной практике являются массивы до трех измерений (Рис. 1).
15

Одномерный массив - ячейки линии

Двумерный массив – ячейки плоскость

Трехмерный массив – ячейки объемной фигуры с тремя измерениями


Рис. 1. Массивы разной размерности

Таким образом, массив представляет собой набор значений, логически


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

2. Создание массивов на VBA

У каждого массива определены нижняя и верхняя границы, в пределах


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

массива, равен произведению байтов, выделяемых на хранение одной


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

2.1. Статические массивы

Представьте себе, что вы являетесь старостой студенческой группы и


хотели бы хранить фамилии всех 25 студентов этой группы. Для этого можно
просто определить и использовать 25 различных переменных типа String. Но
все языки программирования высокого уровня предлагают лучшее решение –
массивы (arrays). Вместо объявления 25 различных переменных (типа namel,
name2, name3, пате4,...) можно просто объявить один массив, содержащий
25 однотипных элементов. Для объявления массива используется оператор
Dim с указанием в круглых скобках после имени массива его максимального
индекса:
Dim aName (25) As String.
В этом случае элементы переменной aName различают не по имени, а по ин-
дексу:
aName (4) = "Иванов" ‘ студенту с номером 7 присвоена фамилия Иванов.
Область определения статических массивов задется следующим обра-
зом: массивы, определенные локально внутри процедуры, становятся недос-
тупны для других процедур, для преодоления этого ограничения статический
массив необходимо определять только глобально на уровне модуля:
[Static | Public | Dim] Имя_переменной (Верхняя_граница).
При использовании массивов не следует забывать, что в VBA индекси-
рование всегда начинается с нуля, т.е. индекс 0 обозначает первый элемент
массива, индекс 1 – второй и т.д.
Оператор Option Base позволяет задать индексацию массива с 1:
Option Base 1.
Этот оператор должен находиться в области (General) (Declarations) формы,
модуля или класса. Допустимыми значениями для Option Base являются толь-
ко 0 и 1. Этот оператор служит для того, чтобы обеспечить совместимость
VBA с другими диалектами Basic, индексация в которых начинается с 1.
17

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


синтаксис:
[Static I Public I Dim] Имя_переменнои ([Нижн_предел То] Верхн_предел).
Указанием верхней и нижней границ можно задать любые диапазоны индек-
са. Это удобно, если индекс несет также определенную смысловую нагрузку
(дата, номер заказа, возраст и т.п.):
Dim aBirthDate (1980 То 2050).
При объявлении многомерного массива верхние границы каждой раз-
мерности разделяются запятыми:
Dim aName(10, 25) As String.
Массив с именем aName может содержать 286 различных значений (11 × 26 =
286).
Private Sub Comandl_Click ( )
aName (1, 3) = "X"
End Sub
Размерность массива может быть и больше. Например, вы составляете
список учащихся пяти различных курсов, на каждом из которых по десять
групп, а в каждой группе максимум 25 студентов. В этом случае можно ис-
пользовать трехмерный массив, где первое измерение относится к курсу,
второе – к группе, а третье – к номеру студента:
Dim aStudent (1 To 5, 1 To 10, 1 To 25)
аStudent (3, 5,17) = "Иванов".
Студент 3-го курса, 5-й группы с номером 17 имеет фамилию Иванов.
Для отдельных значений размеров могут указываться как диапазоны
индексов, так и только верхняя граница:
Dim aArrayCI( 80 То 120, 40 То 45, 256, 1997 То 2050) As Byte.
В данном примере создан четырехмерный массив, для которого
используются два способа указания диапазонов. Размер полученного массива
вычисляется как (120 – 79) ×(45 – 39) × 257 × (2050 – 1996) = 3413988
элемента. Объем памяти, занимаемой этим массивом, при условии, что
каждый элемент занимает один байт, будет ∼3333 Кбт.

2.2. Динамические массивы

Достаточно часто при объявлении массива его размер не известен. В


этом случае следует объявлять динамический массив, что позволяет изменять
его размер или размерность во время выполнения приложения.
Динамический массив создается в два этапа. Сначала массив опреде-
ляют без указания размера, например:
18

Dim aArray ( ) As Variant.


Затем с помощью оператора ReDim устанавливают фактический размер
массива:
Dim aArray ( ) As Variant
Private Sub Commandl_Click()
ReDim aArray (50, 10)
'Код программы
End Sub.
Синтаксис оператора ReDim:
ReDim (Preserve] Имя_переменной (Границы) [As Тип_данных].
В отличие от обычного Dim, оператор ReDim используется только в про-
цедурах. При этом тип данных указывать не обязательно, особенно если он
уже определен оператором Dim. Вы можете использовать оператор ReDim для
изменения числа элементов или размерности массива. Однако вы не можете
объявить массив с данными одного типа, а затем использовать ReDim для
приведения массива к другому типу, за исключением случая, если массив со-
держит переменные типа Variant.
Dim aArray ( ) As Real
Private Sub Commandl_Click()
ReDim aArray (50)
'Код
ReDim aArray (1 TO 20) ' допустимо
'Код
ReDim aArray (2 TO 5,3) ' допустимо
'Код
ReDim aArray (100) As Real ' допустимо
'Код
ReDim aArray (70) As Integer ' ошибка
End Sub
Таким образом, размерность массива можно при необходимости изме-
нить. Но тогда возникает опасность потерять его содержимое, так как после
изменения размерности элементам массива присваиваются значения по
умолчанию.
Однако VBA предоставляет возможность изменять размерность масси-
ва без потери содержимого. Для этого следует использовать ReDim вместе с
ключевым словом Preserve (предохранить):
19

Dim aArray ( ) As Variant


Private Sub Commandl_Click()
ReDim Preserve aArray (50, 15)
'Код
End Sub.
Использование с оператором ReDim зарезервированного слова Preserve
позволяет сохранить содержимое массива при изменении его размера или
размерности. Но следует учитывать, что для многомерных массивов можно
изменять только последнее измерение:
Dim aArray ( ) As Variant
Private Sub Cornmandl_Click( )
ReDim aArray (10, 10)
ReDim Preserve aArray (10, 15) 'допустимо
ReDim Preserve aArray (15, 15) 'ошибка
End Sub.
При изменении размерности можно также изменять верхнюю и ниж-
нюю границы индекса. Но если при этом используется ключевое слово
Preserve, то разрешено изменять только верхнюю границу:
Dim aArray ( ) As Variant
Private Sub Commandl_Click( )
ReDim aArray (10 To 20)
ReDim Preserve aArray (10 To 25). 'допустимо
ReDim Preserve aArray (15 To 25) 'ошибка
End Sub.

3. Область видимости массивов на VBA

Любая переменная или массив имеют свою область действия. Термин


область действия относится к области процедуры или модуля VBA, где дан-
ная переменная, процедура или другой идентификатор являются доступны-
ми.
Переменные, процедуры и идентификаторы, которые доступны только
в процедуре, имеют область действия процедурного уровня, а те, которые
доступны для всех процедур в модуле, имеют область действия модульного
уровня.
С помощью оператора Public массив объявляется глобальным, т.е. дос-
тупен для всех модулей проекта. Оператор Dim используется для объявления
массива на уровне процедуры, т.е. доступен только в той процедуре, где объ-
явлен:
20

Область в начале модуля перед любыми объявлениями процедур назы-


вают областью объявлений модуля, потому что именно туда следует поме-
щать объявления переменных модульного уровня и другие директивы VBA,
влияющие на весь модуль.
В первой строке, приведенного выше листинга, объявлен символьный
массив А ( ) модульного типа. Однако в процедуре example_02 имеется свое
объявление массива А ( ) как целочисленного. VBA выбирает наиболее ло-
кальный массив А( ), объявленный как массив процедурного уровня.
Переменные процедурного уровня часто называют локальными пере-
менными, потому что их объявления являются локальными для выполняемой
в данный момент процедуры. В данном контексте речь идет о локальных мас-
сивах.
Потенциально использование дубликатных имен несет в себе опреде-
ленную угрозу путаницы. На уровне модуля и его отдельных процедур про-
тиворечий между именами локальных и глобальных переменных не должно
быть (ведь модуль пишется одним человеком). Реально это может пригодить-
ся только для устранения возможных конфликтов между идентификаторами
переменных, определенных на уровне модуля (Private) и на уровне приложе-
ния (Public). Хотя для разрешения подобных конфликтов классические прин-
ципы языков программирования требуют описания глобальных переменных
21

не только в модулях, где они резервируются, но и в модулях, где они исполь-


зуются (в качестве входных точек). К сожалению, в VBА этого механизма
почему-то нет.
Если вы хотите всегда использовать только явное объявление перемен-
ных, то для таких целей VBA предоставляет команду Option Explicit. При ис-
пользовании Option Explicit VBA требует объявления всех переменных перед
их использованием:

В настройках редактора VBA можно указать, чтобы команда Option


Explicit автоматически включалась в новый модуль (рис. 2).

Рис. 2. Указание обязательного описания типа переменных в настройках редактора VBA


22

4. Функции VBA для работы с массивами

При работе с массивами бывает полезно применять соответствующие


функции. Рассмотрим наиболее часто используемые функции для работы с
массивами, их пять.
Array(список аргументов) позволяет автоматически создать массив
нужного размера и типа и сразу загрузить в него переданные значения.
Функция является удобным способом определения одномерных массивов,
преобразующая список аргументов, разделенных запятыми, в вектор из этих
значений, и присваивающая им тип Variant:

При формировании векторов День и N в задаче example_03 с помощью


функции Array индексация начинается c нуля. Об этом необходимо помнить!
IsArray(Имя переменной) возвращает True (истина), если переменная
содержит массив; в противном случае возвращается False (ложь). Функцию
IsArray используют для проверки значений переменных типа вариант,
содержащих массивы:

LBound(Имя_массива [, Размер]) и UBound(Имя_массива [, Размер])


возвращают минимальное и максимальное допустимые значения указанной
размерности. Размер – целое число (необязательный параметр) определяет
измерение массива, для которого надо получить верхний или нижний предел.
При отсутствии параметра Размер подразумевается значение 1:
23

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


или нижний предел. При отсутствии dimension возвращается предел для
первого измерения массива.

Оператор Erase СписокМассивов позволяет выполнять очистку для


статических массивов и удаление – для динамических.
Когда элементы массива заполнены, данные в массиве остаются до тех
пор, пока пользователь не присвоит новые значения элементам массива или
пока VBA не освободится от массива. Зачастую бывает, что в дальнейших
вычислениях динамический массив ни при каких обстоятельствах использо-
ваться не будет, поэтому нецелесообразно «держать» его в памяти компью-
тера, так как это может сказаться на скорости работы программы. Или же
может понадобиться очистить все значения в статическом массиве, устанав-
ливая числовые значения на 0, а строковые – на пустые строки. Это можно
осуществить при помощи вложенных циклов, но можно сделать гораздо
проще, используя оператор Erase:

Поведение оператора Erase для статических массивов зависит от кон-


кретного типа элементов массива (табл. 2):
24

Таблица 2
Значения элементов массива после действия оператора Erase

Тип статического
Действие оператора Erase
массива
Любой числовой Устанавливает элементы массива на 0
тип
Любой строковый Устанавливает элементы массива на строку нулевой
тип длины, а для строк фиксированной длины – как все
символы пробела
Тип Variant Устанавливает элементы массива на Empty
Тип Object Устанавливает элементы массива на Nothing
Любой Устанавливает каждую переменную в пользователь-
пользовательский ском типе индивидуально: численные – на 0;
тип строковые - на строки нулевой длины; Variant – Empty;
Object – Nothing

Оператор Erase удаляет из памяти динамические массивы, освобождая


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

5. Передача массивов в процедуры и функции

При программировании в VBA не очень часто приходится сталкиваться


с массивами. Вместо них в объектных моделях приложений Office обычно
используются коллекции. Коллекции – это специальные объекты, которые
предназначены для хранения наборов одинаковых элементов. Например, в
Excel – коллекции Workbooks (открытые книги) и Worksheets (листы в книге)
и т.п. Коллекции обычно удобнее, чем массивы: они изначально безразмерны
и в них предусмотрен стандартный набор свойств и методов (метод Add() для
добавления нового элемента, свойство Count для получения информации о
количестве элементов, метод Item() для получения ссылки на нужный
элемент). Тем не менее, в VBA предусмотрены все возможности,
25

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


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

5.1. Способы передачи параметров для обычных переменных

Для обычных (скалярных) переменных примером такой функции


может служить, в частности, простейшая функция сложения двух целых
чисел:

Вызов ее может выглядеть так:


MsgBox(nsum(3, 2)).
В данном случае мы объявили оба параметра как обязательные, и по-
этому попытка вызвать функцию без передачи ей какого-либо параметра (на-
пример, так: MsgBox (nsum(3))) приведет к ошибке "Argument not optional" –
"Параметр не является необязательным". Чтобы можно было пропускать ка-
кие-то параметры, эти параметры можно сделать необязательными. Для этой
цели используется ключевое слово Optional:
Function nsum (N1 As Integer, Optional N2 As Integer).
В справке по встроенным функциям VBA необязательные параметры
заключаются в квадратные скобки.
Для проверки того, был ли передан необязательный параметр, исполь-
зуется либо функция IsMissing (если для этого параметра был использован тип
Variant), либо его значение сравнивается со значениями переменных по умол-
чанию (ноль для числовых данных, пустая строка для строковых и т.п.)
Вызов функции с передачей параметров может выглядеть так:
nResult = nsum (3, 2).
Однако здесь есть несколько моментов, которые необходимо рассмот-
реть.
26

В нашем примере мы передаем параметры по позиции, т. е. значение 3


присваивается первому параметру (N), а значение 2 – второму (N2). Однако
параметры можно передавать и по имени:
nResult = nsum (N1 := 3, N2 := 2).
Обратите внимание, что, несмотря на то, что здесь выполняется вполне
привычная операция – присвоение значений, оператор присвоения использу-
ется не совсем обычный – двоеточие со знаком равенства, как, например, в
C++. При использовании знака равенства возникнет ошибка.
Конечно, вместо явной передачи значений (как у нас – 3 и 2) можно ис-
пользовать переменные. Однако что произойдет с переменными после того,
как они «побывают» в функции, если функция изменяет их значение? Оста-
нется ли это значение за пределами функции прежним или изменится?
Все зависит от того, как именно передаются параметры – по ссылке (по
умолчанию, можно также использовать ключевое слово ByRef или по значе-
нию – нужно использовать ключевое слово ByVal).
Если параметры передаются по ссылке, то фактически в вызываемую
процедуру передается ссылка на эту переменную в оперативной памяти. Если
эту переменную в вызываемой процедуре изменить, то значение изменится и
в вызывающей функции. Это – принятое в VBA поведение по умолчанию.
Если параметры передаются по значению, то фактически в оператив-
ной памяти создается копия этой переменной и эта копия передается вызы-
ваемой процедуре. Конечно же, чтобы вы не сделали с этой копией, на ис-
ходную переменную это никак не повлияет и в вызывающей процедуре не
отразится.
Продемонстрировать разницу можно на простом примере:
27

Если поменять строку объявления функции на следующую строку:


Function nsum(byVal nItem1 As Integer, nItem2 As Integer),
то сообщения по этой программе покажут, что значение переменной nP1 не
изменится:

5.2. Особенности передачи массивов

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


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

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


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

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

Функции LBound и UBound, используемые в программе fSum избавляют от


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

Эту процедуру можно вызывать несколько раз для разных массивов в


одной программе. Следующий пример демонстрирует такую возможность
для просмотра исходного массива СС и преобразованного массива DD.
Однако, поскольку в программе example_10 реализуется передача
размерностей через переменные, первая строка программы out_matrix должна
быть переписана следующим образом:
Sub out_matrix(A( ) As Integer, ByVal l1 As Byte, ByVal u1 As Byte, _
ByVal l2 As Byte, ByVal u2 As Byte, Optional nameA As String).

6. Примеры решения типовых задач и задачи для


самостоятельного решения

6.1. Примеры чтения программ обработке массивов

Пример 1. Прочесть программу и вычислить по ней результат. В диало-


говые окна вводятся следующие числа: 3, ‐6, 3, ‐2.
30

Текст программы:

Решение.
1. В программе описаны три целочисленных переменных n, i, j, строко-
вая переменная s и вещественная одинарной точности mes. Задан динамиче-
ский целочисленный массив А.
2. Согласно условию задачи через диалоговое окно вводится значение
переменной n = 3. Эта величина указывает реальный размер массива – 4 эле-
мента: A(0), A(1), A(2), A(3).
3. Открываем цикл по i:
i = 1. mes =”Ввести координату с номером 1” (поскольку для слияния стро-
ки используется знак «&», то автоматически числовое значение переменной
i конвертируется в строковое.
В диалоговом окне выдается сообщение mes и вводится A(1) = –6. По-
скольку массив описан как целочисленный, происходит автоматическая кон-
вертация текстового значения поля ввода в числовое.
Процедура повторяется для i = 2, i = 3, всякий раз выдавая соответст-
вующее сообщение: mes. А(2) =3, А(3) = –2.
4. В следующем цикле реализуется накопление суммы квадратов эле-
ментов массива: i = 1, sum = 36, i = 2, sum = 36 + 9 = 45;
i = 3, sum = 45 + 4 = 49.
5. Вычисляем modul = 49 = 7 .
6. В диалоговом окне формируется сообщение:
«Модуль заданного вектора = 7».
Данная программа предназначена для вычисления модуля n-мерного
вектора.
31

Пример 2. Разработать программу для создания матрицы размером


m × n.
Решение . Рассмотрим сначала способ создания матрицы с помощью
генератора случайных чисел. Напомним, что при задании оператора ReDim
A(n,m) в ОП создается область нумерованных ячеек, в которых хранятся зна-
чения по умолчанию: для числовых переменных – это нули, для символь-
ных– пустой символ “”, для вариантных – значение Empty (Пусто).
Операция задания массива должна быть выполнена обязательно в вы-
зывающей процедуре. В отличие от примера example_10, в данном варианте
перенесем из главной программы операторы, ответственные за присвоение
значений. Составим программу, которая будет заносить в заданные ячейки
целые числа от -50 до +50. Размерности массива ограничим числом 10.
После задания числовых значений выведем результат, используя про-
грамму out_matrix, текст которой представлен в п. 5.2, в окно сообщений.
Для вызова созданной процедуры создаем «главную» процедуру с име-
нем main_primer_02. Тексты обеих программ с соответствующими коммен-
тариями представлены ниже:
32

Еще раз посмотри, как происходит заполнение значениями элементов


массива:
i=1
j = 1 ⇒ A(1,1) = -20; j = 2 ⇒ A(1,2) = 45; … j = n ⇒ A(1,n) = -10;
j = n+1 ⇒ Выход из цикла по j
i=2
j = 1 ⇒ A(2,1) = -22; j = 2 ⇒ A(2,2) = -34; … j = n ⇒ A(2,n) = 15;
j = n+1 ⇒ Выход из цикла по j

i=m
j = 1 ⇒ A(m,1) = -42; j = 2 ⇒ A(m,2) = -4; … j = n ⇒ A(m,n) = -24;
j = n+1 ⇒ Выход из цикла по j
i = m+1 Выход из цикла по i.
Решение . Рассмотрим теперь способ чтения матрицы с листа Excel.
Такая ситуация встречается достаточно часто, когда предварительно данные
заносятся на внешний носитель памяти, в данном случае – лист Excel, либо
заранее, либо в результате работы какой-либо программы.
Напомним, что, к сожалению, нельзя создать массив в процедуре, а
затем передать его в любую вызывающую программу. Возможно только
обратное.
Допустим, что данные на листе расположены так, как показано на
рис. 3. В первой строке указано количество строк и столбцов матрицы целых
чисел.

Рис. 3. Образец листа данных для ввода в программу

Программа primer_03 реализует присвоение данных из ячеек листа


элементам массива. Формальные параметры программы включают адрес
ячейки, где находится первый элемент массива – nr (номер строки), nc (номер
33

столбца). В таких задачах всегда важно определить зависимость номера


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

Пример 3. Разработать программы для умножения двух сцепленных


матриц A(m × n) и B(n × l) и вывода матрицы любого размера на лист Excel в
заданное программистом место.
Решение. Прежде, чем писать программу primer_04, необходимо
понять алгоритм вычисления элементов матрицы-произведения С(m × l).
n
Этот алгоритм задается известной в алгебре формулой Cij = ∑ Aik Bkj .
k =1
Программа primer_05 построена аналогично primer_03: тот же принцип
адресации к ячейкам листа, только в операторе присваивания операнды
поменяны местами. Текст главной программы main_primer_04 и новых
вызываемых функций представлен ниже. Главная программа:
34

Программа для произведения матриц:

Программа для вывода матриц на лист Excel:

Результаты работы программы vain_primer_04:

Пример 4. Сформировать ведомость для выдачи стипендии. Исходные


данные: фамилии N студентов, отметки за m экзаменов – вводятся операто-
35

ром на лист Excel (рис. 4). Базовая стипендия 1000 руб. занесена в отдельную
ячейку.
Составить программу, которая находит средний балл студентов, коли-
чество неуспевающих студентов и количество отличников, фамилии студен-
тов, имеющих максимальный средний балл.
В программу необходимо ввести операторы для начисления каждому
студенту стипендии при отсутствии двоек. При среднем балле менее 3,5 вы-
деляется 50 % от базовой стипендии, не более 4,5 – базовая стипендия и вы-
ше 4,5 – на 50 % выше базовой. Найти общую сумму стипендий, выдаваемых
группе.

Рис. 4. Образец ведомости для обработки данных на начисление стипендий

Решение. Решение этой задачи сводится к шаблонным задачам по дву-


мерным массивам: поиск арифметического среднего, минимума или макси-
мума и т.д. Чтобы привести данную задачу к стандартным алгоритмам, рас-
смотрим, какого типа данные у нас должны быть введены в программу.
1. Список фамилий – это одномерный символьный динамический мас-
сив размером n. Дадим ему имя fio.
2. Матрица n×m для оценок всех n студентов по m предметам – тип
байт, так как оценки не превышают числа 5 и являются целыми величинами.
Пусть имя массива ball.
3. Массив средних баллов (sr_b) – одномерный, размером n, массив
одинарной (Single) точности.
4. Для ввода и вывода массивов и одномерных массивов – векторов –
используем процедуры, построенные на аналогичных программах, примеры
36

которых даны в предыдущем примере. Процедуры, названия которых закан-


чиваются на «_s» – предусмотрены для ввода/вывода символьных данных, на
«1» – для вывода данных на лист. Для быстрого просмотра используются
процедуры вывода в окно сообщений.
Фрагмента начала главной программы vedomost, реализующий указан-
ные действия, представлен ниже. Текст программы:

5. Количество отличников (n5) – это те студенты, у кого средний балл


равен пяти. Значит, для их нахождения необходимо использовать перебор
элементов массива sr_b и рассчитывать число элементов, у которых sr_b = 5.
6. Количество неуспевающих студентов (n2) – это те, у кого среди оце-
нок есть хотя бы одна двойка. Значит необходимо для каждого студента
(цикл по i до n) провести проверку его баллов студента (цикл по j до m): как
только встречается оценка 2, реализуeм выход из цикла по j, при этом увели-
чивая число n2 на единицу.
Продолжение программы, реализующей алгоритм пунктов 5 и 6:
37

7. Для нахождения максимального балла включаем стандартный алго-


ритм поиска максимума в одномерном массиве sr_b.
8. Для нахождения студентов, имеющих наивысший средний балл, ор-
ганизуем цикл по количеству студентов в массиве средних баллов. Если балл
студента равен высшему, то выводим его фамилию из массива fio в соответ-
ствующую строку. Текст программы:

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


числу студентов, в теле которого используем оператор Select Case по средне-
му баллу.
Текст завершающей части программы vedomost:
38

Результаты работы программы, выведенные в окна сообщения, пред-


ставлены по ходу текста программ, выведенные на лист Excel – представлены
на рис. 5.

Рис. 5. Образец ведомости после работы программы vedomost


39

6.2. Задания для самостоятельного чтения программ

Задание 1. В каком месте приведенного листа Excel и какие результаты


появятся после выполнения указанной программы?

Задание 2. В каком месте приведенного листа Excel и какие результаты


появятся после выполнения указанной программы?

Задание 3. Какие результаты и где на листе Excel будут выведены ре-


зультаты представленной программы?
Текст программы:
40

Задание 4. Как будет выглядеть окно сообщений в результате работы


представленной программы?
Текст программы:

Задание 5. На запрос диалогового окна введено число 17.Как будет вы-


глядеть окно сообщений в результате работы представленной программы?
Текст программы:
41

Задание 6 (повышенной сложности). Даны тексты главной программы


и вызываемой процедуры. Как будет выглядеть окно сообщений в результате
работы главной программы?
Текст программы: Текст вызываемой процедуры:

Задание 7. В каком месте приведенного листа Excel и какие результаты


появятся после выполнения указанной программы?

Задание 8. В каком месте приведенного листа Excel и какие результаты


появятся после выполнения указанной программы?
42

Задание 9. На листе Excel подготовлена таблица (рис. 6). Какую ин-


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

Текст программы:

Рис. 6. Ведомость на премию

Задание 10. Как будет выглядеть окно сообщений в результате работы


представленной программы?
Текст программы:
43

6.3. Задания по разработке программ для задач с одномерными


массивами

1. Дано целое число N (> 2). Сформировать и вывести целочисленный


массив размера N, содержащий N первых элементов последовательности чи-
сел Фибоначчи FК:
F1 = 1, F2 = 1, FК = FК-2+ FК-1, K = 3, 4, … .
2. Даны целые числа N (> 2), A и B. Сформировать и вывести
целочисленный массив размера N, первый элемент которого равен A, второй
равен B, а каждый последующий элемент равен сумме всех предыдущих.
3. Дан целочисленный массив размера N. Вывести все содержащиеся в
данном массиве нечетные числа в порядке возрастания их индексов, а так-же
их количество K.
4. Дан массив A размера N и целое число K (1 ≤ K ≤ N). Вывести
элементы массива с порядковыми номерами, кратными K: AК, A2K, A3K, … .
Условный оператор не использовать.
5. Дан целочисленный массив A размера 10. Вывести порядковый но-
мер последнего из тех его элементов AК, которые удовлетворяют двойному
неравенству A1 < AK < A10. Если таких элементов нет, то вывести 0.
6. Дан массив размера N и целые числа K и L (1 ≤ K ≤ L ≤ N). Найти
сумму элементов массива с номерами от K до L включительно.
7. Дан массив размера N и целые числа K и L (1 ≤ K ≤ L ≤ N). Найти
среднее арифметическое элементов массива с номерами от K до L
включительно.
44

8. Дан целочисленный массив размера N, не содержащий одинаковых


чисел. Проверить, образуют ли его элементы арифметическую прогрессию.
Если образуют, то вывести разность прогрессии, если нет – вывести 0.
9. Дан массив ненулевых целых чисел размера N. Проверить, образуют
ли его элементы геометрическую прогрессию. Если образуют, то вывести
знаменатель прогрессии, если нет – вывести 0.
10. Дано число R и массив A размера N. Найти элемент массива, кото-
рый наиболее близок к числу R (то есть такой элемент AК, для которого вели-
чина |AK – R| является минимальной).
11. Даны два массива A и B одинакового размера N. Сформировать но-
вый массив C того же размера, каждый элемент которого равен максималь-
ному из элементов массивов A и B с тем же индексом.
12. Дан массив A размера N. Сформировать новый массив B того же
размера по следующему правилу: элемент BК равен сумме элементов массива
A с номерами от 1 до K.
13. Дан массив A размера N. Сформировать новый массив B того же
размера по следующему правилу: элемент BК равен среднему арифметиче-
скому элементов массива A с номерами от K до N.
14. Дан целочисленный массив размера N. Увеличить все нечетные
числа, содержащиеся в массиве, на исходное значение последнего нечетного
числа. Если нечетные числа в массиве отсутствуют, то оставить массив без
изменений.
15. Дан массив размера N (N – четное число). Поменять местами его
первый элемент со вторым, третий – с четвертым и т.д.
16. Дан массив размера N. Обнулить элементы массива, расположенные
между его минимальным и максимальным элементами (не включая мини-
мальный и максимальный элементы).
17. Дан массив размера N. Осуществить циклический сдвиг элементов
массива вправо на одну позицию (при этом A1 перейдет в A2, A3 – в A4, …, AN –
в A1).
18. Дан массив размера N и целое число K (1 ≤ K ≤ N). Удалить из мас-
сива элемент с порядковым номером K.
19. Дан целочисленный массив размера N. Удалить из массива все не-
четные числа и вывести размер полученного массива и его содержимое.
20. Дан массив размера N. После каждого отрицательного элемента
массива вставить элемент с нулевым значением.
45

6.4. Задания по разработке программ для задач с двумерными массивами

1. Даны целые положительные числа M и N. Сформировать целочис-


ленную матрицу размера M × N, у которой все элементы I-й строки имеют
значение 10 · I (I = 1, …, M).
2. Дана матрица размера M × N и целое число K (1 ≤ K ≤ M). Вывести
элементы K-й строки данной матрицы.
3. Создать целочисленную матрицу размера M × N, элементы которой
могут принимать значения от 0 до 100. Различные столбцы матрицы назовем
похожими, если совпадают множества чисел, встречающихся в этих столб-
цах. Найти количество столбцов, похожих на последний столбец данной мат-
рицы.
4. Дана матрица размера M × N. Вывести ее элементы, расположенные
в строках с четными номерами (2, 4, …). Вывод элементов производить по
строкам, условный оператор не использовать.
5. Дана матрица размера M × N. Найти минимальный среди максималь-
ных элементов ее столбцов.
6. Дана матрица размера M × N. В каждом ее столбце найти количество
элементов, больших среднего арифметического всех элементов этого столб-
ца.
7. Дана матрица размера M × N и целые числа K1 и K2 (1 ≤ K1 < K2 ≤ M).
Поменять местами строки матрицы с номерами K1 и K2.
8. Дана матрица размера M × N (M – четное число). Поменять местами
верхнюю и нижнюю половины матрицы.
9. Дана матрица размера M × N и целое число K (1 ≤ K ≤ N). Удалить
столбец матрицы с номером K.
10. Дана матрица размера M × N и целое число K (1 ≤ K ≤ M). Перед
строкой матрицы с номером K вставить строку из нулей.
11. Дана матрица размера M × N. Продублировать строку матрицы, со-
держащую ее максимальный элемент.
12. Дана матрица размера M × N. Элемент матрицы называется ее ло-
кальным минимумом, если он меньше всех окружающих его элементов. За-
менить все локальные минимумы данной матрицы на нули. При решении до-
пускается использовать вспомогательную матрицу.
13. Дана матрица размера M × N. Упорядочить ее строки так, чтобы их
минимальные элементы образовывали убывающую последовательность.
14. Дана квадратная матрица A порядка M. Найти сумму элементов ее
главной диагонали, то есть диагонали, содержащей следующие элементы:
A , A , A , …, A .
1, 1 2, 2 3, 3 M, M
46

15. Дана квадратная матрица A порядка M. Найти среднее арифметиче-


ское элементов ее побочной диагонали, то есть диагонали, содержащей сле-
дующие элементы: A1, М, A2, М-1, A3, М-2,…, AМ, 1.
16. Дана квадратная матрица A порядка M. Найти сумму элементов ка-
ждой ее диагонали, параллельной главной (начиная с одноэлементной диаго-
нали A1, М).
17. Дана квадратная матрица порядка M. Обнулить элементы матрицы,
лежащие на главной диагонали и выше нее.
18. Дана квадратная матрица A порядка M. Зеркально отразить ее эле-
менты относительно главной диагонали (при этом элементы главной диаго-
нали останутся на прежнем месте, элемент A поменяется местами с A ,
1, 2 2, 1

элемент A –сA и т.д.). Вспомогательную матрицу не использовать.


1, 3 3, 1

19. Дана строка-предложение. Зашифровать ее, поместив вначале все


символы, расположенные на четных позициях строки, а затем, в обратном
порядке, все символы, расположенные на нечетных позициях (например,
строка «Программа» превратится в «ргамамроП»).
20. Дана строка-предложение на русском языке. Вывести самое корот-
кое слово в предложении. Если таких слов несколько, то вывести последнее
из них. Словом считать набор символов, не содержащий пробелов, знаков
препинания и ограниченный пробелами, знаками препинания или нача-
лом/концом строки.

6.5. Задания по разработке программ с неявно заданным алгоритмом


r r
1. Даны два n-мерных векторов x и y . Составить программу для
нахождения скалярного произведение этих векторов.
r r
2. Даны два n-мерных векторов x и y . Составить программу для
нахождения координат вектора-произведения этих векторов.
3. Дано множество А и множество B. Составить программу для
нахождения пересечения этих множеств.
4. Дано множество А и множество B. Составить программу для
нахождения разности этих множеств.
5. На плоскости задано n точек, координаты которых равны первым
натуральным числам, например: первая точка имеет координаты (1,1), вторая
(2,2), n-я точка имеет координаты (n, n) (рис. 7, а). Составить программу,
определяющую для нахождения пересечения этих множеств. Дополнить это
47

множество точками с целочисленными координатами, которые равномерно


заполнят плоскость (рис. 7, б).

а) б)

Рис. 7. Диаграммы построены вручную по координатам рассчитанных в программе точек

6. На рис. 8 показана кривая аналогового сигнала, рассчитанного по


формуле f (t ) = 7 sin(t / 3 + π / 7) , сетка от-
ражает моменты дискретизации (ось
абсцисс) и уровни квантования по ам-
плитуде (ось ординат). Записать циф-
ровой сигнал данной функции и найти
момент, соответствующей наибольше-
му значению сигнала.

Рис. 8. Аналоговый сигнал и сетка оцифровки

7. Разработать программу, для перевода числа, записанного в позици-


онной системе счисления с основанием q, в десятичную систему счисления.
8. Разработать программу, для перевода десятичного числа в позицион-
ную систему счисления с основанием q. Результат представить в виде сим-
вольной строки.
9. На листе Excel (рис. 9) записана таблица продажи процессоров по
месяцам. Составить программу, которая бы определяла среднегодовую про-
дажу каждого процессора, среднемесячную продажу по всем процессорам,
Общее количество процессоров, проданных за год. Все данные должны быть
выведены на лист с соответствующими подписями. Перед завершением, про-
грамма должна выдать список процессоров, пользующихся наивысшим спро-
сом по результатам года (наивысший спрос определяется в пределах 5 % от
максимальной продажи).
48

Рис. 9.

10. На листе Excel (рис. 10) представлена таблица социологического


опроса нескольких категорий населения по шкале от -10 до +10. В таблицу
внесены усредненные по каждой категории данные. Составить программу,
которая может: а) отсортировать данные по качеству здоровья; б) найти кате-
гории, имеющие высо-
кий культурный уровень
(чтение книг, посещение
театров); в) найти кате-
гории, подверженные
риску заболеваний
вследствие курения и
пристрастия к алкоголю.
Рис. 10.

Ответы к некоторым задачам

Раздел 2.2.: Задание 1. Ответ: ылукинаК. Задание 2. Ответ: ri ri


Задание 3. Ответ: 1211107 Задание 4: Сумма цифр числа = 10 Задание 5. От-
вет: Здравствуйте! Я ваша тётя! Задание 6. Ответ: Число вхождений слова
«грека» = 3 Задание 7. Ответ: n = 2= числу повторения слова «как». Задание

9. Ответ: Задание 10. Ответ:


49

Раздел 6.2.: Задание 3. Ответ:

Задание 4. Ответ: Задание 5. Ответ: Зада-

ние 6. Ответ: Задание 10. Ответ:

Библиографический список

1 Программирование на VBA. Часть I. Базовые алгоритмические


структуры. Практикум / Н.К. Петрова, М.М. Волченко. – Казань: Казан. гос.
энерг. ун-т, 2010. – 55 с.
2. Основы работы на VBA. Массивы: Метод. указания / Сост.: В.В.
Косулин, Н.Г. Бикеева – Казань : Казан. гос. энерг. ун-т, 2010. – 44 с.
3. Гарнаев А.Ю. Самоучитель VBA. / А.Ю. Гарнаев. – СПб.: БХВ-
Петербург, 2003. – 512 с.
4. Абрамян М.Э. 1000 задач по программированию. Методические
указания / М.Э. Абрамян - Часть II. – Ростов: Ростовский гос. ун-т, 2004. –
42 с.
5. Устинов Н.А. Microsoft Office (Разработка документов в Word, Excel
и приложений на VBA): Учеб. пособие / Н.А. Устинов – Нижний Новгород:
Нижегородский гос. ун-т, 2004. – 155 с.
50

Содержание

Предисловие ............................................................................................................. 3 
I. ОБРАБОТКА СИМВОЛЬНЫХ ПЕРЕМЕННЫХ ............................................. 4 
1. Средства VBA для работы с символьными переменными ......................... 4 
1.1 Символьные переменные, строковые функции ..................................... 4
1.2 Функции преобразования типов данных и прочие полезные функции
........................................................................................................................... 6
2. Примеры решения типовых задач и задачи для самостоятельного
решения ................................................................................................................ 7 
2.1 Примеры решения типовых задач ........................................................... 7
2.2 Задания для самостоятельного чтения программ .................................. 8
2.3 Задания на разработку программ с неявно заданным алгоритмом . 122
II. ОБЩИЕ ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ ПО РАБОТЕ С МАССИВАМИ
НА VBA ................................................................................................................ 144 
1. Понятие массив и индексированные переменные ................................... 145 
2.1 Статические массивы ............................................................................ 166
2.2 Динамические массивы ........................................................................ 177
3. Область видимости массивов на VBA ...................................................... 199 
4. Функции VBA для работы с массивами ................................................... 222 
5. Передача массивов в процедуры и функции ............................................ 244 
5.1 Способы передачи параметров для обычных переменных............... 255
5.2 Особенности передачи массивов ......................................................... 277
6. Примеры решения типовых задач и задачи для самостоятельного
решения ............................................................................................................ 299 
6.1 Примеры чтения программ обработке массивов ............................... 299
6.2. Задания для самостоятельного чтения программ ............................. 399
6.3. Задания по разработке программ для задач с одномерными
массивами ..................................................................................................... 433
6.4. Задания по разработке программ для задач с двумерными массивами
....................................................................................................................... 455
6.5. Задания на разработку программ с неявно заданным алгоритмом 466
ОТВЕТЫ К НЕКОТОРЫМ ЗАДАЧАМ ........................................................ 488 
БИБЛИОГРАФИЧЕСКИЙ СПИСОК.. Ошибка! Закладка не определена.9 
51
52

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

Петрова Наталья Константиновна,


Беляева Лилия Ринатовна

ПРОГРАММИРОВАНИЕ НА VBA
В ПРИМЕРАХ И ЗАДАЧАХ
ЧАСТЬ II. РАБОТА С СИМВОЛЬНЫМИ ПЕРЕМЕННЫМИ И
МАССИВАМИ

Практикум

Кафедра информатики и информационно-управляющих систем КГЭУ

Редактор издательского отдела Т.В. Андреева


Компьютерная верстка Т.В. Андреева

Подписано в печать 06.12.10


Формат 60×84/16. Бумага «Business». Гарнитура «Times». Вид печати РОМ.
Усл. печ. л. Уч.-изд. л. 6Тираж 200 экз. Заказ №

Издательство КГЭУ, 420066, Казань, Красносельская, 51


Типография КГЭУ, 420066, Казань, Красносельская, 51

Оценить