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

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

297

Dim

i

A s

I n t e g e r

 

Dim

A S C I I V a l

A s

I n t e g e r

 

Dim

C h a r V a l

A s

I n t e g e r

 

S t r in g L e n g t h = L e n (I n S t r in g )

 

UpCase

=

I n S t r i n g

 

F o r i = 1 To S t r in g L e n g t h

 

A S C I I V a l = A s c ( M id ( I n S t r in g , i ,

1 ))

C h a r V a l =

0

 

 

I f

A S C I I V a l

>= 97 A n d A S C I I V a l

<= 122 T h e n

 

 

C h a r V a l = -3 2

 

 

 

M id ( U p C a s e , i , 1) = C h r ( A S C I I V a l + C h a r V a l)

End

I f

 

 

 

 

N ext

i

 

 

 

 

 

End F u n c t io n

 

 

 

 

Примечание. Рабочая книга, содержащая эту функцию, находится на прилагаемом ккниге компакт-диске в файле u p p e r c a s e .x ls m .

Обратите внимание, что я выбрал относительно простой путь, — обратился к функ­ ции VBA U C ase .

Итак, мне было интересно посмотреть, чем пользовательская функция отличается от встроенной, поэтому я создал рабочий лист, который вызывает функцию 20 тысяч разе помощью случайных имен. Вычисления продолжались примерно 20 секунд. Затем я подставил встроенную функцию Excel u p p e r и в ы п о л н и л тест еще раз. На этот раз вы­ числения были выполнены практически мгновенно. Конечно, моя функция U p C a se вряд ли работает на основе оптимального алгоритма, более того, любая встроенная функция Excel работает быстрее самой лучшей пользовательской функции.

Еще один пример “изобретения колеса” можно найти в разделе “Имитация функции СУММ” .

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

Всегда помните о следующих особенностях аргументов процедур-функций:

аргументы могут представляться переменными (в том числе массивами), констан­ тами, символьными данными или выражениями;

некоторые функции не имеют аргументов;

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

отдельные функции имеют как обязательные, так и необязательные аргументы.

Примечание

Если формула содержит пользовательскую функцию рабочего листа и воз­ вращает # з н а ч !, это означает наличие ошибки в функции. Ошибка может быть вызвана логическими ошибками в программе или передачей в функ­ цию некорректных аргументов (см. раздел “Отладка функций”).

Примеры функций

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

298 Часть III. Visual Basic for Applications

Функции без аргументов

Как и процедуры, пользовательские функции необязательно должны иметь аргумен­ ты. Например, в Excel есть несколько таких встроенных функций, в том числе СЛЧИС, С Е ГО Д Н Я и Т Д А Т А . Несложно создать аналогичные функции.

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

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

Рабочая книга, содержащая функции без аргументов, находится на прила­ гаемом к книге компакт-диске. Соответствующий файл называется n o a r ­ gu m en t .x ls m .

Ниже приведен пример простой функции, не использующей аргументов. Следующая функция возвращает свойство UserName объекта Application. Это имя отображает­

ся

в диалоговом окне Excel Параметры Excel (Excel Options), раздел Основные

(General), и хранится в системном реестре Windows.

F u n c t io n U s e r ()

'

В о зв р а щ а е т имя п о л ь з о в а т е л я

 

U s e r = A p p lic a t io n . U s e r N a m e

E n d

F u n c t io n

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

= U s e r ()

Примечание

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

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

В следующем примере вызывается функция User и в качестве аргумента оператора MsgBox используется значение, которое она возвращает. Оператор конкатенации (&) объединяет текстовую строку с результатом функции User.

Sub

S h o w U s e r()

 

M sgB o x "Ваш е имя " & U s e r ()

E n d

Sub

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

F u n c t io n E x c e lD ir O A s S t r i n g

'

В о зв р а щ а е т н а з в а н и е п а п к и , в к о т о р о й у с т а н о в л е н а E x c e l

 

E x c e lD ir = A p p l i c a t i o n . P a t h

E n d

F u n c t io n

F u n c t io n S h e e t C o u n t ()

'

В о зв р а щ а е т к о л и ч е с т в о л и с т о в в р а б о ч е й к н и ге

 

S h e e tC o u n t = A p p l i c a t i o n . C a l l e r . P a r e n t . P a r e n t . S h e e t s . C o u n t

E n d

F u n c t io n

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

299

F u n c tio n S heetN am e ()

 

'

В о звращ ает

имя р а б о ч е г о

л и с т а

 

SheetN am e

= A p p l i c a t i o n . C a l l e r . P a re n t.N a m e

End

F u n c t io n

 

 

Управление пересчетом функций

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

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

A p p l i c a t i o n . V o l a t i l e T ru e

Метод V o l a t i l e объекта A p p l i c a t i o n имеет один аргумент (T ru e функция выделена как v o l a t i l e (изменяемая), она пересчитывается изменяется любая ячейка листа.

или F a ls e ) . Если всякий раз, когда

Например, поведение пользовательской

функции s t a t ic R a n d может быть измене­

но с помощью метода v o l a t i l e так, чтобы

оно напоминало поведение функции Excel

слчис.

F u n ctio n N o n S t a t ic R a n d ()

 

1

Возвращ ает

с л у ч а й н о е

ч и с л о ,

1

и зм е н я ется

при

каж дом

п е р е с ч е т е

 

A p p l i c a t i o n . V o l a t i l e T ru e

 

N o n S ta tic R a n d

= R n d ()

 

End F u n c t io n

 

 

 

 

При использовании аргумента F a ls e метода v o l a t i l e функция пересчитывается

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

Чтобы выполнить полный пересчет формул, включая неизменные пользовательские функции, нажмите клавиши <Ctrl+Alt+F9>. Эта комбинация клавиш, к примеру, генери­ рует новые случайные числа с помощью описанной в этой главе функции s t a t ic R a n d .

А теперь рассмотрим еще один пример функции без аргументов. Для быстрого за­ полнения диапазона ячеек используется функция Excel СЛЧИС. Но мне не слишком по­ нравилось, что случайные числа изменяются при каждом пересчете рабочего листа. По­ этомуя преобразовал формулы в их значения.

Затем я разработал функцию, которая возвращает случайные числа, не изменяющиеся при пересчете формул. Для этого была использована встроенная функция VBA Rnd, ко­ торая возвращает случайное число в диапазоне от 0 до 1. Эта функция будет выглядеть следующим образом.

F u n ctio n S t a t ic R a n d ()

 

1

Возвращ ает с л у ч а й н о е ч и с л о ,

к о т о р о е

'

не и зм е н я е т ся при п е р е с ч е т е

ф ормул

 

S ta t ic R a n d = R n d ()

 

End F u n c tio n

300

Часть III. Visual Basic for Applications

Если нужно сгенерировать набор случайных чисел между 0 и 1000, воспользуйтесь следующей формулой:

= I N T ( S t a t ic R a n d () * 1 0 0 0 )

Значения, полученные с помощью этой формулы, никогда не изменяются. Но у поль­ зователя остается возможность пересчета формулы с помощью комбинации клавиш <Ctrl+Alt+F9>.

Функция с одним аргументом

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

Объем продаж за месяц ($)

Ставка комиссионных (%)

0-9999

8,0

10000-19999

10,5

20000-39999

12,0

Больше 40000

14,0

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

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

=ЕС Л И (И (А 1> = 0/А 1 < = 9 9 9 9 .9 9 ) , А 1 * 0 .0 8 ,

ЕС Л И (И (А 1 > = 1 0 0 0 0 , А 1 < = 1 9 9 9 9 . 9 9 ) , А 1 * 0 .1 0 5 ,

ЕС Л И (И (А 1 > = 2 0 0 0 0 ,А1< = 39 9 9 9 . 9 9 ) , А 1 * 0 .1 2 ,

ЕСЛ И (А 1> = 40 0 0 0 ,А 1 * 0 . 1 4 , 0 ) ) ) )

Такая идея неудачна по нескольким причинам. Во-первых, формула чрезмерно слож­ на, и ее нелегко понять. Во-вторых, значения строго определены в формуле, из-за чего ее сложно изменять.

Рекомендуется применить описанный ниже подход (не требующий программирова­ ния на VBA): использовать для вычисления ставки комиссионных функцию просмотра таблицы соответствия ВПР (VLOOKUP). Например, следующая формула использует функцию ВПР для выборки значения комиссионных из диапазона T able, а также умно­ жает его на величину, которая хранится в ячейке А1.

= В П Р( A l , T a b le ,2 ) *А1

Еще лучше (тогда не нужно использовать таблицу соответствия) создать пользова­ тельскую функцию, представленную ниже.

F u n c t io n C o m m is s io n ( S a le s )

C o n s t T i e r l

= 0 .0 8

C o n s t

T ie r 2

= 0 .1 0 5

C o n s t

T ie r 3

=

0 .1 2

C o n s t T ie r 4

=

0 .1 4

' В ы ч и с л я е т к о м и с си о н н ы е с о б ъ ем а продаж S e le c t C a s e S a le s

C a se 0 T o 9 9 9 9 .9 9 : C o m m is s io n = S a le s * T i e r l

C a s e

1000

T o 1 9 9 9 9 .9 9 :

C o m m is s io n

=

S a le s

*

T ie r 2

 

C a se

200 0 0

T o 3 9 9 9 9 .9 9 :

C o m m is s io n

=

S a le s

*

T ie r

3