Уокенбах Формулы в Excel
.pdf•пропущенный аргумент
•логическое значение (ИСТИНА)
•выражение с использованием другой функции (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 |
|
i§ |
|
^ 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 |
