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

VBA_ЛБ_13v2

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

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

81

Листинг 40

Function Балл(Оценка As String) As Double

'Возвращает числовой эквивалент оценки, заданной текстом

Dim stVar as String * 3, dblVar As Double stVar = LCase(Оценка)

Select Case stVar Case "отл"

dblVar = 5 Case "хор"

dblVar = 4 Case "удо"

dblVar = 3 Case "неу"

dblVar = 2 Case Else

dblVar = -1

Балл = dblVar End Function

Сначала разберём действия в функции. В инструкции

stVar = LCase(Оценка)

функция LCase переводит все буквы аргумента Оценка в нижний регистр (т.е. делает все буквы строчными), а в локальную переменную stVar пересылаются первые три буквы, потому что stVar объявлена длиной в три символа.

Инструкция Select Case – переключатель на множество вариантов, определяемых значением переменной stVar: "отл", "хор", "удо", "неу". В каждом варианте переменной dblVar присваивается соответствующее численное значение. Исполняется один из возможных вариантов, после чего управление передаётся на инструкцию, следующую за End Select, и имени функции присваивается значение переменной dblVar. Кстати, переменная dblVar и имя функции Балл объявлены типа Double, а не Integer, потому что все числа в ячейках электронных таблиц имеют тип Double.

Теперь обратим внимание на формальные признаки. В заголовке функции нет ключевого слова Private. Функция имеет формальный аргумент типа String, штатный для ячеек. Возвращаемое значение имеет тип Double, тоже штатный тип для ячеек. В теле функции имени Балл присваивается значение. Всем необходимым формальным требованиям функция Балл удовлетворяет (если находится в модуле общего назначения).

Разместим функцию Балл в стандартном модуле VBA, перейдём в Excel и запустим Мастера функций. В категории "Определенные пользователем" видим функцию Балл (рис. 10) и можем ей воспользоваться.

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

82

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

Рис. 10. Функция пользователя находится в категории "Определенные пользователем"

Открыть диалоговое окно "Макрос".

В поле "Имя макроса" ввести с клавиатуры или вставить из буфера обмена имя функции (рис. 11).

Щелкнуть по кнопке "Параметры…", которая стала доступной.

В окне " Параметры макроса" в поле "Описание" ввести пояснение к функции

ищелкнуть по кнопке ОК.

В диалоговом окне "Макрос" щелкнуть по кнопке "Отмена".

Если теперь обратиться к функции с помощью Мастера функций, то увидим в окне Мастера введённое пояснение (рис. 12).

Рис. 11. Ввод пояснения к функции.

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

83

Рис. 12. Пояснение к функции Балл в окне Мастера функций.

Рассмотрим другой пример разработки функции рабочего листа. В составе математических функций Excel есть функция СУММПРОИЗВ (английское название SUMPRODUCT), вычисляющая скалярное произведение векторов.

Скалярное произведение – это сумма произведений соответствующих компонентов векторов. Если заданы вектор А с координатами {a1, a2, …, an} и вектор В с координатами {b1, b2, …, bn}, то их скалярное произведение равно

n

( A B) ai bi

i 1

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

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

В работе VBA4 рассматривался вопрос о присвоении массиву VBA (внутреннему массиву программы) значений объекта Selection. Отмечалось, в частности, что массив точно воспроизводит форму диапазона. Диапазону в одной строке соответствует массив из одной строки и множества столбцов, диапазону из одного столбца соответствует массив из одного столбца и множества строк.

Пусть разрабатываемая функция имеет такой заголовок:

Function ScalarProduct(ArgA As Range, _

ArgB As Range) As Double

Программа должна распознать, как расположены объекты ArgA и ArgB. Здесь могут помочь счётчики числа строк и столбцов в диапазонах – свойства

Rows.Count и Columns.Count. Очевидно, если ArgA.Rows.Count = 1 и

84

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

ArgA.Columns.Count > 1, то диапазон ArgA расположен по строке, а если

ArgA.Rows.Count > 1 и ArgA.Columns.Count = 1, то диапазон ArgA расположен по столбцу. Требуется различать следующие 4 варианта: строка – строка, строка – столбец, столбец – строка и столбец – столбец. Используем для этого распространённый приём: каждое различаемое состояние отобразим численным признаком, а сумма признаков отобразит тогда сочетание состояний. Пусть рА

– признак состояния аргумента ArgA, рВ – признак состояния аргумента ArgB. В табл. 9 показаны численные значения признаков рА и рВ и их суммы. Видно, что сумма (рА + рВ) однозначно определяет сочетание состояний диапазонов

ArgA и ArgB.

 

 

 

Таблица 9

 

Значения суммы рА+рВ

 

 

 

Диапазон ArgB

 

 

Строка: рВ=2

Столбец: рВ=4

Диапазон ArgA

Строка: рА=1

3

5

Столбец: рА=2

4

6

 

Вырисовывается следующий план действий в функции ScalarProduct:

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

вычислить признаки рА и рВ, дать им значения согласно табл. 9;

в инструкции Select Case для каждого значения (рА + рВ) организовать цикл для вычисления суммы произведений компонентов;

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

Реализуем план в четыре этапа.

Этап 1. Пересылка значений из диапазонов во внутренние массивы

Dim VecA, VecB

'Массивы должны иметь тип Variant

VecA

=

ArgA

 

VecB

=

ArgB

 

Этап 2. Вычисление признаков рА и рВ

'Количество строк и столбцов в диапазонах

RowsA = ArgA.Rows.Count

RowsB = ArgB.Rows.Count ColsA = ArgA.Columns.Count ColsB = ArgB.Columns.Count 'Проверка диапазона ArgA

If RowsA = 1 And ColsA > 1 Then pA = 1 'Строка If RowsA > 1 And ColsA = 1 Then pA = 2 'Столбец Проверка диапазона ArgB

If RowsB = 1 And ColsB > 1 Then pB = 2 'Строка If RowsB > 1 And ColsB = 1 Then pB = 4 'Столбец

Этап 3. Вычисление суммы произведений компонентов

Select Case pA + pB

Case 3 'ArgA – строка, ArgB – строка

For k = 1 To ColsA

 

 

 

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

85

 

 

Prod = Prod + VecA(1, k) * VecB(1, k)

 

Next k

 

 

 

Case 4

'ArgA - столбец, ArgB - строка

 

For

k = 1 To

ColsB

 

 

Prod =

Prod + VecA(k, 1) * VecB(1, k)

 

Next

k

 

 

 

Case 5

'ArgA

-

строка, ArgB - столбец

 

For

k = 1 To

ColsA

 

 

Prod =

Prod + VecA(1, k) * VecB(k, 1)

 

Next

k

 

 

 

Case 6

'ArgA

столбец, ArgB - столбец

 

For

k = 1 To

RowsA

 

 

Prod =

Prod + VecA(k, 1) * VecB(k, 1)

 

Next k

End Select

Этап 4. Присвоение значения имени функции

ScalarProduct = Prod

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

В листинге 41 приведён полный текст функции ScalarProduct.

Листинг 41

ScalarProduct = Prod

Function ScalarProduct(ArgA As Range, _

 

 

ArgB As Range) As Double

'Вычисляет скалярное произведение диапазонов

'Диапазоны могут размещаться по столбцам или строкам

'независимо друг от друга

 

'

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

 

Dim VecA, VecB

'Массивы должны иметь тип Variant

 

Dim pA As Integer, pB

As Integer

 

Dim Prod As Double, k

As Integer

 

Dim RowA As Integer, RowsA As Integer

 

Dim RowB As Integer, RowsB As Integer

 

Dim ColsA As Integer,

ColsB As Integer

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

VecA = ArgA

VecB = ArgB

'Вычисление признаков рА и рВ 'Количество строк и столбцов в диапазонах

RowsA = ArgA.Rows.Count

RowsB = ArgB.Rows.Count ColsA = ArgA.Columns.Count ColsB = ArgB.Columns.Count

'Проверка диапазона ArgA

If RowsA = 1 And ColsA > 1 Then pA = 1 'Строка If RowsA > 1 And ColsA = 1 Then pA = 2 'Столбец

86

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

 

 

 

 

 

Проверка

диапазона ArgB

 

 

If RowsB

=

1 And ColsB > 1 Then pB = 2

'Строка

 

If RowsB

>

1 And ColsB = 1 Then pB = 4

'Столбец

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

 

 

Select Case

pA + pB

 

 

Case 3

 

'ArgA – строка, ArgB – строка

 

 

For

k

= 1 To ColsA

 

 

Prod = Prod + VecA(1, k) * VecB(1, k)

 

Next k

 

 

Case 4

 

'ArgA - столбец, ArgB - строка

 

For

k

= 1 To ColsB

 

 

 

Prod = Prod + VecA(k, 1) * VecB(1, k)

 

Next

 

k

 

 

Case 5

 

'ArgA - строка, ArgB - столбец

 

 

For

k

= 1 To ColsA

 

 

 

Prod = Prod + VecA(1, k) * VecB(k, 1)

 

Next

 

k

 

 

Case 6

 

'ArgA – столбец, ArgB - столбец

 

For

k

= 1 To RowsA

 

 

 

Prod = Prod + VecA(k, 1) * VecB(k, 1)

Next k

End Select

ScalarProduct = Prod

End Function

Окно Мастера функций при вызове функции ScalarProduct в формуле ячейки рабочего листа показано на рис. 13. Диапазон ArgA выделен по столбцу D, диапазон ArgB – по строке 6, функция ScalarProduct выполняет вычисления и получает результат.

Рис. 13. Окно Мастера функций при обращении к функции ScalarProduct.

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

87

Рабочее задание Часть 1. Разработка и опробование функции "Балл"

Р1. Проанализируйте разработку функции "Балл", письменно ответьте на следующие вопросы:

а) где может или должен размещаться исходный текст функции пользователя;

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

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

Р2. В отдельном модуле VBA наберите функцию "Балл", проверьте на ошибки компиляции.

Р3. Создайте на рабочем листе ведомость успеваемости с текстовыми оценками и проверьте работу функции "Балл".

Часть 2. Разработка и опробование функции ScalarProduct

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

а) что такое скалярное произведение, приведите примеры из жизненной практики;

б) какой тип данных должен иметь формальный аргумент, чтобы функция могла принять диапазон ячеек;

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

г) почему в функции ScalarProduct важно определить не только размещение диапазона по столбцу или строке, но и сочетание размещений двух диапазонов (столбец-строка и др.);

д) какой приём используется в функции ScalarProduct для определения сочетания размещений двух диапазонов.

Р5. На одном из рабочих листов создайте таблицу по следующему образцу:

Наименование

Цена за единицу, руб.

Колич.

Устройство для удаления ошибок

12,6

7,8

Автомат для расстановки запятых

88,9

32,4

Наименования, цены и количества составить самостоятельно, в таблице сделайте 9 строк. Графу цен скопируйте в отдельную строку (команда Правка | Специальная вставка | транспонировать).

Р6. Проверьте действие встроенной функции СУММПРОИЗВ для данных "Цена" и "Количество", когда цены размещаются по столбцу и по строке.

Р7. В отдельном модуле VBA наберите функцию ScalarProduct, проверьте на ошибки компиляции.

88

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

Р8. Повторите пункт Р6 для функции ScalarProduct. Результаты запишите в рабочий журнал. Обратите внимание, что функция ScalarProduct выдаёт ошибку, если диапазоны не равновеликие.

Часть 3. Разработка и опробование функций, работающих с диапазонами ячеек

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

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

Р11. Разработайте функцию, которая принимает диапазон ячеек с текстовыми данными и выводит в соседний столбец длину соответствующей строки. Например, если тексты находятся в столбце В, то в ячейку С4 записать длину строки, находящейся в В4.

Ограничение и рекомендация. В программе допускается только один цикл и этот цикл должен быть For Each…Next. Диапазон вывода начинается в ячейке, в которую вводится формула.

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

К1. Объясните, отличается ли функция VBA, предназначенная для использования в формулах ячеек рабочего листа, от функций VBA, используемых в проекте VBA.

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

К3. Объясните, можно ли сделать подсказку пользователю функции рабочего листа, ведь он не видит текста функции. Если да, то как это сделать?

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

К5. Сколько формальных аргументов может иметь функция рабочего листа? Есть ли здесь какие-либо ограничения?

К6. Можно ли в функцию рабочего листа передать диапазон ячеек? Если да, то как это сделать?

К7. Функция VBA "IsEmpty" возвращает True, если ячейка пустая. Составьте функцию рабочего листа, которая принимает диапазон ячеек и возвращает количество пустых ячеек в этом диапазоне.

К8. Объясните, как функция рабочего листа может узнать количество ячеек в диапазоне, заданном формальным аргументов.

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

89

Рекомендуемая литература

1.Уокенбах Дж. Microsoft Office Excel 2007: профессиональное программирование на VBA.: Пер. с англ. – М.: ООО "И.Д. Вильямс", 2008. – 928 с.

2.Green, J., …[et al.]: Excel 2007 VBA Programmer's Reference. /Green, J., Bullen, St., Bovey, R., Alexander, M./ – Wiley Publishing, Inc., 2007. – 1179 s.

90

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

 

 

Оглавление

 

Предисловие ...............................................................................................................

3

Работа VBA1. Знакомство с Visual Basic for Applications ..................................

4

 

Немного о синтаксисе VBA.....................................................................................

5

Работа VBA2. Программа Workbook_Open ...........................................................

9

Работа VBA3. Коллекция Sheets............................................................................

13

 

Методы коллекции Sheets......................................................................................

14

 

Очень скрытые листы ..........................................................................................

15

Работа VBA4. Объекты Range и Selection...........................................................

21

 

Объект Range .........................................................................................................

22

 

Свойства объекта Range......................................................................................

23

 

Объект Selection ....................................................................................................

24

Работа VBA5. Свойства Cells и Offset, метод Union ........................................

28

Работа VBA6. Свойство End и метод EdvancedFilter ......................................

33

Работа VBA7. Текстовые функции VBA .............................................................

37

Работа VBA8. Циклы и массивы (1) .....................................................................

44

Работа VBA9. Циклы и массивы (2) .....................................................................

51

Работа VBA10. Разработка диалогового окна....................................................

57

Работа VBA11. Создание интерфейса с программой........................................

67

Работа VBA12. Встроенные функции InputBox и MsgBox ..............................

69

 

Функция VBA InputBox ......................................................................................

69

 

Метод Excel InputBox .......................................................................................

71

 

Функция VBA MsgBox ............................................................................................

72

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

75

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

80

Рекомендуемая литература ...................................................................................

89

D:\SaDocs11\ExcelVBA\VBA_ЛБ_13v2.doc

 

4 июля 2013 г

3 October 2013

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