Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Задачник VBA_ II

.pdf
Скачиваний:
302
Добавлен:
10.06.2015
Размер:
1.17 Mб
Скачать

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. Понятие массив и индексированные переменные

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

Ниже представлены примеры данных, которые могут быть описаны массивами.

В математике принято компоненты вектора или элементы определителей или матриц обозначать одной переменной, к которой приписывается справа один или два, или несколько индексов:

x xr = x12x3

 

 

 

 

a

11

a12

L a1n

 

a

 

=

a

21

a21

L a21

 

 

 

 

 

 

L

L L L

 

 

 

 

 

 

am1

am 2

amn

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

Массивами удобно описывать однородную информацию, которая содержит большое количество однотипных данных. Например, каждый студент в группе обладает рядом параметров: ФИО, год рождения, оценки за экзамены и т.д. Каждый параметр будет описан своим именем, но их количество будет равно количеству студентов в группе, а связь с носителем информации будет зафиксирована порядковым номером или индексом. При программировании на 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). Хотя для разрешения подобных конфликтов классические принципы языков программирования требуют описания глобальных переменных