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

Уокенбах Формулы в Excel

.pdf
Скачиваний:
212
Добавлен:
26.03.2016
Размер:
35.82 Mб
Скачать

Ф Exit

Function

это оператор, результат которого— выход из функции

(необязательно).

 

ФEnd Function— ключевое выражение, показывающее конец работы функции (обязательно).

Выбор имени функции

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

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

Можно использовать любую комбинацию букв верхнего и нижнего регистров.

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

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

нужно использовать символы разных регистров (лучше написать I n t e r e s t Rate, чем i n t e r e s t r a t e ) .

Нельзя использовать пробелы или точки. Для придания именам функции лучшей читабельности можно использовать символ нижнего подчеркивания (Interst _ Rate) .

В имя функции нельзя вставлять следующие символы: #, $, %, !. Они являются символами объявления типа, которые имеют специальное назначение в VBA.

Имя функции может состоять не более чем из 255 символов — правда, никто не создает такие длинные имена!

Использование функций вформулах

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

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

функцию CountNames (подсчет имен), объявленной в рабочей книге как Myf uncs . xls, вам следует использовать следующую формулу:

=Myfuncs.xls!CountNames(Al:A1000)

Если вставить функцию с помощью диалогового окна вставки функции, ссылка на рабочую книгу будет вставлена автоматически.

Настройка ссылки на рабочую книгу. Это можно сделать с помощью средств ре-

дактора Visual Basic Tools^References (см. рис. 23.1). Если функция объявлена в рабочей книге ссылки, имя рабочего листа использовать нет необходимости. Даже когда зависимая рабочая книга задана как ссылка, диалоговое окно вставки функции продолжит вставлять ссылку на рабочую книгу (даже если это не необходимо).

500

Часть VI. Разработкапользовательских функ

По умолчанию всепроекты получают имя VBAProj ect— такое имяпоявляется всписке доступных ссылок в диалоговом окне References. Чтобы убедиться, что выбран правильный проект в диалоговом окне ссылок, проследите задиалоговым окном, в котором показано имя рабочей книги для выбранного элемента. Еще лучше изменить имя проекта на описательное. Дляэтого нужно выбратьпроект, нажать <F4> для отображения окна свойств и потом указать имя объекта, отличающееся от VBAProject.

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

Visual Basic For Applications

V; Microsoft Excel 10.0 Object Ltorary

'V; OLE Automation

У;|

iatpvbaen.xls

.lEuroTool

• jfuncres

: j Internet Assistant

. ikrckup

' jMicrosoft Forms 2.0 Object Library

".1 Microsoft Office Euro Converter Object Library ijRef Edit Control

; jSOLVER

Аргументы функций

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

Рис. 23.1. Используйте диалоговое окно References для создания ссылки на проект, в котором содержится пользовательская VBA-функция

Функция может не иметь аргументов.

Функция может иметь фиксированное количество обязательных аргументов (от 1 до 60).

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

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

Использование диалогового окна вставкифункции

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

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

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

Глава 23. Основыпроцедурфункций

501

Добавление описания функции

При выборе функции в диалоговом окне вставки функции появляется краткое описание этой функции (см. рис. 23.2).

(JSHJCK функции:

,IВведите краткое описание действия, которое нужно

°{выполнить, и нажмитекнопку "Найти"

|Полный алфавитный перечень

jrj

OddLPrice

Option СЖ Price 'ncedisc 'ricemat Problem _ok

IIIIMHIIIIII

Сочетание клавиш:__

Описание:

Returns the yield «f « security **h an odd last period.

Рис. 23.2. Краткое описание выбранной функ-

Рис. 23.3.Подготовкаописанияфункции в

ции в диалоговом окне вставки функции

диалоговомокнепараметров макроса

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

Следующие инструкции рассказывают, как создать описание для пользовательской функции:

1.Создайте функцию в редакторе Visual Basic.

2.Перейдите в Excel и выберите Сервис^Макрос^Макросы (или нажмите <Alt+F8>). Диалоговое окно макроса представит в виде списка доступные внедренные процедуры, но не функции.

3.Введите имя функции в поле имени макроса. Убедитесь, что вы правильно его ввели.

4.Щелкните на кнопке Параметры для отображения диалогового окна настроек макроса. Если кнопка неактивна, вероятнее всего введено неправильное имя функции.

5.Введите описание функции в поле описания (см. рис. 23.3).

6.Щелкните на кнопке ОК, а затем на Отмена.

При

использовании диалогового окна Мастер функции диалоговое окно аргумен-

тов

функции появится после щелчка на кнопке ОК. Для встроенных функций вок-

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

Определение категории функции

Странно, но в Excel нельзя напрямую определить пользовательскую функцию в отдельную категорию. Если вы хотите, чтобы ваша функция была определена в отдельную категорию, заданную пользователем, вам нужно дополнительно изменить VBА-код.

Например, предположим, что вы создали функцию и назвали ее COMISSION, и вы желаете, чтобы данная функция появилась в категории Финансовые (это первая катего-

502

ЧастьVI. Разработка пользовательскихфункций

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

Application.MacroOptions Macro:="COMISSION", Category:=1

Один способом выполнения этого оператора является использование окна быстрого доступа редактора Visual Basic. На рис23.4 представлен пример. Просто введите оператор и нажмите <Entei>. Потом сохраните рабочую книгу, тем самым в нейбудет сохранено определение функции в указанной категории. Данный оператор необходимо выполнить только один раз. Другими словами, нетнеобходимости назначать категорию функции каждый раз, когда открыта книга.

mm

Function COHHISSION(Sales) As Single

-Ч& VBAProJect (commission functior

 

 

Microsoft Excel Objerts

 

- 0.08

Sheetl(Sheetl)

 

 

f ThtsWorkbook

 

 

- -^Modules

 

Const Tier4 Аз Double - 0.14|

 

 

Case Is >- 40000

 

 

Слзе Is >- 20000

 

 

COMMISSION - Sales * Tier3

 

 

Case Is >- 10000

 

 

COMMISSION = Sales « Tier2

 

 

Case Is < 10000

 

 

COM1

 

 

End. S-lecr

 

End

Function

Application.MacroOptions Macro:""COMMISSION", Category:«1

Puc. 23.4. Выполнение VBA-onepamopa, назначающего функциикатегорию

Аналогично можно создать соответствующую процедуру, и потом выполнить ее.

Sub AssignToFunctionCategory()

Appliacation.MacroOptions Macro:="COMISSION", Category:=1

End Sub

После выполнения процедуры ее можно удалить.

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

В табл. 23.1 представлен перечень категорий функций, которые можно использовать. Отметьте, что несколько из этих категорий (10-13) обычно не выводятся в диалоговом окне вставки функции. При отнесении функции к одной из этих категорий она, как ни странно, отображается в диалоговом окне.

Глава 23. Основы процедур функций

503

23.11

Номер категории

Название категории

0

Все (категория не определена)

1

Финансовая

2

Дата и время

3

Математические

4

Статистические

5

Ссылки и массивы

6

Работа с базойданных

7

Текстовые

8

Логические

9

Проверкасвойств и значений

10

Команды

11

Настройки

12

Управления макросами

13

Динамический обмен данными/внешние

14

Пользовательские

15

Инженерные

Тестирование иотладка функций

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

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

Записываемый VB А-код может содержать триосновных типа ошибок:

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

Ошибки выполнения. Ошибки, появляющиеся во время выполнения функции. Например, попытка выполнить математическую операцию над строковой переменной приведет к такой ошибке. Если вы незнае ie о ее существовании заранее, то небудете знать о ее источнике, пока она непроявится.

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

504

Часть VI. Разработка пользовательскихфунк

Для проверки кода в VBA-модуле на наличие синтаксических ошибок, нужно выбрать Debug^Compile. В результате на экране отобразятся сведения о первой синтаксической ошибке, если она существует. Исправьте эту ошибку и запустите операцию еще раздля нахождения других ошибок.

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

При тестировании функции с использованием формулы рабочего листа сложно локализировать ошибки выполнения, поскольку (в отличие от синтаксических ошибок) они не появляются во всплывающем окне ошибок. В случае появления ошибок выполнения формула, использующая функцию, просто будет возвращать ошибочное значение (#ЗНАЧ!). В этом разделе описано несколько методов отладки пользовательских функций.

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

Использование окна сообщений VBA

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

Function REVERSETEXT(text) As String

1Возвращает аргумент в обратном порядке TextLen = Len(text)

For i = TextLen To 1 Step -1

REVERSETEXT = Mid(text, i, 1) & REVERSETEXT

Next i End Function

Можно вставить в код временный оператор MsgBox, который поможет понять источник проблемы. Ниже приведена функцияс оператором MsgBox, вставленным внутрь цикла:

Function REVERSETEXT(text) As String

1Возвращает аргумент в обратном порядке TextLen = Len(text)

For i = TextLen To 1 Step -1

REVERSETEXT = Mid(text, i, 1) & REVERSETEXT MsgBox REVERSETEXT

Next i End Function

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

Глава 23. Основы процедур функций

505

Рис. 23.5. Использование оператора MsgBox для тестированиязначений во времявыполнении функции

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

REVERSETEXT = REVERSETEXT & Mid(text, i, 1)

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

Для отображения более чем одной переменной в окне сообщений, нужно объединить переменные и вставить пробел между каждой парой переменных. Ниже представлен оператор, отображающий значения трех переменных (х, у и z) в окне сообщений:

MsgBox х & " " & у & " " & z

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

Использование вкоде операторов Debug.Print

Если вам кажется, что операторы MsgBox достаточно надоедливы, то лучший выход из ситуации — это вставить некоторый временный код, записывающий переменные непосредственно в окно быстрого доступа редактора Visual Basic (смотри врезку "Использование окна быстрого доступа"). Для записи значений выбранных переменных нужно использовать оператор Debug. Print .

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

Function VOWELCOUNT (г)

 

 

Count =

0

 

 

For i =

1 To Len(r)

 

 

Ch

= UCase(Mid(r/

i, 1)

If

Ch Like "[AEIOU]"

Then

 

Count = Count + 1

 

Debug.Print Ch,

i

End

If

 

 

Next i

 

 

 

VOWELCOUNT = Count

 

 

End Function

 

 

 

В этом случае значения двух переменных (Ch и i) выводятся в окне быстрого доступа всякий раз, когда выполняется оператор Debug. P r i n t . На рис. 23.6 отображен результат операции вычисления, если аргументом функцииявляется California .

После отладки функции необходимо убедиться в том, что операторы Debug. Prin t удалены.

506

Часть VI. Разработка пользовательских функций

{DIM

Funcciosi VOUELCOUNT(r)

 

 

- ^

VBAProJect (ВоокЗ)

 

Count •

0

г.

<*-> Microsoft Excel Objects

 

For i • 1 To Len(r)

 

 

 

Ch

- UCese(Mid(r, i, 1))

 

£ J ThuWorkbook

 

If

Ch Like "[AEIOU]" Then

-

r^ Modules

 

 

Count " Count + 1

 

«^MockJel

 

 

Debug.Print Ch, i

,^VBAProject(Book4)

 

End

If

 

 

 

Next i

 

 

 

 

VOWELCOUNT - Count

 

 

End

Function

iff

Рис. 23.6. Использование окна быстрого доступаредактора VisualBasic для отображения результатов во времяработы функции

Вызов функции из процедуры

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

Следующая функция содержит ошибку (ошибку выполнения).Как я отмечал ранее, ошибки выполнения неотображаются во время тестирования при использовании формулы рабочего листа. В нашем случае функция возвращает ошибку(#ЗНАЧ!).

Function REVERSETEXT(text) As String

1Возвращает аргумент в обратном порядке TextLen = Len(text)

For i = TextLen To 1 Step -1

REVERSETEXT = REVERSETEXT And Mid(text, i, 1)

Next i End Function

Для установления источника ошибки выполнения можно вставить следующую процедуру:

Sub Test()

х = REVERSETEXT("Hello") MsgBox x

End Sub

Эта процедура просто вызывает функцию REVERSETEXT и присваивает результат переменной, названной х. Оператор MsgBox отображает результат.

Можно выполнить процедуру непосредственно изредактора Visual Basic. Просто установите курсор в любом месте процедуры и выберите Run^Run Sub/UserForm (илипросто нажмите <F5>). Когда процедура будет выполнена, на экране отобразится сообщение об ошибке, как показано нарис. 23.7.

Глава 23. Основыпроцедурфункций

507

, VBAProJect (ВоокЗ)

H /*« Microsoft Excel Objects SSheet1 (Sheet 1)

ThisWorkbook

•- <b Modules

I& VBAProfect (Book4)

i $.

 

REVERSETEXT - REVERSETEXT And Mld(text, i, 1)

Next i

 

End Гипссion

 

ЗиЪ Test()

 

x -

REVERSETEXT("Hello")

 

End зиь

ШШШРМШТШМШШШШШШШШШШШШШШШ

Рмс. 25.7. Ошибкавыполнения, определеннаяс помощью VBA

Щелкните на кнопке Debug, и редактор Visual Basic выделит цветом оператор, в котором предположительно содержится ошибка (см. рис. 23.8). Сообщение об ошибке не объясняет, как исправить ошибку, но оно ограничивает вас в выборе правильного решения. После определения оператора, содержащего ошибку, ее можно изучить более детально, и использовать окно быстрого доступа (см. врезку "Использование окна быстрого доступа") для более точного нахождения причиныошибки.

В нашем случае проблема заключается в неправильном использовании оператора And (И) вместо оператора объединения (&). Правильный оператор будет иметь вид:

REVERSETEXT = REVERSETEXT & Mid(text, i, 1)

При щелчке накнопке Debug процедура все еще выполняется, — она просто приостанавливается и переводится в "режим останова". После внесения корректив следует нажать <F5> для продолжения ее выполнения вобычном режиме, или <F8> — впошаговом; кроме того, можно приостановить выполнение щелчком на кнопке Rest.

Использование окна быстрого доступа

Окно быстрого доступа редактора Visual Basic очень полезно при отладке кода. Для активизации этого окна необходимо нажать <Ctrl+G>.

Можно ввести VBA-оператор в окне быстрого доступа исразу же посмотреть результат.Например, введите следующий код вокне быстрого доступа инажмите <Enter>:

P r i n t S q r ( 1 1 5 6 )

Редактор Visual Basic отобразит результат операции извлечения квадратного корня(34).

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

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

? TypeName(Counter)

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

505

Часть VI.Разработка пользовательских функций

ject (ВоокЗ) Microsoft Excel Objects SSheetl (Sheetl)

ThisWorkbook Modules

Рис. 23.8. Выделенныйоператор с ошибкой выполнения

Установка точек остановки вфункции

Задание точки остановки в коде — еще один режим отладки. Выполнение кода приостанавливается, когда VBA находит точку остановки. Для проверки значений переменных можно воспользоваться окном быстрого доступа или использовать <F8>для пошаговой проверки кода.

Для определения точки остановки необходимо установить курсор в коде оператора, выполнение которого необходимо приостановить, затем выбрать Debug^Toggle Breakpoint. Также можно нажать <F9> или же щелкнуть кнопкой мышки на вертикальной полосе, расположенной в левой части окна кода. Все эти действия будут выделять цветом оператор, напоминая о том, что точка остановки активизирована (точку видно в левой части окна кода). В коде можно задать любое количество точек остановки. Для удаления точки остановки нужно установить курсор в код оператора, содержащий ее, и нажать <F9>. На рис. 23.9 показана функция, содержащая точку остановки.

VBAProJect (ВоокЗ)

В & Microsoft Excel Objects

Sheetl (Sheetl)

&••$* Modules

Puc. 23.9. Выделенный оператор содержитточку остановки

Глава 23. Основыпроцедурфункций

509