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

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

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

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

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

выражение с использованием другой функции (SQRT)

ссылка на диапазон (В1: В5)

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

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

1

Эмуляция

функции

СУММ

 

'

Объявление

переменных

 

 

Dim i As

Variant

 

 

 

Dim TempRange As Range, cell As Range

 

Dim ECode As String

 

 

 

Dim m,

n

 

 

 

 

 

 

MySum

= 0

 

 

 

 

 

1

Просмотр

аргументов

 

 

 

For i = 0 To UBound(args)

1

Пропуск

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

 

If Not

IsMissing(args(i)) Then

1

Определение

типа аргумента?

 

Select

Case

TypeName(args(i))

 

 

Case

"Range"

 

 

1

 

Создание

временного диапазона

 

 

 

Set TempRange = Intersect(args(i).Parent.UsedRange,

args(i))

 

 

 

 

 

 

 

 

 

 

For Each cell In TempRange

 

 

 

 

If

IsError(cell) Then

 

 

 

 

MySum

= cell ' возвращение ошибки

 

 

 

 

 

Exit

Function

 

 

 

 

 

End

If

 

 

 

 

 

 

If cell = True Or cell = False Then

 

 

 

 

 

MySum = MySum + 0

 

 

 

 

 

Else

 

 

 

 

 

 

If IsNumeric(cell) Or IsDate(cell) Then _

 

 

 

 

 

 

MySum = MySum + cell

 

 

 

 

 

End

If

 

 

 

 

 

Next

cell

'Следующая часть добавлена слишком поздно для включения в книгу

1Она необходима для поддержки строковых аргументов Case "Variant()"

n = args(i)

For m = LBound(n) To UBound(n)

MySum = MySum(MySum, n(m)) 'рекурсивный вызов Next m

Case "Null" 'игнорирование

Case "Error" 'возвращение ошибки MySum = args(i)

Exit Function

Case "Boolean"

' Проверка значения TRUE

570

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

 

 

If

args(i) = "True" Then MySum = MySum + 1

 

Case

"Date"

 

 

MySum = MySum + args(i)

 

 

Case

Else

 

 

MySum = MySum + args(i )

 

End

Select

End

If

 

Next

i

 

 

End Function

 

При

написании кода с использованием функцииMYSUM, помните о следующем:

Пропущенные аргументы (определяются функцией I sMi s s ing) просто игнорируются.

Для определения типа аргумента в процедуре используется функция VBA TypeName

(Range, E r r o r или др.). Каждый тип аргумента обрабатывается по-своему.

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

Тип функции v a r i a n t , поскольку функция должна возвращать ошибку, если один из аргументов является значением ошибки.

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

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

При работе с логическими аргументами нужно быть очень внимательным. Чтобы MySum могла заменить СУММ,нужно проверить наличие ИСТИНА в списке аргументов

икомпенсировать разность (т.е., если прибавить 2 к -1, то получится 1).

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

Возможно, возникнут вопросы по поводу относительной производительности СУММ и MySum. Конечно, MySum работает намного медленнее, но насколько медленно, зависит от производительности системы и самих формул. В моей системе рабочий лист с 1000 формулам СУММ вычисляется мгновенно. После того как я заменил функцию СУММ на MySum, на пересчет потребовалось 12 секунд. MySum у вас, может быть, работает немного быстрее, но скорости этих двух функцийнесравнимы.

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

Резюме

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

Глава 25. Примеры пользовательских функций VBA

571

Приложения

I

ПРИЛОЖЕНИЕ А

1Работа с импортированными

!файлами Lotus 1-2-3

[

ПРИЛОЖЕНИЕ Б

|

Описание функции Excel

|

ПРИЛОЖЕНИЕ В

|

Пользовательские форматы чисел

|

ПРИЛОЖЕНИЕ Г

|

Дополнительные ресурсы

ПриложениеА

Работа с импортированными файлами Lotus 1-2-3

Когда-то Lotus 1-2-3 было основным приложением для работы с электронными таблицами. Теперь этого удостоена Excel, что и использует в 90 случаев из 100 для управления таблицами. Конечно, некоторые пользователи до сих пор используют Lotus 1-2-3, и может возникнуть ситуация, когда нужно импортировать файл, созданный в Lotus 1-2-3. Поэтому информация этого приложения может быть полезной.

0 файлах Lotus 1-2-3

На сегодняшний день существует много версий Lotus 1-2-3, и файлы Lotus 1-2-3 могут представляться в различных форматах. В табл. АЛ приведены наиболее часто встречаемые файлы Lotus 1-2-3.

| Таблица А*1.Типыфайлов Lotus 1-2-3

J S

Расширение файла

Описание

 

 

WKS

Создан вLotus 1 -2-3 for DOS Release

1.0 и 1 .Oa. Вэтих файлах содерж

 

ся один лист. Excel может получать изаписывать такие файлы.

WK1

Создан вLotus 1-2-3 for DOS Release 2.x. Вэтих файлах содержится оди

 

лист иможет содержаться приложение *.FMT или *.А1± синформацией о

 

форматировании. ВExcel можно получать такие файлы, но сохранять

 

только активный лист.

 

 

WK3

Создан вLotus 1-2-3 for DOS Release 3.xиLotus 1-2-3 для Windows верс

 

1.0. Вэтих файлах может содержаться несколько листов иможет нахо-

 

диться приложение *.FM3 с информацией оформатировании. ВExcel та-

 

кие файлы можно получать исохранять.

 

WK4

Создан в Lotus 1 -2-3 for Windows Release 4.0. Вэтих файлах содержитс

 

несколько листов. ВExcel можно записывать ичитать такие файлы.

123

Создан Lotus 1-2-3 for Windows Release 5иMillennium Edition. ВExcel та

 

кие не читаются ине записываются.

 

Увеличение размера файла

Импортировав файл Lotus 1-2-3 и сохранив его как файл Excel можно обнаружить, что размер файла значительно увеличился, что заметно замедляет его открытие и сохранение. Наиболее вероятной причиной этого является то, что импортированный файл Lotus 1-2-3 содержит целые предварительно форматированные столбцы. Когда Excel импортирует такой файл, он преобразует все в форматированные ячейки — даже если они пусты. Чтобы выйти из подобной ситуации, выделите все пустые строки под последней непустой ячейкой рабочего листа и удалите их. Снова сохраните рабочую книгу, и размер файла должен стать более правдоподобным.

574

При импортировании или экспортировании файлов Lotus 1-2-3 не следует ожидать идеального преобразования. В справочной системе Excel описаны возможные ограничения.

Excel поддерживает связи файлов с рабочими книгамиLotus 1-2-3. Однако это средство ограничено работой с файлами WKS, WK1,WK3и WK4(не самые последние форматы файлов Lotus 1-2-3). В некоторых случаях ссылки нужно обновить явно. Дляэтого воспользуйтесь командойПравка^Связи ищелкните накнопкеОбновить.

Формулы Lotus 1-2-3

В одних случаях формулы в импортированном файле Lotus 1-2-3 прекрасно работают в Excel. В других случаях формулы некорректно преобразуются, и их нужно редактировать и переписывать.

Некоторые формулы Excel высчитывает иначе, чем в Lotus 1-2-3. Эти формулы можно разделить натри категории:

С использованием текста в вычислениях

С использованием логических значений (ИСТИНАили ЛОЖЬ)

С использованием критериев баз данных

Чтобы в Excel воспользоваться методами вычисления формул, принятыми в Lotus 1-2-3, выберите команду Сервис^Параметры. В диалоговом окне Параметры перейдите на вкладку Переход ивыставьте флажок опции Производить вычисления по правилам Lotus 1-2-3.

При открытии файла Lotus 1-2-3 параметр Производить вычисления поправилам Lotus 1-2-3 активизируется автоматически, чтобы указать Excel, что вычисления формул будут выполняться по правилам Lotus 1-2-3.

Пусть Excel научит

Если переходить от старых DOS-версий Lotus 1-2-3 к более новым, то можно обнаружить, что Excel помогает осуществлять такой переход. Секрет таится в команде Справка^Справка по Lotus 1-2-3. При выборе этой команды отображаетсядиалоговое окно с перечисленными в левой части командами1-2-3.

Выберите команду Lotus 1-2-3, и Excel отобразит инструкции или даже покажетсоответствующую команду меню. Например,если вы ужедавно работаете с Lotus 1-2-3 для DOS, то знаете, что для удаления имени нужно воспользоваться командой /rnd (от Range Name Delete). Если этукоманду ввести в диалоговом окне Справка для пользователей Lotus 1-2-3, то появятся инструкции с описаниемтого, как выполнить это действие вExcel.

Если вами планируется повсеместное использование импортированных файлов Lotus 1-2-3, то следует подумать о преобразовании формул, которые некорректно вычисляются, и отключить параметр Производить вычисления по правилам Lotus 1-2-3. Это поможет избежать путаницы тем, ктонезнаком с Lotus 1-2-3.

В следующих разделах предложены советы по преобразованию формул Lotus 1-2-3 так, чтобы они корректно работали в Excel (без активизации ойции Производить вычисления

по правилам Lotus 1-2-3).

Приложение А. Работа симпортированными файлами Lotus 1-2-3

575

Порядок вычислений

Вычисление формул в Excel и в Lotus 1-2-3 отличаются. Во время вычислений в Lotus 1-2-

3сначала выполняется действие с оператором возведения в степень (Л),а затем вычитание (-).

ВExcel принят обратный порядок. Рассмотрим следующую формулу:

= -3Л 2

Lotus 1-2-3 возвратит значение -9, a Excel— число +9. Чтобы получить одинаковые результаты, в Lotus 1-2-3 формулу нужно изменить таким образом:

Текст ввычислениях

В Lotus 1-2-3 считается, чтоячейки, содержащие текст, имеют нулевое значение, если они используется в формуле с математическими операторами. Excel втаких случаях возвращает ошибку.

Если параметр Производить вычисления по правилам Lotus 1-2-3активизирован, то Excel воспринимает текст какнулевое значение.

Следующая формула корректно работает в Lotus 1-2-3 (и возвращает 12). В Excel эта формула возвращает значение #ЗНАЧ!.

="Dog"+12

Подобно этому, если в ячейке А1 содержится текст Dog, а в ячейке А2 содержится значение 12, то следующая формула корректно работает вLotus 1-2-3, а в Excel возвращает ошибку:

=А1+А2

Тем не менее, Excel позволяет использовать ссылки на ячейки с текстом в аргументах функций, и обрабатывает такие ссылки. Например, следующая формула прекрасно работает как в Lotus 1-2-3, так и в Excel, даже если в диапазоне Al: A10 содержится текст:

=СУММ(А1:А10)

Этот факт можно использовать для преобразования формул Lotus 1-2-3, таких как =А1+А2, в следующий вид:

=СУММ(А1;А2)

Логические значения

В результате вычисления логических выражений в Lotus 1-2-3 возвращается 1 или0. Excel отображает этизначения в виде ИСТИНА и ЛОЖЬ. Значение ИСТИНА эквивалентно 1 в Lotus 1- 2-3, а ЛОЖЬ — 0.

Если параметр Производить вычисления по правилам Lotus 1-2-3активизирован, то вместо результата ложь Excel отобразит 0, а вместо ИСТИНА — 1.

Например, в Lotus 1-2-3 следующая формула возвратит либо 1, либо 0, в зависимости от содержимого ячеек А1 и А2. В Excel эта формула возвратит либо ИСТИНА, либоЛОЖЬ.

576

Такое различие важно, если в рабочем листе для проверки 0 или 1 используются функции ЕСЛИ.Например,следующая формула возвратит различные результаты вLotus 1-2-3 ивExcel:

=ЕСЛИ(А1<А2 = 1;В1;В2)

Чтобы эта функция корректно работала вExcel, измените ееследующим образом:

=ЕСЛИ(А1<А2;В1;В2) '

В Lotus 1-2-3 используются такие логические операторы: #AND #, #NOT# и #OR#. В Excel вместо нихиспользуются логические функции (И, НЕи ИЛИ). Например, следующая формула Lotus 1-2-3 возвратит строку yes, если ячейка А1 =12 и А2 =12, и строку по, если обе ячейки не равны 12:

@IF(A1=12#AND#A2=12, "yes", "no") Эквивалент этой формулы вExcel выглядит так:

=ЕСЛИ(И(А1=12;А2=12);"yes";"по")

Проблемы сдатами

Если в импортированных рабочих листах содержатся даты с дефисами-разделителями (например, 12-31-98), то такие даты могут остаться нераспознанными в Excel. Скажем, Excel интерпретирует содержимое ячейки как формулу:

=12-31-98 Такие ячейки нужно отредактировать, чтобы они корректно отображались.

Критерии базы данных

Если в импортированном рабочем листе используются диапазоны с критерием базы данных (например, дополнительная фильтрация), следует быть особенно внимательным. При извлечении данных, поиске данных ииспользовании функций баз данных диапазоны с критерием баз данных вычисляются по-другому. Например, в 1-2-3 критерию "Ben" соответствуют только те строки, в ячейках которых содержится значение Ben. ВExcel критерию "Ben" удовлетворяют строки, в которых содержимое ячеек начинается сBen -—втом числе Benjamin, Benny и Benito.

Как бытьсмакросами Ш и э Ш Ш

Некоторые макросы Lotus 1-2-3 выполняются в Excel —макросы, активизируемые склавиатуры, разработаны в ранних версиях Lotus 1-2-3. Они хранятся непосредственно в рабочем листе и соответствуют сочетаниям клавиш. Идеальной совместимости ожидать не следует.

Обычно для таких макросов используют имена диапазонов, например, \ t . Этот макросвыполняется при нажатии клавиш <Ctrl+T>.Таким образом, специальные имена приемлемы, если онисодержатся вимпортированном файле. Но такое имянельзя создать вExcel.

Если файлы Lotus 1-2-3 конвертировать в Excel, то наилучшим выходом является восстановить макрос с помощью VBA. Таким образом можно увеличить производительность и упро-

Lстить сохранение макросов.

Если параметр Производить вычисления по правилам Lotus 1-2-3 активизирован, то использование критерия баз данных в Excel подобно его использованию вLotus 1 -2-3.

Приложение А. Работа симпортированными файлами Lotus 1-2-3

577

Совместимость функций Lotus 1-2-3

У большинства функций рабочего листа в Lotus 1-2-3 есть эквиваленты в Excel. В некоторых случаях соответствие не совсем точное. К счастью, справка по Excel предоставляет полное описание различий между функциями рабочего листа Lotus 1-2-3 и Excel.

Функции конвертирования баз данных

При работе с функциями баз данных Lotus 1-2-3 (например, @DSUM и @DCOUNT) всегда возникает одна и та же проблема. Lotus 1-2-3 позволяет в качестве аргумента задать критерий. Обратимся к рис. АЛ, на котором показан файл Lotus 1-2-3, импортированный в Excel. Следующая формула (в ячейке Е4) была некорректно преобразована, из-за чего отобразилась ошибка:

=БСЧЁТА(А1:С17;"Product";M(PRODUCT="Widget";MONTH="January"))

Jfproduct

Sold By

^ Month

 

U

Swidget

Jones

January

 

 

g | Sprocket

Smith

January

 

^ S p r o c k e t

Jones

January

I #NAME? Records qualify j

1

l l

W i d 9

e t Ken deli

January

 

ft

Л

Widget

Kendel!

January

 

Щ

«Sprocket

Kendell

January

 

''<

 

^:

SjHWidget

Jones

January

 

 

 

Щ|| Sprocket

Smith

January

 

f'

SWidget

Smith

February

 

 

 

 

 

 

1^

Ж / Widget

Jones

February

 

fe'

 

Sprocket

Kendel!

February

 

 

ЯSprocket

Kendelt

February

 

 

i

Sprocket

Jones

February

 

 

Widget

Smith

February

 

 

I

Widget

Smith

February

 

 

шsSprocket

Kendell

February

 

 

ss

 

sesm

 

 

 

Рис. A.L В импортированном

файле Lotus 1-2-3 используется функ-

ция &DCOUNT с аргументом критерием, не поддерживаемым в Excel

Исходная формула Lotus 1-2-3 должна возвращать количество записей, в которых P r o d u c t является Widget, a Month — January. Исходная формула (до конвертирования в Excel) была такой:

©DCOUNT(Al:C17, "Product",PRODUCT="Widget" #AND#MONTH="January")

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

Установить особый диапазон критерия для функцииДСЧЁТЗ

Воспользоваться другой функцией — в данном случае функциейСЧЁТЕСЛИ

На рис. А.2 показан диапазон критериев в Е 1 : Е2. Следующая формула возвращает количество записей, в которых P r o d u c t является Widget, a Month — January: =ДСЧЁТА(Al:С17,"Product",El:F2)

578

Приложения

ИЗ s*lrs wk4

 

шшШШШш

 

 

 

Product

Sold By

 

 

 

Month

Product

Month

 

Widget

Jones

January

Wtdget

January

 

Sprocket

Smith

January

 

 

 

ISprocket

Jones

January

I

4 Records qualify

| <

Widget

'Kendell

January

 

 

 

Widget

Kendell

January

 

 

 

Sprocket

Kendell

January

 

 

 

Widget

Jones

January

 

 

 

IfSprocket

Smith

January

 

 

 

Widget

Smith

February

',

\

;i

Widget

Jones

February

жSprocket

Kendell

February

 

 

 

JJ^ Sprocket

Kendell

February

 

 

 

^Sprocket

Jones

February

 

 

i

Ifgwidget

Smith

February

 

 

 

JSjWidget

Smith

February

 

 

 

jf^jSprocket

Kendell

February

 

 

 

Рис. А.2. Использование диапазона критерия для формулы ДСЧЁТЗ

Можно также воспользоваться формулой массива, в которой не нужен диапазон критерия. Следующая формула является эквивалентом Excel некорректно преобразованной формулы 0DCOUNT:

{=СУММ( (А2:А17=Н Widget") * (С2 :С17=" January") ) }

Введите формулу массива с помощью клавиш <Ctrl+Shift+Enter>. He ставьте скобок — Excel поставит их сам. Более подробно о формулах массивов рассказано в части III.

Приложение А. Работас импортированными файлами Lotus 1-2-3

579