Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
курсовая / Источники / excel_2010_professionalnoe_programmirovanie_na_vba_RuLit_Me_412629.pdf
Скачиваний:
4
Добавлен:
27.09.2025
Размер:
22.97 Mб
Скачать

Глава 10. Создание функций

309

N e x t i

E ls e

R e m o v e V o w e ls = C V E r r ( x lE r r N A )

End I f

End F u n c t io n

Примечание

Обратите внимание, что был также изменен тип данных для возвращаемого функцией значения. Поскольку функция может возвращать что-то еще, кро­ ме строки, тип данных был изменен на V a r ia n t .

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

Некоторые функции Excel имеют неопределенное количество аргументов. Знакомый пример — функция СУММ, которая имеет следующий синтаксис:

СУММ(число1/ ч и с л о 2 . . . )

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

=СУММ ( A l : А5 ,С 1 : С 5 , Е 1 : Е 5 , G l :G 5 )

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

=СУММ(А1:А5, 1 2 ,2 4 * 3 )

Существует возможность создавать функции, имеющие неопределенное количество аргументов. Основная идея заключается в следующем: примените в качестве последнего (или единственного) массив и добавьте перед ним ключевое слово Param Array.

Примечание

P a ra m A rra y относится только к последнему аргументу в списке аргументов процедуры. Он всегда имеет тип данных V a r i a n t и всегда является необя­ зательным аргументом (хотя ключевое слово O p t io n a l не используется).

Ниже представлена функция, которая может иметь произвольное количество одно­ мерных аргументов (она не поддерживает многомерные аргументы-диапазоны). Функция возвращает сумму аргументов.

Function S im p le S u m ( P a ra m A rra y

a r g l i s t O A s V a r ia n t ) A s D o u b le

For Ea ch a r g

I n

a r g l i s t

 

Sim p leS u m

=

S im p le S u m +

a r g

Next a rg

 

 

 

End F u n c tio n

 

 

 

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

Function S im p le S u m ( P a ra m A rra y a r g l i s t O A s V a r ia n t ) A s D o u b le

Dim

c e l l

A s

R ange

For

E a ch

a r g

I n

a r g l i s t

 

F o r E a ch c e l l I n a r g

 

S im p le S u m

= S im p le S u m + c e l l

 

N e xt

c e l l

 

 

310

Часть III. Visual Basic for Applications

Next arg

End Function

Функция SimpleSum далеко не такая гибкая, как функция Excel СУММ. Протестируй­ те ее на практике с разными типами аргументов, и вы убедитесь, что функция выдает ошибку, если все аргументы не являются либо числовым значением, либо ссылкой на ячейки, содержащие числовые значения.

Имитация функции с у м м

В данном разделе представлена пользовательская функция MySum. В отличие от функции SimpleSum, рассмотренной в предыдущем разделе, функция MySum идеально копирует поведение функции Excel СУММ.

Перед рассмотрением кода функции MySum уделим внимание функции Excel СУММ. Данная функция имеет очень широкие возможности. Она насчитывает до 255 аргументов (даже пропущенные аргументы), причем аргументами могут выступать числовые значе­ ния, ячейки, диапазоны, представленные в виде текста числа, логические значения и да­ же встроенные функции. Рассмотрим следующую формулу:

=СУММ(В 1 , 5 , " 6 " , , И С Т И Н А ,К О Р Е Н Ь ( 4 ) , A l :А 5 , D :D , С 2 * С З )

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

ссылка на одну ячейку;

символьное значение;

строка, которая выглядит как числовое значение;

пропущенный аргумент;

логическое значение ИСТИНА;

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

ссылка на диапазон.

Функция MySum (листинг 10.1)также обрабатывает все эти типы аргументов.

Компакт-диск

Рабочая книга, включающая функцию MySum, находится на прилагаемом к книге компакт-диске (файл mysum function.xlsm).

Листинг 10.1. Функция MySum

Function MySum(ParamArray args() As Variant) As Variant

1

И м и та ци я ф ункции Excel

СУММ

'

О б ъ я в л е н и е п ер ем ен н ы х

 

 

Dim i As Variant

cell As Range

 

Dim TempRange As Range,

 

Dim ECode As String

 

 

Dim m, n

 

 

MySum = 0

 

'

О б р а б о тк а к а ж д о го а р г у м е н т а

 

For

i = 0 To UBound(args)

 

'

П р о п у ск о т с у т с т в у ю щ и х а р гу м е н т о в

If Not IsMissing(args(i)) Then

312

Часть III. Visual Basic for Applications

что позволит гарантировать работоспособность функции. В ходе анализа кода функции MySum помните о следующем.

Пропущенные аргументы (определенные с помощью функции IsM issin g ) игно­ рируются.

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

Для аргумента-диапазона функция циклически просматривает все ячейки диапазо­ на и прибавляет их значения к сумме.

Функция имеет тип данных V a ria n t, так как она должна возвращать ошибку, ес­ ли один из ее аргументов имеет значение ошибки.

Если аргумент содержит ошибку (например, #ДЕЛ! /0), то функция MySum воз­ вращает ошибку — как и функция Excel СУММ.

Функция Excel СУММ “полагает”, что текстовая строка имеет значение 0, если только она не является символьным аргументом (т.е. фактическим значением, а не переменной). Следовательно, функция MySum прибавляет значение ячейки лишь в том случае, если его можно оценить как число (для этого применяется функция VBA IsN um eric).

Для аргументов-диапазонов функция использует метод I n te r s e c t с целью создания временного диапазона, который состоит из пересечения заданного диапазона и исполь­ зуемого диапазона листа. В результате обрабатываются те случаи, когда аргумент со­ стоит из полной строки или столбца, а его просмотр будет длиться вечность.

Возможно, вас интересует относительная скорость выполнения функций СУММ и Му- Sum. Конечно, функция MySum значительно медленнее, ее скорость зависит от быстро­ действия вашей системы и самих формул. Если в системе рабочий лист, содержащий пять тысяч формул СУММ, вычисляется за долю секунды, то после замены функций СУММ на функции MySum пересчет занимает 8 секунд.

Функция MySum несколько улучшена, но ее производительность все же намного меньше производительности функции СУММ. Цель этого примера состоит не в том, что­ бы создать новую функцию СУММ. Скорее, этот пример показывает, как создавать поль­ зовательские функции рабочих листов, которые выглядят и работают так же, как встро­ енные функции Excel.

Расширенные функции для работы с датами

Достаточно часто пользователи Excel жалуются на невозможность работы с датами до 1900 года. Например, к таким пользователям относятся специалисты по созданию ге­ неалогических деревьев, которые часто применяют Excel для отслеживания дат рожде­ ния и смерти. Если какая-либо из подобных дат попадает в период до 1900 года, вычис­ ление количества прожитых лет становится невозможным.

Я создал набор функций, использующих возможности VBA по работе с широчайшим диапазоном дат. Наиболее ранняя дата, распознаваемая VBA, — 1 января 100 года.