Глава 20. Создание мегаформул 513
Таблица 20.2. Промежуточные формулы в первой строке рабочего листа,
показанного на рис. 20.3
Ячейка Промежуточная формула Описание действия
В1 =СЖПРОБЕЛЫ(А1) Удаляет лишние пробелы
С1 =НАЙТИ(" ";В1;1) Находит позицию первого пробела
D1 =НАЙТИ(" ";В1;С1+1) Находит позицию второго пробела, если
он есть
Е1 =ЕСЛИОШИБКА(Dl;С1) Использует первый пробел, если второго
не существует
F1 =ЛЕВСИМВ(В1;Cl-1) Извлекает имя
G1 =ПРАВСИМВ(В1;ДЛСТР(В1)-Е1) Извлекает фамилию
Н1 =F1&" "&G1 Объединяет имя и фамилию
Обратите внимание, что в ячейке Е1 используется функция ЕСЛИОШИБКА, введенная
только в версии Excel 2007. Для совместимости с предыдущими версиями программы
вместо нее можно использовать другую формулу:
=ЕСЛИ(ЕОШИБКА( D l ) ; C 1 ; D 1 )
Примечание
Следует отметить, что данный алгоритм не идеален. Например, он не будет
работать, если в столбец А занесена только фамилия человека (например,
Сидоров). Также он не сработает, если присутствует два вторых имени (напри
мер, Джон Яков Роберт Смит). Этот недостаток обусловлен тем, что ф орму
ла ищет в записи второй пробел. В результате в данном случае формула вер
нет результат Джон Роберт Смит. Далее будет представлен метод формулы
массива, используемый для определения последнего пробела в строке.
Приложив немного усилий, можно устранить все промежуточные формулы и заме
нить их единственной мегаформулой. Такой результат достигается путем создания всех
промежуточных формул и последующего редактирования конечной результирующей
формулы (в данном случае находящейся в столбце Н). Все ссылки на ячейки заменяются
копиями формул в этих ячейках. К счастью, для копирования и вставки формул можно
использовать буфер обмена (см. выше). Этот процесс должен продолжаться до тех пор,
пока единственной ссылкой не останется ссылка на ячейку А1. По завершении процесса
будет получена следующая мегаформула, записанная в одной ячейке.
=ЛЕВСИМВ(СЖПРОБЕЛЫ( А 1 ) ; НАЙТИ(" " ; СЖПРОБЕЛЫ( А 1 ) ; 1 ) -
1 ) & " 11&ПРАВСИМВ (СЖПРОБЕЛЫ (А 1 ) ; ДЛСТР (СЖПРОБЕЛЫ (А1) ) -
ЕСЛИОШИБКА(НАЙТИ(" СЖПРОБЕЛЫ( А 1 ) ;
НАЙТИ(" " ; СЖПРОБЕЛЫ(А1) ) + 1 ) ; НАЙТИ(" " ; СЖПРОБЕЛЫ(А1) ) ) )
Если формула работает правильно, столбцы с промежуточными формулами можно
удалить, так как они больше не используются.
Пошаговое описание процедуры
Если вам все еще не до конца понятен данный процесс, ниже приведено пошаговое
описание используемой процедуры.
1. Посмотрите на формулу в ячейке Н1 (см. рис. 20.3). В ней есть две ссылки (на
ячейки F1 и G1):
=F1&" "&G1
514 Часть V. Полезные методики применения формул
2. Активизируйте ячейку G1 и скопируйте формулу (без знака равенства) в буфер
обмена.
3. Активизируйте ячейку Н1 и замените ссылку на ячейку G1 содержимым буфера
обмена. Теперь в ячейке Н1 будет содержаться следующая формула:
=F1&" " &ПРАВСИМВ(В1; ДЛСТР(В1) - Е 1 )
4. Активизируйте ячейку F1 и скопируйте формулу (без знака равенства) в буфер
обмена.
5. Активизируйте ячейку Н1 и замените ссылку на ячейку F1 содержимым буфера
обмена. Теперь в ячейке Н1 будет содержаться следующая формула:
=ЛЕВСИМВ(В1 ; C l - 1 ) & " " &ПРАВСИМВ(В1; ДЛСТР(В1) -Е 1 )
6. Теперь формула в ячейке Н1 содержит ссылки на три ячейки ( B l, С1 и Е1). Эти
ссылки необходимо заменить формулами, содержащимися в данных ячейках.
7. Замените ссылку на ячейку Е1 формулой, которая включена в данную ячейку. Ре
зультат будет следующим:
=ЛЕВСИМВ(B l ; C l - 1 ) & " " &ПРАВСИМВ(В 1 ; ДЛСТР(В1) -ЕСЛИОШИБКА(D 1 ; С 1))
8. Теперь формула в ячейке Н1 имеет ссылку на ячейку D1. Скопируйте формулу из
ячейки D1 и замените обе ссылки на нее. Формула примет следующий вид:
=ЛЕВСИМВ(В1;С1-1)&" "&ПРАВСИМВ(В1; ДЛСТР(В1) -
ЕСЛИОШИБКА(НАЙТИ(" " ; В 1 ; С 1 + 1 ) ; С 1 ) )
9. Замените три ссылки на ячейку С1 формулой, содержащейся в данной ячейке. Ре
зультат будет таким:
=ЛЕВСИМВ(В1; НАЙТИ(" " ; B l ; 1 ) - 1 ) & " " &ПРАВСИМВ(В1; ДЛСТР(В1) -
ЕСЛИОШИБКА( НАЙТИ( " " ; В 1 ; Н А Й Т И ( " В 1 ) + 1 ) ; НАЙТИ( " " ; В 1 ) ) )
10. И наконец, замените семь ссылок на ячейку В1 формулой, содержащейся в дан
ной ячейке:
=ЛЕВСИМВ(СЖПРОБЕЛЫ(А1) ; НАЙТИ(" " ; СЖПРОБЕЛЫ(А1) ; 1 ) -
1)&" "&ПРАВСИМВ(СЖПРОБЕЛЫ(А1); ДЛСТР(СЖПРОБЕЛЫ(А1) ) -
ЕСЛИОШИБКА(НАЙТИ(" " ; СЖПРОБЕЛЫ(А1) ;
НАЙТИ(" " ; СЖПРОБЕЛЫ(А1) ) + 1 ) ; НАЙТИ(" " ; СЖПРОБЕЛЫ(А1) ) ) )
Обратите внимание на то, что ячейка Н1 теперь содержит ссылки только на А1. Сле
довательно, мегаформула готова. Она выполняет точно те же операции, что и все проме
жуточные формулы, которые теперь удалены.
После создания мегаформулы можете присвоить ей имя, чтобы упростить ее исполь
зование. Для этого выполните следующие операции.
1. Скопируйте текст мегаформулы в буфер обмена.В данном примере мегаформула
ссылается на ячейку А1.
2. Активизируйте ячейку В1, расположенную справа от ячейки, на которую ссыла
ется мегаформула.
3. Выберите команду Ф орм улы 1^ О п р е д е л е н н ы е и м е н а м П рисвоить и м я ^ П р и с в о -
ить имя. Активизируется диалоговое окно С о зд а н ие им ени.
4. В поле И мя введите произвольное слово, например Б езИ н и ц и ал о в.
5. В поле Д иапазон скопируйте текст мегаформулы.
6. Щелкните на кнопке О К, чтобы закрыть диалоговое окно создания имени.
Глава 20. Создание мегаформул 515
После выполнения этих операций можно ввести в любую ячейку следующую форму
лу, и она обработает содержимое ячейки, расположенной слева от нее:
=БезИнициалов
Например, если ввести эту формулу в ячейку К8, в ней будут отображаться имя и фа
милия из ячейки J 8 , но уже без инициалов.
Перекрестная ссылка
Создание и применение именованных формул более подробно рассматри
вается в главе 3.
В приведенной выше мегаформуле используется функция ЕСЛИОШИБКА, сущест
вующая только в версиях Excel 2007 и старше. Для совместимости с предыдущими вер
сиями можно использовать следующую мегаформулу:
=ЛЕВСИМВ(СЖПРОБЕЛЫ( А 1 ) ; НАЙТИ(" СЖПРОБЕЛЫ( А 1 ) ; 1 ) -
1)&" "&ПРАВСИМВ(СЖПРОБЕЛЫ( А 1 ) ; ДЛСТР(СЖПРОБЕЛЫ( А 1 ) ) -
ЕСЛИ(ЕОШИБКА(НАЙТИ(" " ; СЖПРОБЕЛЫ( А 1 ) ;
НАЙТИ(" ";СЖПРОБЕЛЫ( А 1 );1 )+ 1 ));НАЙТИ(" ";СЖПРОБЕЛЫ( А 1 );1 );
НАЙТИ(" " ; СЖПРОБЕЛЫ(А 1 ) ; НАЙТИ(" " ; СЖПРОБЕЛЫ(А1) ; 1 ) + 1 ) ) )
Сравнение скорости и эффективности
По причине сложности мегаформулы может показаться, что использование такой ме
тодики приводит к замедлению вычислений. На самом деле ничего подобного не проис
ходит. В качестве тестового примера была создана рабочая книга, использующая мега
формулу 150 тысяч раз. Затем была создана другая рабочая книга, в которой для получе
ния 150 тысяч результатов использовалось шесть промежуточных формул. Полученные
результаты времени вычислений и размера файла представлены в табл. 20.3.
Таблица 20.3. Сравнение промежуточных формул и мегаформулы
Метод Время пересчета (секунды) Размер файла
Промежуточные формулы 5,2 13,5 Мбайт
Мегаформула 2,8 3,07 Мбайт
Именованная мегаформула 2,8 2,67 Мбайт
Результаты, конечно же, будут зависеть от скорости процессора и объема установ
ленной оперативной памяти.
Использование мегаформулы в данном случае приводит к увеличению скорости вы
числений и существенному уменьшению размера рабочей книги.
Компакт-диск
Тестовые листы для проверки быстродействия данной мегаформулы приве
дены в файлах tim e t e s t in te r m e d ia te .x ls x , tim e t e s t m egafor
m ula, x l s x и tim e t e s t named m egaform ula . x l s x на прилагаемом ком
пакт-диске. Можете изменить имя в a i и протестировать быстродействие на
своем компьютере, воспользовавшись секундомером.
516 Часть V. Полезные методики применения формул
Использование мегаформулы для поиска позиции
последнего пробела в строке
Как уже отмечалось, в приведенном выше примере есть слабое место: для определе
ния второго имени формула выполняет поиск второго пробела. Более правильно было бы
искать последний пробел. К сожалению, в Excel нет простого способа определения пози
ции конкретного символа, первого с конца строки. В примере данного раздела приводит
ся решение указанной проблемы.
© Перекрестная ссылка
В данном методе были использованы массивы (для ознакомления с этой
тем ой можете обратиться к части IV).
В приведенном примере описывается создание мегаформулы, которая возвращает по
зицию последнего символа пробела в строке. При желании можете изменить данную
формулу для работы с любым другим символом.
Создание промежуточных формул
Основная идея сводится к созданию массива символов строки, расположенных в об
ратном порядке. После того как такой массив будет создан, мы сможем использовать
функцию ПОИСКПОЗ для нахождения первого пробела в массиве (т.е. последнего в ис
ходной строке).
На рис. 20.4 показан результат работы промежуточных формул. Ячейка А1 содержит
случайное имя, состоящее из 12 символов. В диапазоне В1 :В 1 2 содержится следующая
формула массива:
{=СТРОКА(ДВССЫЛ( " 1 : " &ДЛСТР(А1) ) ) }
Рис. 20.4. Все промежуточные формулы этого
листа будут преобразованы в мегаформулу
Компакт-диск
Демонстрируемые примеры содержатся в файле p o s i t i o n o f th e l a s t
s p a c e . x l s x (Chapter20_RUS . x s l x ) на прилагаемом компакт-диске.
Чтобы ввести формулу во всем диапазоне В 1 : В 12, вначале выделите его, затем вве
дите формулы и нажмите клавиши <Ctrl+Shift+Enter>. Фигурные скобки вводить не нуж
но; Excel добавит их автоматически для обозначения формулы массива. Данная формула
возвращает массив из двенадцати последовательных целых чисел'.
Глава 20. Создание мегаформул 517
В диапазоне С 1 : С12 содержится следующая формула массива:
{=ДЛСТР( A I ) + 1 - В 1 : В 1 2 }
Данная формула размещает целые числа, полученные в столбце В, в обратной после
довательности.
Диапазон D l : D12 содержит следующую формулу массива:
{ПСТР(A I ; C l : С 1 2 ; 1 ) }
Указанная формула использует функцию ПСТР для извлечения отдельных символов
из ячейки А1. Функция ПСТР использует в качестве второго аргумента массив C l : С12.
Результатом будет массив символов, расположенных в обратном порядке.
В ячейке Е1 содержится следующая формула:
=П0ИСКП03(" " ; D l :D 1 2 ;0)
Данная формула, не являющаяся формулой массива, использует функцию ПОИСКПОЗ
для получения позиции первого пробела в диапазоне D l :D 12. В примере, приведенном
на рис. 20.4, формула возвращает значение 6. Это говорит о том, что первый пробел яв
ляется шестым символом с конца в тексте ячейки А1.
В ячейке F1 содержится следующая формула:
=ДЛСТР(А1)+1-Е1
Эта формула возвращает позицию последнего пробела в строке.
Вам интересно, как все эти формулы объединить в одну? Следующий раздел ответит
на этот вопрос.
Создание мегаформулы
В данный момент в ячейке F1 содержится нужный нам результат. Объединим все
промежуточные формулы в одну. Цель состоит в том, чтобы создать формулу, содержа
щую ссылки только на ячейку А1. Вот последовательность действий, приводящая к на
меченной цели. *
1. Формула в ячейке F1 содержит ссылку на ячейку Е1. Замените данную ссылку
текстом формулы в ячейке Е1. В результате данного действия формула в ячейке
F1 приобретет такой вид:
=ДЛСТР(А 1) + 1 - ПОИСКПОЗ(" " ; D l :D 1 2 ;0)
2. Теперь формула содержит ссылку на диапазон D l : D12. Данный диапазон содер
жит одну формулу массива. Замена ссылки формулой массива приводит к появ
лению в ячейке F1 следующей формулы массива:
{ =ДЛСТР (А 1) +1 -ПОИСКПОЗ ( 11 " ; ПСТР (A I ; C l : С12 ; 1) ; 0) }
Примечание
Так как ссылка в ячейке F1 заменена ф ормулой массива, теперь вы должны
будете вводить ф орм улу в ячейке F1 как ф орм улу м ассива (после ввода
формулы нажмите клавиши <Ctrl+Shift+Enter>).
3. Теперь формула в ячейке F1 содержит ссылку на диапазон С 1 :С 1 2 , который
также содержит формулу массива. Замените ссылку на диапазон С1 :С12 содер
жащейся в нем формулой, перенеся данную формулу в ячейку F1.
{ =ДЛСТР(А 1) + 1 - ПОИСКПОЗ(" " ; ПСТР(А 1 ; ДЛСТР(А 1) + 1 - В 1 : В 1 2 ; 1 ) ; 0 ) }
518 Часть V. Полезные методики применения формул
4. Замените ссылку на диапазон В 1:В 12 содержащейся в нем формулой массива.
Ниже приведен полученный результат.
{=ДЛСТР(А 1 ) + 1 - ПОИСКПОЗ(" " ; ПСТР(А 1 ; ДЛСТР(А1) + 1 -
СТРОКА(ДВССЫЛ( " 1 : "&ДЛСТР(А1)) ) ; 1 ) ; 0 ) }
Итак, формула в ячейке F1 ссылается только на ячейку А1; именно такой результат
мы должны были получить. Мегаформула выполняет всю необходимую работу, поэтому
все промежуточные формулы можно смело удалить.
Примечание
Несмотря на то что в примере использовалась 12-значная запись и при со з
дании формулы использовались диапазоны из 12 строк, конечная формула
не имеет ни одной ссылки на эти диапазоны. Следовательно, данная мега
формула будет работать со строками любой длины.
Запуск мегаформулы
На рис. 20.5 показан рабочий лист, содержащий в столбце А список сотрудников.
Столбец В содержит мегаформулу, созданную в предыдущем подразделе. В столбце С
представлена формула, которая извлекает символы, следующие после последнего пробе
ла (они составляют фамилию, содержащуюся в столбце А).
Рис. 20.5. Столбец в содержит мегаформулу, ко
торая возвращает позицию последнего пробела в
записи, находящейся в столбце а
Например, в ячейке С1 содержится следующая формула:
= П Р А В С И М В (А 1 ;Д Л С Т Р (А 1 )-В 1 )
При желании можете удалить формулы из столбца В и создать специальную формулу,
возвращающую фамилию. Для этого замените ссылку на ячейку В1 содержащейся в ней
формулой. Результатом будет следующая формула массива:
{=ПРАВСИМВ(А1/ДЛСТР(А1)- (ДЛСТР(А1)+1-
ПОИСКПОЗ(" " /ПСТР(А1/ДЛСТР(А1)+ 1-
СТРОКА(ДВССЫЛ( " 1 : "&ДЛСТР(А1)) ) /1 ) / 0 ) ) ) }
Примечание
Текст формулы, скопированной из ячейки Bl, заключается в круглые скобки.
Если этого не сделать, последовательность вычислений в формуле будет
нарушена и будет получен некорректный результат.
Глава 20. Создание мегаформул 519
Использование мегаформулы для проверки номера
кредитной карточки
С помощью относительно сложного алгоритма анализа цифр в номере кредитной кар
точки можно определить корректность номера. Кроме того, проанализировав первые циф
ры и длину номера, программа может определить и тип кредитной карточки. В табл. 20.4
представлена информация, описывающая четыре основных типа кредитных карточек.
Таблица 20.4. Информация о четырех видах кредитных карточек
Кредитная карточка Начальные цифры Количество цифр
Mastercard 51-55 16
Visa 4 13 или 16
American Express 34 или 37 15
Discover 6011 16
Примечание
Проверка в данном случае означает определение правильности структуры
серийного номера кредитной карточки. Конечно же, данная методика не по
зволяет выяснить, соответствует ли номер фактическому лицевому счету
кредитной карточки.
Проверить номер кредитной карточки можно путем обработки контрольной суммы
составляющих его цифр. Номера счетов большинства кредитных карточек используют
десятичный алгоритм проверки знаков. Ниже приведены последовательные операции
стандартной процедуры.
1. Добавьте нули впереди номера счета для получения 16-значного числа.
2. Начиная с первой цифры, удвойте через раз цифры номера счета. Если в резуль
тате вы получите двузначное число, сложите обе цифры.
3. Сложите восемь значений, полученных на втором этапе, и сумму пропущенных
цифр исходного номера.
4. Если полученная на третьем этапе сумма без остатка делится на 10, номер кре
дитной карточки действителен.
В примере данного подраздела описана мегаформула, определяющая действитель
ность номера кредитной карточки.
Базовые формулы
На рис. 20.6 показан рабочий лист, созданный для анализа номера кредитной карточ
ки и его проверки. Для вынесения вердикта данная рабочая книга использует совсем не
большое количество формул.
Компакт-диск
Демонстрируемые примеры содержатся в файле c r e d it card v a l i d a
t i o n , x l s x (C h apter2o_ru s . x s l x ) на прилагаемом компакт-диске.
520 Часть V. Полезные методики применения формул
Рис. 20.6. Формулы данной рабочей книги определяют действитель
ность номера кредитной карточки
В представленной рабочей книге номер кредитной карточки вводится в ячейке F1,
без пробелов и дефисов. Далее вводится формула в ячейке F2. Данная формула при не
обходимости добавляет нули в начале номера до получения 16-значного номера. Осталь
ные формулы используют строку в ячейке F2.
=ПОВТОР( " 0 " ; 1 6 -ДЛСТР( F I ) ) &F1
Предупреждение
При вводе номера кредитной карточки, содерж ащ его более 15 знаков, сле
дите, чтобы программа не округлила его до 15 знаков. Можно поместить пе
ред номером символ апострофа или предварительно применить к ячейке
текстовый формат с помощью команды Главная^Число^Числовой ф ормат^
Текстовый.
Столбец А содержит ряд целых чисел от 1 до 16, представляющих положение цифр
кредитной карточки.
Столбец В содержит формулы, извлекающие цифры из ячейки F2. Например, в ячей
ке В5 содержится следующая формула:
=ПСТР( $ F $ 2 ; А 5 ;1)
Столбец С содержит множители для каждого знака кредитной карточки: 2 и 1 поочередно.
Столбец D содержит формулы, выполняющие умножение чисел в столбце В на мно
жители в столбце С. Например, формула в ячейке D5 имеет следующий вид:
=В5*С5
Столбец Е содержит формулы, которые суммируют знаки, отображаемые в столбце D.
Однозначные числа возвращаются без изменений. Если число двузначное, в столбце Е
отображается сумма составляющих его цифр. Например, если в столбце D содержится
число 12, формула из столбца Е вернет значение 3 (т.е. 1+2). Данное действие выполня
ет следующая формула:
=ЦЕЛОЕ( ( D 5 / 1 0 ) +ОСТАТ( ( D 5 ) ; 1 0 ) )
Глава 20. Создание мегаформул 521
Ячейка Е21 содержит функцию СУММ, складывающую значения в столбце Е.
=СУММ(Е5:Е 2 0 )
Формула в ячейке G1 вычисляет остаток деления ячейки Е21 на 10. Если он равен ну
лю, номер кредитной карточки считается корректным, и формула отображает сообщение
ПРАВИЛЬНО. В остальных случаях формула возвращает сообщение НЕ ПРАВИЛЬНО.
=ЕСЛИ(ОСТАТ(Е21;1 0 ) = 0 ; "ПРАВИЛЬНО"; "НЕ ПРАВИЛЬНО")
Преобразование в формулы массива
Поскольку промежуточные формулы находятся в нескольких строках, конечная ме
гаформула будет формулой массива.
Сначала необходимо преобразовать все формулы в формулы массива. Заметьте, что
в столбцах А и С находятся значения, а не формулы. Для того чтобы значения можно бы
ло использовать в мегаформуле, они должны генерироваться формулами (если точнее,
формулами массива).
1. Введите в диапазоне А5 : А2 0 приведенную ниже формулу массива. Данная фор
мула возвращает ряд из 16 последовательных целых чисел:
{ =СТРОКА(ДВССЫЛ( " 1 : 1 6 " ) }
2. В столбце В выделите диапазон В5 : В 20 и введите следующую формулу массива,
извлекающую знаки из номера кредитной карточки:
{=ПСТР($ F $ 2 ;А 5 :А 2 0 ; 1 ) }
3. Затем в столбце С введите формулу массива, которая генерирует чередующиеся
значения, умножаемые на 2 и 1. Следующую формулу следует ввести в диапазон
С5 : С2 0:
{=ОСТАТ(СТРОКА(ДВССЫЛ"1 : 1 6 " ) ) ; 2 ) + l }
4. В столбце D выделите диапазон D5 :D2 0 и введите следующую формулу массива:
{=В5:В20*С5:С20}
5. В заключение выделите диапазон Е5 :Е 2 0 и введите представленную ниже фор
мулу массива.
{ =ЦЕЛОЕ( ( D 5 : D 2 0 / 1 0 ) +ОСТАТ( ( D 5 : D 2 0 ) ; 1 0 ) ) }
Теперь рабочий лист содержит пять столбцов из шестнадцати строк и всего лишь
пять реальных формул, являющихся многоячеечными формулами массива.
Построение мегаформулы
Процесс создания мегаформулы для данной задачи начинается с ячейки G1, содер
жащей конечный результат. Исходная формула в данной ячейке имеет такой вид:
=ЕСЛИ(ОСТАТ(Е21 ; 1 0 ) = 0 ; " ПРАВИЛЬНО" # "НЕ ПРАВИЛЬНО")
1. Вначале заменим ссылку на ячейку Е 21 содержащейся в ней формулой. Формула
в ячейке G1 приобретет следующий вид:
=ЕСЛИ(ОСТАТ(СУММ(Е5: Е 2 0 ) ; 1 0 ) = 0 ; "ПРАВИЛЬНО"; "НЕПРАВИЛЬНО")
2. Теперь заменим ссылку на диапазон Е5 : Е20 содержащейся в нем формулой мас
сива. Формула станет формулой массива, поэтому для ее ввода необходимо ис
пользовать комбинацию клавиш <Ctrl+Shift+Enter>. Формула в ячейке G1 после
данной подстановки принимает следующий вид:
522 Часть V. Полезные методики применения формул
{ =ЕСЛИ( ОСТАТ( СУММ( ЦЕЛОЕ( ( D 5 : D2 0 / 1 0 ) +
ОСТАТ( ( D 5 : D 2 0 ) ; 1 0 ) ) } ) ; 1 0 ) = 0 ; "ПРАВИЛЬНО"; "НЕПРАВИЛЬНО") }
3. Заменим ссылку на диапазон D 5 : D2 0 содержащейся в нем формулой массива.
Формула в ячейке G1 приобретет следующий вид:
{=ЕСЛИ(ОСТАТ(СУММ(ЦЕЛОЕ( ( В 5 : В 2 0 * С 5 : С 2 0 / 1 0 ) +
ОСТАТ( ( В 5 : В 2 0 * С 5 : С 2 0 ) ; 1 0 ) ) }) ; 1 0 ) = 0 ;
"ПРАВИЛЬНО"; "НЕПРАВИЛЬНО") }
4. Далее заменим ссылку на диапазон С5 :С2 0 содержащейся в нем формулой мас
сива. Обратите внимание, что текст скопированной формулы заключается в скоб
ки. Ниже показан полученный результат.
{=ЕСЛИ(ОСТАТ(СУММ(ЦЕЛОЕ( (В5:В20*(ОСТАТ(СТРОКА
(ДВССЫЛ ( " 1 : 1 6 " ) ) ; 2 )
+ 1 ) / 1 0 ) +ОСТАТ( (В5:В20*(ОСТАТ(СТРОКА(ДВССЫЛ"1:1 6 " ) ) ; 2 ) + 1 ) ) ;
1 0 ) ) } ) ; 1 0 ) = 0 ; " ПРАВИЛЬНО" ; " НЕ ПРАВИЛЬНО" ) }
5. Замена ссылки на диапазон В5 :В2 0 содержащейся в нем формулой массива при
ведет к следующему результату.
{=ЕСЛИ(ОСТАТ(СУММ(ЦЕЛОЕ( (ПСТР( $ F $ 2 ; А 5 : А 2 0 ; 1 ) *
(ОСТАТ(СТРОКА(ДВССЫЛ"1 : 1 6 " ) ) ; 2 ) + 1 ) / 1 0 ) +
ОСТАТ( (ПСТР( $ F $ 2 ; А 5 : А 2 0 ; 1 ) * (ОСТАТ(СТРОКА(ДВССЫЛ( " 1 : 1 6 " ) ) ; 2 ) +
1 ) ) ; Ю ) ) } ) ; 1 0 ) = 0 ; "ПРАВИЛЬНО"; "НЕ ПРАВИЛЬНО") }
6. Заменим ссылку на диапазон А 5 : А2 0 содержащейся в нем формулой массива.
Формула в ячейке G1 примет следующий вид.
{=ЕСЛИ(ОСТАТ(СУММ(ЦЕЛОЕ( (ПСТР( $ F $ 2 ; СТРОКА(ДВССЫЛ( " 1 : 1 6 " ) ; 1 ) *
(ОСТАТ(СТРОКА(ДВССЫЛ"1:1 6 " ) ) ; 2 ) + 1 ) / 1 0 ) +ОСТАТ( (n CTP($F$2;
СТРОКА(ДВССЫЛ( " 1 : 1 6 " ) ; 1 ) * (ОСТАТ(СТРОКА(ДВССЫЛ( " 1 : 1 6 " ) ) ; 2 ) +
1 ) ) ; 1 0 ) ) } ) ; 1 0 ) = 0 , "ПРАВИЛЬНО","НЕ ПРАВИЛЬНО")}
7. В заключение, заменим две ссылки на ячейку F2 формулой, содержащейся в дан
ной ячейке. После выполнения подстановок мы получим представленную ниже
формулу.
{=ЕСЛИ(ОСТАТ(СУММ( ЦЕЛОЕ( ( П СТ Р (ПОВТОР( " 0 " ; 16 -
ДЛСТР( А 2 )) S A 2 ; СТРОКА(ДВССЫЛ( " 1 : 1 6 " ) ) ; 1 ) *
(ОСТАТ(СТРОКА(ДВССЫЛ ( " 1 : 1 6 " ) ) ; 2 ) + 1 ) / 1 0 ) +
О С Т А Т ((ПСТР(ПОВТОР("0м ;16-ДЛСТР(А2))& А 2 ;СТ Р О К А ( Д В С С Ы Л ("1:16"));
1 ) * (ОСТАТ(СТРОКА(ДВССЫЛ ( " 1 : 1 6 " ) ) ; 2 ) + 1 ) ) ; 1 0 ) ) ) ; 1 0 ) = 0 ;
"ПРАВИЛЬНО"; "НЕ ПРАВИЛЬНО") }
Теперь можно удалить ставшие ненужными промежуточные формулы. Результирую
щая мегаформула, имеющая длину в 275 символов, выполняет работу 51 промежуточной
формулы!
Генерация случайных имен
Заключительный пример представляет собой полезное приложение, позволяющее ге
нерировать случайные имена и фамилии. В нем использованы три списка имен из Бюро
переписи населения США, состоящие из 4275 женских имен, 1219 мужских имен и
18839 фамилий. Все имена отсортированы по частоте использования населением США.
Мегаформула выбирает случайные имена, основываясь на вероятности их встречи в ре
альной жизни. Таким образом, созданный список случайных имен будет выглядеть впол
не реалистичным (распространенные имена в нем будут встречаться чаще редких).
Глава 20. Создание мегаформул 523
На рис. 20.7 показана эта рабочая книга. В ячейках В7 и В8 содержатся значения, оп
ределяющие вероятности того, будет ли случайное имя именем мужчины и будет ли оно
содержать среднее имя. Случайно сгенерированные имена начинаются с ячейки А Н .
Рис. 20.7. Эта рабочая книга содержит мегаформулу, генерирующую слу
чайные, но вполне реалистичные имена
Компакт-диск
Рабочая книга name g e n e r a t o r . x l s x (2 0 07 RUS . x l s x ) содержится на
прилагаемом компакт-диске.
Мегаформула имеет следующий вид (в ней использовано несколько имен).
=ЕСЛИ(СЛЧИС( ) < = P c t M a l e , ИНДЕКС(Mal e Name s, ПОИСКПОЗ(СЛЧИС( ) ,
M a l e P r o b a b i l i t y , - 1 ) ) , ИНДЕКС( Fe ma le N a me s , ПОИСКПОЗ(СЛЧИС( ) ,
F e m a l e P r o b a b i l i t y , - 1 ) ) ) &ЕСЛИ(СЛЧИС( ) < = P c t M i d d l e ," "&
ИНДЕКС( M i d d l e l n i t i a l s , ПОИСКПОЗ(СЛЧИС( ) , M i d d l e P r o b a b i l i t y , - 1 ) ) &
". и, "&ИНДЕКС( L a s t N a m e s , ПОИСКПОЗ(СЛЧИС( ) , L a s t P r o b a b i l i t y , - 1 ) )
Здесь я не буду приводить промежуточные формулы; вы можете их увидеть, открыв
указанную рабочую книгу.
Преимущества и недостатки мегаформул
Если вы ознакомились с представленными в данной главе примерами, то, несомнен
но, поняли, что основная задача мегаформул заключается в устранении промежуточных
формул. Это позволяет рационализировать рабочий лист, уменьшить размер файла рабо
чей книги и повысить скорость пересчета.
В чем же недостатки использования мегаформул? Для создания мегаформулы, есте
ственно, необходимо затратить дополнительные усилия и время. Кроме того, разобрать
ся в содержимом готовой мегаформулы практически невозможно даже человеку, ее соз
давшему. Если вы решили использовать мегаформулу, то, прежде чем приступить к ее
созданию, убедитесь, что промежуточные формулы работают правильно. При этом ре
комендуется отдельно хранить одну копию промежуточных формул на случай обнару
жения ошибки или необходимости внесения изменений.
Глава
Инструменты и методы
отладки формул
В этой главе...
♦ Что такое отладка формул
♦ Проблемы в формулах и их устранение
♦ Средства аудита Excel
Ошибки могут произойти везде. При создании формул Excel ошибки встречаются
весьма часто. В данной главе описаны наиболее распространенные ошибки в формулах,
а также представлены средства и методы, которые призваны помочь в создании формул,
корректно выполняющих свою работу.
Что такое отладка формул
Термин отладка используется для обозначения процесса идентификации и исправле
ния ошибок в компьютерных программах. Конечно, формулы Excel не являются ком
пьютерными программами. Вместе с тем, им присущи проблемы того же рода, что и
компьютерным программам. Если созданная формула не работает так, как предполага
лось, источник проблемы необходимо идентифицировать и устранить.
Конечная цель в разработке электронной таблицы состоит в получении правильного
результата. В простых рабочих листах обычно не возникает проблем, касающихся опре
деления правильности результатов. Но по мере увеличения размера и сложности рабочих
листов проверка достоверности становится более сложной задачей.
Внесение на рабочий лист изменений, даже весьма незначительных, может вызвать
эффект домино, который приведет к возникновению ошибок в других ячейках. Скажем,
можно случайно ввести значение в ячейке, ранее содержавшей формулу. Такая простая
ошибка зачастую существенно влияет на другие формулы рабочего листа, а сама ошибка
может быть обнаружена спустя большой промежуток времени после ее возникновения
(или вообще может быть никогда не обнаружена).
526 Часть V. Полезные методики применения формул
Поиск ошибок на рабочем листе
Использование электронных таблиц для компании может оказаться весьма риско
ванным занятием. Можно легко принять за достоверный любой результат, выдаваемый
электронной таблицей. Если такой результат используется для принятия важного ре
шения, гарантия того, что он является правильным, крайне необходима.
Исследований, связанных с ошибками в электронных таблицах, было проведено не
очень много. Выполненные в этом направлении работы выявили, что от 20 до 40 про
центов всех электронных таблиц содержат ошибки определенного типа. Если вам инте
ресны подобные исследования, посетите сайт Spreadsheet Research, поддерживаемый
Рэймондом Панко из Гавайского университета:
h ttp ://panko.cba.haw aii.ed u /ssr/
Проблемы в формулах и их устранение
Ошибки в формулах можно разбить на шесть общих категорий.
• Синтаксические ошибки. Возникла проблема с синтаксисом формулы. Например,
существуют непарные скобки или функция имеет неверное количество аргументов.
• Логические ошибки. Формула не возвращает ошибку, однако она логически не
правильна и возвращает неверный результат.
• Неверные ссылки. С логикой в формуле все в порядке, однако в ней использует
ся неверная ссылка на ячейку (например, формула СУММ может охватывать не все
данные, которые нужно просуммировать).
• Семантические ошибки. Примером семантической ошибки может служить не
верно написанное имя функции. Такую функцию Excel пытается интерпретиро
вать как имя и возвращает ошибку #ИМЯ?.
• Циклические ссылки. Циклическая ссылка встречается, когда формула прямо
или косвенно ссылается на ячейку, в которую она введена. Циклические ссылки
иногда создаются умышленно, но в большинстве случаев они приводят к возник
новению ошибки.
• Ошибка записи формулы массива. При вводе (или редактировании) формулы
массива необходимо использовать комбинацию клавиш <Ctrl+Shift+Enter>. Если
этого не сделать, Excel не распознает такую формулу как формулу массива. Если
вам повезет, Excel сообщит об ошибке; в худшем случае вы получите неправиль
ный результат, не подозревая об этом.
• Ошибка незавершенных вычислений. Формула не вычисляется в полном объе
ме. Microsoft признала наличие определенных проблем в драйвере некоторых вер
сий Excel. Для гарантии полного вычисления формул используйте клавиши
<Ctrl+Alt+F9>.
Синтаксические ошибки обычно легче всего обнаружить и устранить. В большинстве
случаев хорошо видно, в каком месте была допущена ошибка. Например, Excel не позво
лит ввести формулу с недостающими скобками. Другие синтаксические ошибки также
обычно приводят к возвращению в ячейке сообщения об ошибке.
В данном разделе описаны некоторые общие проблемы, возникающие в формулах,
а также даны советы по их обнаружению и устранению.
Глава 21. Инструменты и методы отладки формул 527
Непарные скобки
В формуле каждой открывающей (левой) скобке должна соответствовать закрывающая
(правая). Обычно, если в формуле отсутствует необходимая скобка, Excel не позволит вве
сти такую формулу. Исключением из данного правила являются простые формулы, исполь
зующие функцию. Например, если ввести следующую формулу (с недостающей закры
вающей скобкой), Excel примет ее и самостоятельно добавит недостающую скобку:
=СУММ(А1: 5 0 0
Формула может содержать равное количество открывающих и закрывающих скобок,
но при этом они могут быть расставлены неправильно. Для примера рассмотрим сле
дующую формулу, преобразующую текстовую строку таким образом, чтобы ее первый
символ стал прописным, а все остальные — строчными. Эта формула содержит пять пар
скобок, расставленных должным образом.
=ПРОПИСН(ЛЕВСИМВ(А1)) &ПРАВСИМВ(СТРОЧН(А1); ДЛСТР( A I ) - 1 )
Следующая формула также имеет пять пар скобок, однако расставлены они неверно.
В результате получается синтаксически правильная формула, которая возвращает невер
ный результат.
=ПРОПИСН(ЛЕВСИМВ(А1)&ПРАВСИМВ(СТРОЧН(А1); ДЛСТР( A I ) - 1 ) )
Часто неправильная расстановка скобок приводит к возникновению синтаксической
ошибки, сопровождаемой сообщением о том, что введено слишком много или слишком
мало аргументов функции.
© Совет
Excel может оказать вам помощь при работе с недостающими скобками. Ес
ли при редактировании формулы подвести указатель к скобке и немного по
дождать, Excel примерно на одну секунду выделит данную скобку и соответ
ствующую ей парную полужирным начертанием. К тому же соответствующие
друг другу вложенные скобки отображаются одним цветом, при этом каж
дый уровень вложенности имеет свой цвет.
Ячейки заполнены знаками ##########
Ячейка может быть заполнена набором символов “решетки” (#) по одной из следую
щих причин.
• Ширины столбца недостаточно для размещения отформатированного числового
значения. Чтобы исправить такую ситуацию, можно либо расширить ячейку, либо
использовать другой числовой формат.
• Ячейка содержит формулу, возвращающую некорректную дату или время. Напри
мер, Excel не поддерживает даты до 1900 года и отрицательные значения времени.
Попытка отображения таких значений приводит к заполнению ячейки символами
“решеток”. Увеличение ширины ячейки не исправляет данную ошибку.
Автокоррекция формул
При вводе формулы, содержащей синтаксическую ошибку, Excel пытается опреде
лить проблему и предлагает ее решение в окне, приведенном ниже (чтобы оно появи
лось, нужно набрать формулу вручную; если вставить формулу из буфера обмена, окно
автокоррекции на появится).
528 Часть V. Полезные методики применения формул
Будьте осторожны, принимая предлагаемые исправления, так как они не всегда оказы
ваются верными. Для примера введем следующую формулу (с недостающими скобками):
=СРЗНАЧ (СУММ(AI :А12 ; СУММ( В 1 : В12 ) )
Excel предложит представленное ниже исправление для формулы:
=СРЗНАЧ(СУММ(А1:А12;СУММ(В1:В12)))
Если вы без размышлений прим ете такие изменения, то получите синтаксически
корректную функцию, однако это будет не та функция, которая предполагалась.
На самом деле корректной функцией должна была быть следующая:
=СРЗНАЧ(СУММ( A I :А 1 2 ) ; СУММ(В1: В 1 2 ))
Пустые ячейки на самом деле не пусты
Возможно, вы думаете, что при нажатии клавиши <пробел> содержимое ячейки
уничтожается. На самом деле при этом вставляется невидимый символ пробела, что не
эквивалентно уничтожению содержимого ячейки.
Например, следующая формула возвращает количество заполненных ячеек в диапазоне
A I :А10. Если содержимое некоторых ячеек данного диапазона “удалено” с помощью кла
виши <пробел>, эти ячейки будут засчитаны, и формула вернет неверный результат.
=СЧЁТЗ(А1:А10)
Если формула не игнорирует пустые ячейки, проверьте, действительно ли они пусты. Что
бы найти ячейки, содержащие только символы пробела, выполните следующие операции.
1. Активизируйте диалоговое окно Н а й ти и за м е н и ть.
2. В поле Н а йти введите * * (т.е. звездочку, пробел и звездочку).
3. Установите флажок Я чейка целиком .
4. Щелкните на кнопке Н айти все.
Если хоть одна ячейка содержит только символы пробела, в нижней части окна Н а й
ти и з а м е н и ть будет приведен их список.
Лишние символы пробела
Если существуют формулы, сравнивающие текст, будьте особенно внимательны: не
которые строки могут содержать лишние пробелы. Проблема наличия лишних пробелов
особенно часто возникает при импорте данных из внешних источников.
Excel автоматически удаляет замыкающие пробелы при вводе данных вручную, одна
ко это не относится к текстовым строкам. Невозможно просто глядя на ячейку уверенно
сказать, содержатся ли в ней замыкающие пробелы.
На рис. 21.1 показан некоторый текст в столбце А. Ниже приведена формула в В1,
скопированная в другие ячейки столбца.
=СЖПРОБЕЛЫ(А 1 ) =А1
Глава 21. Инструменты и методы отладки формул 529
Эта формула возвращает значение ЛОЖЬ, если ячейка содер
жит ведущий пробел, замыкающий пробел или несколько пробе
лов, следующих один за другим. В данном примере после слова
С обака есть замыкающий пробел, хоть это и не видно.
Формула возвращает ошибку Рис. 21.1. Идентифика
ция лишних пробелов
Формула может вернуть одно из следующих значений ошибки:
• # Д Е Л / 0;
• #Н/Д;
• #ИМЯ?;
• #ПУСТО!;
• #ЧИСЛО!;
• #ССЫЛКА!;
• #ЗНАЧ!.
В последующих разделах рассмотрены возможные проблемы, вызывающие данные
ошибки.
Совет
Excel позволяет определять сп о со б отображ ения ош и бок на бумаге при п е
чати. Для доступа к данному средству щелкните на кнопке в правом конце
строки заголовка группы Разметка страницы^Параметры страницы. Во
вкладке Лист открывшегося диалогового окна можно выбрать один из спо
собов вывода ошибок на печать — как на экране, в виде пустых ячеек, в виде
прочерков, в виде ош ибок #н/д.
Трассировка ошибок
Зачастую ошибка в одной ячейке является результатом ошибки в другой ячейке, от
которой она зависит. Для трассировки формулы и поиска источника ошибки можно вос
пользоваться командой Формулы^Зависимости формул^Проверка наличия ош ибки^
Источник ошибки. Excel отобразит на экране стрелками путь от значения ошибки к ее
источнику.
После идентиф икации ош ибки с помощ ью команды Формулы1^ Зависимости ф о р м у л ^
Убрать стрелки ^У брать стрелки можно очистить рабочий лист от этих стрелок.
Ошибка #ДЕЛ/ 0!
Деление на нуль является недопустимой операцией. Если попытаться ее выполнить,
Excel отобразит хорошо знакомое значение ошибки # Д Е Л /0 !.
Так как Excel считает значение пустой ячейки равным нулю, данная ошибка будет
получена и при делении на отсутствующее значение. Это стандартная ситуация при соз
дании формул для еще не введенных значений (рис. 21.2). В ячейке D2 находится сле
дующая формула, которая скопирована вниз:
= (С2-В2)/С2
530 Часть V. Полезные методики применения формул
Компакт-диск
Все приведенные в главе примеры содержатся в рабочей книге Chap-
te r 2 i_ R U S . x s l x на прилагаемом компакт-диске.
Рис. 21.2. Ошибка #дел/о ! возникает в случае
отсутствия значений в столбце с
Эта формула находит разницу в процентах между значениями в столбцах В и С. На
чиная с июня данные отсутствуют, поэтому формула возвращает ошибку #ДЕЛ/0 !.
Чтобы исключить отображение ошибки, воспользуйтесь функцией ЕСЛИ, которая
проверяет наличие пустых ячеек в столбце С.
=ЕСЛИ(С2=0; (С 2-В 2)/С 2)
Данная формула выводит пустую строку, если ячейка С2 пустая или содержит нуль;
противном случае будет выведено вычисленное значение.
Еще одно решение заключается в использовании функции ЕСЛИОШИБКА для провер
ки существования любого условия ошибки. Следующая формула отобразит пустую стро
ку в случае получения ошибки любого типа:
=ЕСЛИОШИБКА( ( С 2 - В 2 ) / С 2 ) ;"")
В предыдущих версиях Excel (до Excel 2007) функции ЕСЛИОШИБКА нет. В этом слу
чае можно использовать альтернативную формулу:
=ЕСЛИ(ЕОШИБКА( ( С 2 - В 2 ) / С 2 ) ( С 2 - В 2 ) / С 2 ) )
Ошибка #н/д
Ошибка #Н/Д (нет данных) возникает, если в одной из ячеек, на которую ссылается
формула, отображается значение #Н/Д.
Совет
Некоторые пользователи для явного указания отсутствующих данных исполь
зую т обозначения = з н а ч () или # н / д (что значит “ недоступно” ). При этом ста
новится совершенно ясно, что данные недоступны, а не удалены случайно.
Ошибка #Н/Д возникает также тогда, когда какая-либо функция поиска не может
найти соответствие.
Глава 21. Инструменты и методы отладки формул 531
Ошибка #имя?
Ошибка #ИМЯ? возникает в следующих случаях.
• Формула содержит отсутствующее имя ячейки или диапазона.
• Формула содержит текст, который Excel интерпретирует как неопределенное имя.
Например, ошибка в написании имени функции приводит к отображению ошибки
#имя?.
• Формула использует функцию рабочего листа, определенную в надстройке, а дан
ная надстройка не установлена.
Примечание
В Excel часто возникают проблемы с именованными диапазонами. Если уда
лить имя ячейки или диапазона, используемое в формуле, формула и в
дальнейшем будет применять это имя, хоть оно больше не определено. Как
результат, формула отображает ош ибку #имя?. Если вы считаете, что Excel
автоматически преобразует имена в соответствующие ссылки на ячейки, то
глубоко заблуждаетесь. На самом деле в Excel даже не реализован меха
низм преобразования имен, используемых в формуле, в эквивалентные
ссылки на ячейки.
Ошибка #ПУСТ01
Данная ошибка возникает, когда формула пытается использовать пересечение двух
диапазонов, которые в действительности не имеют общих ячеек. Оператором пересече
ния областей является пробел между ссылками. К примеру, следующая формула возвра
щает значение #ПУСТО! , так как два указанных диапазона не имеют общих ячеек:
=СУММ(В5: В14 A 1 6 :F 2 0 )
Представленная ниже формула не возвращает значение #ПУСТО I. Вместо этого она
отображает содержимое ячейки В9, являющейся пересечением двух указанных диапазонов.
=СУММ(В5: В14 A 9:F 16)
Ошибка #числО!
Ошибка #ЧИСЛО! возникает в одном из следующих случаев.
• Для функции, принимающей числовой аргумент, задан аргумент другого типа.
• В функцию передан недопустимый аргумент. Например, ошибку #ЧИСЛО! вернет
следующая формула:
=КОРЕНЬ( - 1 )
• Использующая итерации функция не может вычислить результат. К функциям,
использующим итерации, относится, например СТАВКА.
• Формула возвращает слишком большое или слишком малое значение. Excel под
держивает числовые величины в пределах о т -1 Е -3 0 7 д о 1 Е + 3 0 7 .
Ошибка «с с ы л к а 1
Ошибка «ССЫЛКА! возникает в случае использования формулой ошибочной ссылки
на ячейку. Данная ошибка может возникнуть в следующих ситуациях.
532 Часть V. Полезные методики применения формул
• Ячейка, на которую ссылалась формула, была удалена. Например, представленная
далее формула отображает ошибку #ССЫЛКА!, если удалена строка 1, столбец А
или столбец В.
=А1/В1
• Удален рабочий лист с ячейкой, на которую ссылается формула. Например, сле
дующая формула возвращает ошибку #ССЫЛКА! , если удален Л и с т 2 .
= Л и с т 2 !А1
• Формула скопирована в новое место, где относительные ссылки на ячейки стано
вятся недействительными. Например, если скопировать следующую формулу из
ячейки А2 в ячейку А1, формула вернет ошибку #ССЫЛКА!, так как в ней будет
присутствовать ссылка на несуществующую ячейку.
=А1 -1
• Ячейка была вырезана (с помощью команды Г л а в н а я ^ Б у ф е р о б м е н а ^ В ы р е
зать или в результате нажатия <Ctrl+X>) и затем вставлена в ячейку, на которую
ссылается формула. Формула отобразит ошибку #ССЫЛКА!.
Ошибка #ЗНАЧ!
Ошибка #ЗНАЧ ! весьма распространена; она встречается в следующих ситуациях.
• В качестве аргумента функции использованы данные несоответствующего типа
или же формула пытается выполнить операцию, используя некорректные данные.
Например, формула, складывающая значение с текстовой строкой, вернет ошибку
#ЗНАЧ!.
• В качестве аргумента функции применяется диапазон, тогда как аргументом
должно быть единственное значение.
• Пользовательская функция на языке VBA не вычислена. В некоторых версиях Excel
вставка или перемещение листов может приводить к возникновению данной ошиб
ки. Для принудительного пересчета воспользуйтесь клавишами <Ctrl+Alt+F9>.
• Пользовательская функция пытается выполнить недопустимую операцию. Напри
мер, она не может изменить среду Excel или внести изменения в другие ячейки.
• При вводе формулы массива вы забыли нажать клавиши <Ctrl+Shift+Enter>.
Обращайте внимание на цвет фона ячейки
При редактировании содержимого ячейки, включающей формулу, Excel использует
цветовое выделение для обозначения ссылок на ячейки и диапазоны. При этом на ра
бочем листе контурами такого же цвета выделяются соответствующие ячейки и диапа
зоны. Таким образом, вы имеете возможность визуально просм отреть используемые
формулой данные.
Цветные контуры можно изменять, модифицируя ссылки на ячейку или диапазон.
Для изменения используемой ссылки перетащите границу контура или маркер выделе
ния (который находится в правом нижнем углу контура). Использовать данный прием,
как правило, легче, чем вручную изменять формулу.
Глава 21. Инструменты и методы отладки формул 533
Проблемы с абсолютными и относительными ссылками
Как уже отмечалось в главе 2, ссылки на ячейки могут быть относительными (на
пример, А1), абсолютными (например, $ А $ 1 ) и смешанными (например, А $1 или $А1).
Тип ссылки становится существенным только при копировании формулы в другие ячейки.
Довольно часто ошибки возникают вследствие использования относительных ссылок
вместо абсолютных. На рис. 21.3 ячейка С1 содержит ставку налога, используемую в
формулах столбца С. Формула в ячейке С4 имеет следующий вид:
=В4+(В4*$С$1)
Рис. 21.3. Формулы в ячейках С 4 : С 6 использу
ют абсолютную ссылку на ячейку c i
Обратите внимание, что ссылка на ячейку С1 является абсолютной. При копировании
формулы в другие ячейки столбца С она продолжает ссылаться на ячейку С1. Если бы
ссылка на ячейку С1 была относительной, формула возвращала бы неверный результат.
Проблемы приоритета операторов
В Excel установлены строгие правила относительно порядка выполнения математиче
ских операций. В табл. 21.1 приведены операторы с указанием их приоритета (чем
меньше число, тем раньше выполняется оператор). Например, из данной таблицы видно,
что умножение имеет более высокий приоритет, чем сложение; поэтому умножение бу
дет выполняться раньше.
Таблица 21.1. Приоритет операторов в формулах Excel
Символ Оператор Приоритет
- Смена знака (обращение) 1
% Процент 2
Степень 3
А Умножение и деление 4
* И/
+и - Сложение и вычитание 5
Объединение текста 6
5с Сравнение 7
=, с, > И о
Если у вас возникают сомнения в вопросах подобного рода (или если вы просто хоти
те сделать выражение более понятным), используйте круглые скобки. Использование
круглых скобок гарантирует выполнение операций в четко определенном порядке.
К примеру, следующая формула умножает ячейку А1 на ячейку А2, а затем к результату
534 Часть V. Полезные методики применения формул
добавляет 1. Умножение выполняется раньше, так как данная операция имеет более вы
сокий приоритет.
=1+А1*А2
Ниже представлена более наглядная запись данной формулы. Использование скобок
не обязательно, но с ними порядок выполнения действий становится очевидным.
= 1+ (А1*А2)
Обратите внимание на то, что операторы обращения и вычитания выглядят одинако
во, что может приводить к путанице. Рассмотрим две формулы.
=-3"2
=0-3^2
Первая формула, как и ожидается, возвращает значение 9; вторая возвращает значе
ние -9 . Возведение в квадрат всегда дает положительный результат, поэтому возникает
вопрос: как же программа получила отрицательное значение?
Дело в том, что в первой формуле знак “минус” является оператором обращения
и имеет более высокий приоритет. Во втором же случае знак “минус” — это оператор
вычитания, имеющий приоритет ниже, чем оператор возведения в степень. Таким обра
зом, значение 3 возводится в квадрат, а затем результат вычитается из нуля, что и дает
отрицательное значение.
Примечание
Интерпретация оператора обращения в Excel довольно необычна. Другие
электронные таблицы (например, Lotus 1-2-3 или Quattro Pro) возвращают
-9 в обеих формулах. Более того, при использовании языка VBA в Excel так
же возвращается результат -9 для этих выражений.
Использование круглых скобок в приведенной ниже формуле заставляет Excel интер
претировать оператор как знак “минус”, а не как оператор обращения. Данная формула
возвращает значение 9.
=(-3)^2
Формулы не вычислены
Если в рабочем листе применяются пользовательские функции, написанные на VBA,
может случиться так, что у использующей их формулы возникают проблемы с пересче
том, и формула возвращает неверный результат. Для принудительного пересчета всех
формул используйте комбинацию клавиш <Ctrl+Alt+F9>.
Реальные и отображаемые значения
Вы можете столкнуться с ситуацией, когда кажется, что сложение значений выполня
ется с ошибкой. На рис. 21.4 показан рабочий лист, содержащий в каждой из ячеек диа
пазона В2 : В4 следующую формулу:
=1/3
Ячейка В5 содержит следующую формулу:
=СУММ(В2:В4)
Глава 21. Инструменты и методы отладки формул 535
Все эти ячейки отформатированы для отображения чисел .
с тремя знаками после запятой. Можно предположить, что
формула в ячейке В 5 дает неправильный результат (казалось
бы, результат должен быть равен 0 ,9 9 9 ). Однако данная
формула возвращает правильный результат, так как она ис
пользует реальные значения из диапазона В2 :В 4 , а не ото- рис 21.4 . Простая демонст-
бражаемые на экране. рация “неправильного” сло-
Вы можете дать указание Excel использовать в вычислени- жения чисел
ях отображаемые значения, установив флажок З ад ать то ч
ность как на экр а н е в разделе Д о п о л н и т е л ь н о й П ри п е р е с ч е те э то й книги диалогового
окна параметров программы. Этот флажок применяется к активной рабочей книге.
Предупреждение
И спользуйте флажок Задать точность* как на экране с осторож ностью , четко
понимая механизм его работы. Его действие распространяется не только на
формулы, но и непосредственно на вводимые в ячейки значения. Например,
если ячейка содерж ит значение 4 , 68 и отображается без десятичных знаков
(т.е. как 5), установка данного флажка приведет к преобразованию числа
4, 68 в 5, оо. Данное изменение необратимо, поэтому восстановить прежнее
значение при снятии флажка Задать точность, как на экране невозможно. Го
раздо лучшим решением является использование функции округл, которая
округляет значения до заданного количества знаков после запятой (см. гла
ву 10). За все долгие годы работы с программой Excel у меня никогда не воз
никала потребность в установке флажка Задать точность, как на экране.
Ошибки плавающей запятой
Компьютеры по своей природе не могут обеспечить бесконечную точность. Excel
хранит числа в двоичном представлении (используя для них 8 байт), которое соответст
вует точности до 15 знаков. Некоторые числа нельзя точно выразить с использованием
восьми байт, поэтому они аппроксимируются.
Чтобы продемонстрировать то, как данное положение может привести к возникнове
нию проблем, введем в ячейке А1 следующую формулу:
= (5 ,1 -5 ,2 )+ 1
Результатом данного выражения должно быть 0 ,9 . Однако, если отформатировать
данную ячейку для отображения 15 десятичных знаков, будет отображено значение
0 ,8 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 . Причиной этого является то, что сначала выполняется дейст
вие в скобках, а промежуточный результат сохраняется в двоичном коде после аппрок
симации. Затем формула добавляет к данному значению 1, а ошибка аппроксимации рас
пространяется на конечный результат.
В большинстве случаев данный тип ошибки не представляет особой проблемы. Но,
если результат такой формулы проверяется логическим оператором, возникновение про
блемы не исключается. Например, следующая формула (если в ячейке А1 находится пре
дыдущая формула) возвращает значение ЛОЖЬ, хотя должна возвращать ИСТИНА:
=А1=, 9
536 Часть V. Полезные методики применения формул
Одним из возможных способов устранения данной ошибки является использование
функции ОКРУГЛ. Следующая формула, благодаря сравнению значения в ячейке А1, ок
ругленного до одного десятичного знака, возвращает значение ИСТИНА:
=ОКРУГЛ(А1;1)=0,9
Ниже приведен еще один пример так называемой “проблемы точности”. Попробуйте
ввести следующую формулу:
=(1,333+1,223)-(1,333-1,234)
Эта формула должна вернуть нуль, однако на самом деле вернет 2 , 2 2 0 4 4 6 Е - 1 6
(число, очень близкое к нулю).
Если эту формулу ввести в ячейку А1, то следующая формула вернет текст Не нуль:
=ЕСЛИ( А1 = 0 ; " Н у л ь " ; "Не н у л ь " )
Одним из способов избежать проблемы “округления” до нуля является использование
формулы, подобной приведенной ниже.
= E C n H( A BS ( А 1 ) < 1 Е - 6 ; " Н у л ь " ; "Не н у л ь " ) А
В этой формуле используется оператор “меньше” для сравнения модуля числа с очень
маленьким числом. В результате возвращается значение Ну л ь .
Ошибки “висящих” ссылок
После открытия рабочей книги вы можете увидеть сообщение, извещающее о суще
ствовании ссылок на другие источники данных (рис. 21.5). Это сообщение иногда ото
бражается даже в случае, когда рабочая книга вообще не содержит связанных формул.
Рис. 21.5. Excel таким образом спрашивает, не желаете ли вы
обновить ссылки в рабочей книге
Прежде всего, попробуйте использовать команду Файл^Сведения1^Изменить свя
зи с файлами. В открывшемся диалоговом окне Изменение связей выделяйте каждую
из ссылок и щелкайте на кнопке Разорвать связь. Если этот прием не решает проблему,
“висящая” ссылка могла быть вызвана в результате использования ошибочного имени.
Выберите команду Формулы^Определенные имена^Диспетчер имен. В открыв
шемся диалоговом окне просмотрите список имен. Если встретите имя, ссылающееся на
значение ошибки #ССЫЛКА!, удалите его. Окно диспетчера имен содержит кнопку
Фильтр, с помощью которой можно отфильтровать имена с ошибками.
Перекрестная ссылка
“Висящ ие” ссылки могут образовываться при копировании рабочего листа,
содержащего имена. Более детальную информацию об именах можно по
черпнуть из главы 3.
Глава 21. Инструменты и методы отладки формул 537
Ошибки логических значений
В ячейку можно ввести слова ЛОЖЬ и ИСТИНА, тем самым создав соответствующие логи
ческие значения. Несмотря на всю простоту этих имен, Excel не всегда адекватно их трактует.
На рис. 21.6 показан рабочий лист с тремя логическими значениями, введенными
в ячейки А 1 : АЗ. Одновременно в ячейки А5 : А7 введены формулы, суммирующие эти
логические значения. Как видите, все эти формулы возвращают разные результаты.
Формула в ячейке А5 использует операторы сложения. Суммой всех трех ячеек явля
ется число 2. Вывод следующий: Excel трактует значение ИСТИНА как единицу, а значе
ние ЛОЖЬ как нуль.
В ячейке А6 для суммирования используется функция рабочего листа СУММ. Как ви
дите, возвращаемое ею значение — нуль. Другими словами, функция СУММ игнорирует
логические значения. В то же время можно заставить ее трактовать логические значения
как числа, используя формулу массива. Введите следующую формулу и нажмите
<CtrlShift+Enter>:
=СУММ(А 1 :АЗ *1)
Еще более усложняет ситуацию то, что если логические значения передаются в функ
цию СУММ как константы, она возвращает неверное значение 2.
=СУММ(ИСТИНА; ИСТИНА; ЛОЖЬ)
И наконец, третий случай (ячейка А7). Несмотря на то что язык VBA тесно интегри
рован с Excel, иногда создается впечатление, что два приложения совершенно “не пони
мают” друг друга. Рассмотрим простую функцию VBA, которая суммирует значения
в диапазоне (ее текст приведен ниже). Эта функция вообще возвращает результат -2 !
Func t i on VBASUM(r n g )
Dim c e l l As Range
VBASUM = 0
For Each c e l l In rng
VBASUM = VBASUM + c e l l . V a l u e
Next c e ll
End F u n c t i o n
Все дело в том, что язык VBA трактует значение ИСТИНА как - 1 , а значение ЛОЖЬ
как нуль.
Мораль сей басни такова: принимайте в расчет непоследовательность работы Excel
с логическими значениями и будьте предельно внимательны при суммировании диапазо
нов, их содержащих.
Ошибки циклических ссылок
Циклической ссылкой является формула с прямой или косвенной ссылкой на ячейку,
содержащую эту формулу. Вопросы отслеживания циклических ссылок подробно рас
смотрены ниже.
Перекрестная ссылка
Существуют задачи, решение которых требует преднамеренного создания
циклических ссы лок (см. главу 16).
538 Часть V. Полезные методики применения формул
Средства аудита Excel
В Excel предусмотрены инструменты, призванные оказывать помощь в нахождении
ошибок формул. В данном разделе описаны встроенные в Excel средства аудита.
Нахождение ячейки определенного типа
Диалоговое окно В ы д е л е н и е группы ячеек (рис. 21.7) позволяет задать тип ячеек, ко
торые Excel должна выделить на экране. Чтобы открыть это диалоговое окно, выберите
команду Г л а в н а я ^ Р е д а к т и р о в а н и е ^ Н а й т и и в ы д е л и т ь м В ы д е л е н и е группы ячеек.
Рис. 21.6. На этом рабочем листе Рис. 21.7. Диалоговое окно Выделение
продемонстрировано отсутствие группы ячеек
единообразия при суммировании
логических значений в Excel
Примечание
Если при открытии окна Выделение группы ячеек выделен диапазон из не
скольких ячеек, команда будет применена только к ним. Если же выбрана
всего одна ячейка, команда применяется ко всему рабочему листу.
Диалоговое окно В ы д е л е н и е группы ячеек используется для выделения ячеек опреде
ленного типа, что часто облегчает поиск ошибок. Например, если установить переключа
тель ф орм улы , Excel выделит все ячейки, которые содержат формулы. Если уменьшить
масштаб просмотра рабочего листа, можно хорошо понять его структуру (рис. 21.8).
Совет
Выделение ячеек с формулами также используется для выявления еще од
ной распространенной ошибки — случайной замены формулы значением.
Если вы увидите невыделенную ячейку в группе ячеек с формулами, весьма
вероятно, что такая ячейка содержала формулу, которая впоследствии была
замещена значением.
Просмотр формул
Для того чтобы разобраться в незнакомой рабочей книге, просмотрите формулы, а не
результаты их вычислений. Для этого выберите команду Ф о р м ул ы 1^ З а в и с и м о с т и
ф о р м у л ^П о к а з а ть ф орм улы . Можно также перед использованием этой команды соз
Глава 21. Инструменты и методы отладки формул 539
дать для текущей рабочей книги новое окно просмотра. В результате вы будете иметь
возможность одновременно просматривать в одном окне формулы, а в другом — резуль
таты их вычислений. Для открытия нового окна во вкладке В ид выберите команду
Вид Новое окно.
Рис. 21.8. Уменьшение масштаба и выделение всех формул может дать наглядное пред
ставление о структуре рабочего листа
На рис. 21.9 показан пример одновременного отображения рабочей книги в двух окнах.
В верхнем окне используется режим обычного просмотра (результаты вычисления формул),
а в нижнем окне отображаются сами формулы. Для одновременного просмотра двух окон вам
пригодится команда В ид ^ Рядом, синхронизирующая перемещение по двум окнам.
При включенном режиме просмотра формул Excel выделяет цветом ячейки, исполь
зуемые формулой в активной ячейке. В примере на рис. 21.9 активна ячейка В11.
Отслеживание связей ячейки
Для того чтобы понять, как можно отследить взаимосвязи ячеек, необходимо ознако
миться с двумя концепциями.
• Влияющие ячейки. Ячейки, от которых зависит результат формулы. Термин
прямое влияние относится к ячейкам, используемым непосредственно в формуле.
Если сами ячейки в формуле не используются, но их значения используются дру
гими ячейками, на которые непосредственно ссылается формула, то говорят о не
прямом (косвенном) влиянии.
540 Часть V. Полезные методики применения формул
• Зависимые ячейки. Это ячейки с формулами, зависящие от текущей ячейки.
Множество зависимых ячеек состоит из всех ячеек, содержащих формулы, прямо
или косвенно зависимые от текущей ячейки
Рис. 21.9. Отображение формул (верхнее окно) и результа
тов их вычисления (нижнее окно)
Рассмотрим, например, формулу, введенную в ячейку А4:
=СУММ(А1: А З )
Ячейка А4 имеет три влияющих ячейки (A l, А2 и АЗ). Каждая из них имеет одну за
висимую ячейку — А4. В данном случае все зависимости прямые.
Определение влияющих на формулу ячеек помогает разобраться, почему данная
формула работает неправильно. Знание того, какие ячейки с формулами зависят от опре
деленной ячейки, также полезно. Например, если вы собираетесь удалить формулу, ин
формация о наличии зависимых ячеек позволит избежать потенциальных ошибок.
Нахождение влияющих ячеек
Определить ячейки, используемые формулой в активной ячейке, можно несколькими
способами.
• Нажмите клавишу <F2>. Ячейки, используемые непосредственно в формуле, бу
дут обведены цветными контурами. Цвет контура соответствует цвету ссылки на
ячейку в формуле. Этот прием ограничен только ячейками, содержащимися на од
ном листе с формулой.
• Откройте диалоговое окно Выделение группы ячеек (с помощью команды
Г л а в н а я ^ Р е д а к т и р о в а н и е ^ Н а й т и и в ы д е л и т ь 1^ В ы д е л е н и е гр уп п ы яче е к).
Глава 21. Инструменты и методы отладки формул 541
Установите переключатель В л и я ю щ и е ячейки, а затем установите, в зависимости
от своих намерений, подчиненный переключатель Т о л ь к о н е п о с р е д с тв е н н о или
Н а всех уро вн я х. Щелкните на кнопке О К, и Excel выделит все влияющие на
данную формулу ячейки. Этот прием также ограничен только ячейками, содержа-
, щимися на одном листе с формулой.
• Нажмите клавиши <Ctrl+[> для выделения на активном рабочем листе всех
влияющих непосредственно ячеек.
• Нажмите клавиши <Ctrl+Shift+[>, чтобы выделить на активном рабочем листе
все влияющие ячейки (напрямую и косвенно).
• Выберите команду Форм улы ^Зависим ости ф орм ул^В лияю щ ие ячей
ки. Excel отобразит на рабочем листе стрелки, указывающие на зависимые ячейки.
Чтобы скрыть стрелки, выберите команду Ф орм улы ^ З а в и с и м о с т и ф о р м у л ^
У б р а ть стрел ки. На рис. 21.10 показан рабочий лист с трассировкой ячеек,
влияющих на текущую ячейку (в данном случае ею является Е2).
Рис. 21.10. На рабочем листе стрелками обозначены ячейки, влияю
щие на формулу
Нахождение зависимых ячеек
Найти формулы, зависящие от отдельной ячейки, можно несколькими способами.
• Откройте диалоговое окно Выделение группы ячеек (с помощью команды
Г л а в н а я ^Р е д а кти р о в а н и е ^Н а й ти и в ы д е л и ть^В ы д е л е н ие группы ячеек).
Установите переключатель З а ви си м ы е ячейки, а затем установите, в зависимо
сти от своих намерений, подчиненный переключатель Т о л ь ко н е п о с р е д с тв е н н о
или На все х ур о в н я х. Щелкните на кнопке ОК, и Excel выделит все ячейки, зави
симые от текущей. Этот прием ограничен только ячейками, содержащимися на
одном листе с формулой.
• Нажмите клавиши <Ctrl+]> для выделения на активном рабочем листе всех не
посредственно зависимых ячеек.
• Нажмите клавиши <Ctrl+Shift+]>, чтобы выделить на активном рабочем листе
все зависимые ячейки (напрямую и косвенно).
• Выберите команду Форм улы ^Зависим ости ф ормулозависимы е ячей
ки. Excel отобразит на рабочем листе стрелки, указывающие на зависимые от те
кущей ячейки. Чтобы скрыть стрелки, выберите команду Ф о р м у л ы О З а в и с и м о с -
ти ф орм улоУ брать стрелки.
Отслеживание ошибочных значений
Если формула отображает значение ошибки, Excel поможет вам идентифицировать ее
первоисточник. Зачастую ошибка в формуле вызвана ошибкой во влияющей на нее
542 Часть V. Полезные методики применения формул
(прямо или косвенно) формуле. Сделайте активной ячейку, содержащую ошибку, после
чего выберите команду Ф о р м у л ы ^ З а в и с и м о с т и ф о р м у л ^ П р о в е р к а н а л и ч и я о ш и
б о к1^ И сто чн и к ош и бки . Excel отобразит на рабочем листе стрелки, указывающие на ис
точник ошибки.
Исправление ошибок циклической ссылки
При случайном вводе формулы, содержащей циклическую ссылку, Excel открывает
окно предупреждения, в строке состояния выводит сообщение Ц и к л и ч е с к а я с с ы л к а
(с адресом ячейки, если циклическая ссылка одна), а также отображает на рабочем листе
стрелки, позволяющие идентифицировать источник проблемы. Если найти источник
проблемы сложно, воспользуйтесь командой Ф о р м у л ы ^ З а в и с и м о с ти ф о р м у л ^ П р о -
верка наличия о ш и б о к ^ Ц и к л и ч е с к и е ссылки. Меню этой команды содержит список всех
ячеек, вовлеченных в циклическую ссылку. Начните с выделения первой из ячеек списка, а за
тем переходите к следующим до тех пор, пока источник проблемы не будет обнаружен.
Фоновая проверка ошибок
Некоторым пользователям Excel нравится средство автоматической проверки оши
бок. Фоновая проверка включается и отключается с помощью флажка В кл ю чи ть ф о н о
вы й поиск о ш и б о к вкладки Ф орм улы диалогового окна параметров Excel (рис. 21.11).
В разделе П равила контроля о ш и б о к можно определить, какие типы ошибок следует
выявлять. Для этого достаточно установить соответствующие флажки.
Рис. 21.11. Excel может выполнять проверку формул, чтобы найти потенциальные ошибки
Когда фоновая проверка ошибок включена, Excel постоянно следит за рабочим лис
том, в том числе и за его формулами. При обнаружении потенциальной ошибки Excel
помещает в левом верхнем углу “подозрительной” ячейки маленький треугольник. Если
ячейка активизирована, отображается смарт-тег. При щелчке на нем вам предлагается
несколько вариантов дальнейших действий. На рис. 21.12 показаны варианты действий,
которые доступны после щелчка на смарт-теге ячейки, содержащей ошибку # Д Е Л /0 !.
Доступные действия изменяются в зависимости от типа ошибки.
Глава 21. Инструменты и методы отладки формул 543
Рис. 21.12. При щелчке на смарт-теге открывается список
возможных действий
Во многих случаях пользователи выбирают команду П ропустить ош ибку. Выбор дан
ной команды исключает ячейку из списка ошибок. Можно снова отобразить все пропущен
ные ошибки; для этого необходимо щелкнуть на кнопке С б р о с п р о п ущ е н н ы х ош ибок,
находящейся на вкладке Ф орм улы диалогового окна параметров Excel (см. рис. 21.11).
Воспользуйтесь командой Ф о р м у л ы ^ З а в и с и м о с ти ф о р м у л ^ П р о в е р к а н аличия
ош ибок для последовательного отображения ячеек с потенциально возможными ошиб
ками (подобно тому, как это делает программа проверки орфографии). Диалоговое окно
Контроль ош и бо к показано на рис. 21.13. Обратите внимание, что это окно немодаль
ное (когда оно открыто, вы по-прежнему имеете доступ к содержимому рабочего листа).
Рис. 21.13. Использование диалогового окна контроля ошибок для последовательного про
смотра найденных программой потенциальных ошибок
Предупреждение
Важно понимать, что средство проверки ошибок несовершенно. Нельзя счи
тать, что рабочий лист полностью лишен ошибок только на основе того, что
программа Excel не выявила источников потенциальной опасности! Кроме
того, имейте в виду, что данное средство не сможет отследить такую часто
встречающуюся ошибку, как замена формулы значением.
544 Часть V. Полезные методики применения формул
Проверка формул
В Excel предусмотрено еще одно специальное средство, которое позволяет просмот
реть различные части вложенной формулы, представленные в порядке ее вычисления.
Чтобы использовать эту возможность, выделите содержащую формулу ячейку, а за
тем выберите команду Ф орм улы «^З ависим ости ф о р м у л а В ы ч и сл и ть ф орм улу. От
кроется диалоговое окно, показанное на рис. 21.14.
Рис. 21.14. Вычислить формулы в Excel можно поэтапно
Щелкните на кнопке В ы числ ить, чтобы отобразить результат вычисления выражения
формулы. При каждом щелчке на кнопке выполняется следующее вычисление. На первый
взгляд этот инструмент может показаться несколько сложным, однако если вы поработаете
с ним некоторое время, то поймете принцип его действия и по достоинству его оцените.
Excel предлагает еще один способ вычисления части формулы.
1. Выделите ячейку, содержащую формулу.
2. Нажмите <F2>, чтобы перейти в режим редактирования.
3. С помощью мыши выделите часть формулы, которую хотите вычислить. Можете
для этого воспользоваться клавишами <Shift> и стрелочками.
4. Нажмите <F9>.
Будет отображен результат выделенной части формулы. Далее можно таким же обра
зом вычислить другие части этой же формулы или нажать <Esc> и выйти из режима ре
дактирования, вернув формулу к ее первоначальному состоянию.
Предупреждение
Будьте осторожны при использовании этого приема, так как случайное
нажатие клавиши <Enter> (вместо <Esc>) приведет к нежелательной мо
дификации формулы, в результате чего в ней будут использоваться вы
численные значения.
Часть
Разработка
пользовательских
функций
В этой части...
Глава 22
Введение в VBA
Глава 23
Разработка функций
Глава 24
Концепции программ ирования на VBA
Глава 25
Примеры пользовательских функций VBA
Глава
Введение в VBA
В этой главе ...
♦ Несколько слов о VBA
♦ Отображение вкладки Разработчик
♦ Безопасность макросов
♦ Сохранение рабочих книг, содержащих макросы
♦ Знакомство с редактором Visual Basic
В этой главе вы познакомитесь с языком Visual Basic for Applications (далее VBA).
VBA представляет собой язык программирования, используемый для создания пользова
тельских функций в офисных приложениях, в частности в Excel. Перед тем как присту
пить к созданию таких функций с помощью VBA, необходимо приобрести базовые зна
ния об этом языке программирования и познакомиться с редактором Visual Basic.
Несколько слов о VBA
Язык VBA проще всего представить как язык написания сценариев для приложений
Microsoft. Сейчас он включается во все прикладные программы пакета Office 2010; его
также можно встретить и у сторонних производителей. В Excel существуют две основ
ные области применения VBA:
♦ для автоматизации выполнения задач;
♦ для создания пользовательских функций, которые можно использовать при по
строении формул.
Примечание
В Excel также существует другой способ создания функций — с помощью язы
ка создания макросов XLM. Этот язык считается устаревш им, но все же из с о
ображений обратной совместимости продолжает поддерживаться. В данной
книге игнорируется языкХ1_М; мы сф окусируем свое внимание только на язы
ке VBA. Следует отметить, что язык XLM не имеет ничего общего с языком
XML, предназначенным для хранения структурированных данных.
548 Часть VI. Разработка пользовательских функций
VBA является сложной темой для обсуждения — достаточно сложной, чтобы полно
стью описать его в данной книге. Поскольку книга посвящена формулам, я обращаю ва
ше внимание только на один из самых важных (и полезных) аспектов VBA — создание
пользовательских функций. Эти функции можно использовать в формулах.
Перекрестная ссылка
Если вы планируете стать экспертом по VBA, этой книги вам будет недостаточно,
она лишь “ подтолкнет” вас в нужнфм направлении. Прочитайте мою книгу
Excel2010: профессиональное программирование на VBA (“Диалектика” ,
2011 г.), в которой подробно освещены все вопросы работы с VBA.
Отображение вкладки Разработчик
Если вы планируете работать с макросами VBA, вам нужно отобразить на ленте
вкладку Разработчик. Для этого выполните следующее.
1. Щелкните правой кнопкой мыши в любом месте ленты и выберите команду Н а
стройка ленты.
2. В списке вкладок, приведенном в правой области окна П арам етры E xcel, уста
новите флажок напротив вкладки Разработчик.
3. Щелкните на кнопке ОК.
После этого вкладка Р а зр а б о тч и к всегда будет присутствовать на ленте. На рис. 22.1
показан общий вид ленты при активной вкладке Р азработчик.
Рис. 22.1. Вкладка Разработчик, не отображаемая по умолчанию, содержит команды, необхо
димые для работы с VBA
Безопасность макросов
При программировании в Excel особое внимание следует уделять безопасности мак
росов. Дело в том, что макросы — такой мощный инструмент, что могут серьезно по
вредить систему. В Excel включены средства безопасности, предназначенные для устра
нения потенциальных проблем, связанных с макросами.
На рис. 22.2 показан раздел П а р а м е тр ы м акросов диалогового окна Ц ентр у п р а в л е
ния безо п а сн о стью . Для открытия этого окна выберите команду Р а з р а б о т ч и к а К о д ^
Безопасность макросов.
По умолчанию установлен переключатель О ткл ю чи ть все м акросы с ув е д о м л е н и
ем. В этом режиме при открытии рабочей книги, содержащей макросы, когда файл не
содержит цифровой подписи и взят из ненадежного источника, Excel отображает над
строкой формул предупреждение системы безопасности (рис. 22.3). Если вы уверены в
безопасности макросов, содержащихся в рабочей книге, щелкните на кнопке В клю чи ть
содержимое.
Глава 22. Введение в VBA 549
Рис. 22.2. Вкладка Параметры макросов диалогового окна Центр управления безо
пасностью
Предупреждение системы безопасности Запуск макросов отключен, j Включить содержимое X
• д
G18 I :_________ : ......_______________________ ____________ _________________
В
А С: DЕ F 1G 1Н 1; J ; К
1 ; 20 26 20
2J 20 28 28 26
96 28
3 77 77
44
Рис. 22.3. Предупреждение о наличии макросов в рабочей книге
Новинка
Excel 2010 помнит о том, что макросы были разрешены. Если в рабочей кни
ге разрешить макросы (с помощью окна параметров, а не кнопки Включить
содержимое), то при следующем открытии данного файла предупреждение,
показанное на рис. 22.3, не появится.
Предупреждение
Если при открытии рабочей книги, содержащей макросы, открыто окно ре
дактора VBA, Excel не отображает предупреждение системы безопасности.
Вместо этого отображается диалоговое окно, показанное на рис. 22.4, в ко
тором можно включить или отключить макросы.
Рис. 22.4. Если при открытии рабочей книги,
содержащей макросы, открыто окно редактора
VBA, отображается это предупреждение
550 Часть VI. Разработка пользовательских функций
Наилучшим способом обеспечения безопасности макросов является выделение от
дельных папок для надежных источников. Все рабочие книги, находящиеся в таких пап
ках, будут открываться без предупреждения системы безопасности. Назначение папок
с доверенными источниками выполняется во вкладке Н а д е ж н ы е р а сп о л о ж е н и я диало
гового окна Ц е н тр у п р а в л е н и я б е з о п а сн о сть ю .
Сохранение рабочих книг, содержащих макросы
Если в рабочей книге хранится хотя бы один макрос, файл следует сохранять с вклю
ченными макросами. Такой файл имеет расширение XLSM (или XLAM, если макрос запи
сывается как надстройка). Этот формат не устанавливается по умолчанию, поэтому при
сохранении файла следует выбрать правильное расширение.
Для примера предположим, что вы создали новую рабочую книгу, содержащую один
или несколько макросов. При первом сохранении этой книги вам будет предложено рас
ширение XLSX, как для книги, не содержащей макросы. Если вы не измените это расши
рение на другое, Excel откроет окно предупреждения, показанное на рис. 22.5. В этом
окне следует щелкнуть на кнопке Нет, после чего в списке типов файлов выбрать пункт
Книга Excel с поддержкой м акросов (*.xlsm ).
Рис. 22.5. Если рабочая книга содержит макросы, а вы пытаетесь ее со
хранить в неверном формате, Excel предупредит об этом
Предупреждение
Будьте бдительны, поскольку с помощью всего одного щелчка можно случайно
удалить все существующие макросы рабочей книги. Если в окне предупрежде
ния щелкнуть на кнопке Да вместо Нет, все макросы будут удалены в процессе
сохранения рабочей книги. В то же время в открытой копии рабочей книги мак
росы останутся на месте. Поэтому если вы все же совершили ошибку, но оста
вили открытой рабочую книгу, сразу же сохраните ее в формате . xlsm.
Знакомство с редактором Visual Basic
Перед тем как начать работать над созданием функций, следует познакомиться с ре
дактором Visual Basic. Данный редактор позволяет работать с модулями VBA, которые
являются контейнерами программного кода VBA.
Запуск редактора Visual Basic
Когда открыто окно Excel, перейти к редактору VBA можно одним из следующих
способов:
• нажмите <Alt+Fl 1>;
• выберите команду Р а з р а б о т ч и к ^ К о д1^ V is u a l B a sic.
Глава 22. Введение в VBA 551
На рис 22.6 показан общий вид окна редактора Visual Basic. Вполне возможно, что
окно редактора, показанное на рисунке, не совсем похоже на окно Visual Basic, отобра
жаемое на экране вашего монитора. Дело в том, что данное окно настраиваемое — в нем
можно открывать и закрывать панели, откреплять и закреплять их, изменять их размеры
и многое другое.
Рис. 22.6. Окно редактора Visual Basic
Компоненты редактора Visual Basic
Редактор Visual Basic состоит из ряда компонентов. В этом разделе коротко описаны
основные из них.
Примечание
Несмотря на то что версия Excel 2010 имеет абсолютно новый интерфейс,
редактор Visual Basic остался в точности таким же, как и в предыдущ их вер
сиях. В нем по-прежнему используется не лента, а панель инструментов
и система каскадных меню.
Строка меню
Строка меню редактора Visual Basic работает так же, как и любая другая строка меню
в обычном приложении Windows. В ее состав входят команды, используемые для работы
с различными компонентами редактора Visual Basic.
Контекстные меню
Характерной особенностью редактора Visual Basic является наличие контекстных ме
ню. Щелчок правой кнопкой мыши на пустом месте окна редактора Visual Basic иниции
рует открытие контекстного меню, предоставляющего доступ к наиболее распростра
ненным командам.
Панели инструментов
Стандартная панель инструментов по умолчанию находится непосредственно под
строкой меню. Это одна из шести доступных панелей инструментов редактора Visual Ва-
552 Часть VI. Разработка пользовательских функций
sic. Панели инструментов в редакторе Visual Basic можно перенастраивать, перемещать,
скрывать и отображать.
Окно проекта
Окно проекта (P ro je ct, на рис. 22.6, слева) отображает древовидную схему всех рабо
чих книг, открытых в текущий момент в Excel (включая надстройки и скрытые рабочие
книги). В редакторе Visual Basic каждая рабочая книга называется проектом. Окно про
екта будет детальнее рассмотрено в следующем разделе. Если окно проекта не отобра
жено на экране, нажмите комбинацию клавиш <Ctrl+R>.
Окно программного кода
Окно программного кода (на рис. 22.6, справа, пока что оно пустое) содержит код
VBA. Каждый элемент проекта имеет соответствующее ему окно кода. Чтобы просмот
реть окно кода для объекта, необходимо дважды щелкнуть кнопкой мыши на объекте
в окне проекта. Можно также выделить элемент и щелкнуть на кнопке отображения ко
да, находящейся в верхней части окна проекта.
Например, чтобы просмотреть окно кода для отдельного объекта Л ист1 рабочей
книги, необходимо дважды щелкнуть на нем в окне проекта. Пока вы не добавили в файл
код VBА, окно кода будет пустым. Детально окно кода рассмотрено далее.
Окно свойств
Окно P ro p e rtie s (Свойства) включает в себя перечень всех свойств выделенного объ
екта. Используйте это окно для просмотра и изменения свойств. Окно свойств открыва
ется после нажатия клавиши <F4>.
Окно отладки
Окно отладки (Im m ediate) является наиболее удобным средством для непосредственного
выполнения инструкций VBA, тестирования и отладки кода. Оно может либо отображаться,
либо нет. Если окно отладки отсутствует на экране, нажмите <Ctrl+G>. Для того чтобы за
крыть это окно, щелкните на кнопке Закрыть, находящейся в правом верхнем углу.
Использование окна проекта
В процессе работы в редакторе Visual Basic каждая рабочая книга и надстройки, от
крытые в данный момент, являются проектами. Проектом можно считать совокупность
объектов, упорядоченных в виде структуры. Существует возможность открыть проект,
щелкнув на знаке “плюс” слева от его имени в окне проекта. Чтобы скрыть содержимое
объекта, щелкните на знаке “минус” слева от имени проекта. На рис. 22.7 показано окно
проекта, содержащего список из двух проектов (рабочая книга a l .x ls m и надстройка
FUNCRES . XLAM).
Если вы попытаетесь внести изменения в защищенный проект, вам будет предложено
ввести пароль.
Каждый открытый проект содержит, как минимум, один объект M i c r o s o f t E x c e l
O b j e c t (Объекты Microsoft Excel). Этот объект при раскрытии представляет вашему
вниманию все элементы каждого рабочего листа и диаграммы в рабочей книге (каждый
лист считается объектом), а также специальный объект, называемый Э таК н и га (он яв
ляется объектом рабочей книги). Если в проекте есть модули VBA, дерево проекта также
отображает объект M o d u l e s , который состоит из модулей, представленных в нем. Про
Глава 22. Введение в VBA 553
ект включает в себя и объект, называемый F orm s (который содержит объекты пользова
тельских форм), и объект C l a s s M o d u le s (состоящий из объектов модулей классов).
В данной книге уделено внимание исключительно стан
дартным модулям VBA; мы не рассматриваем объекты
Microsoft Excel, объекты пользовательских форм и объ
екты модулей классов.
© Примечание
Проект может состоять из еще одного типа Рис. 22.7. Окно проекта, состоя
объектов, называемых References (Ссылки). щее из двух проектов
Этот объект содержит перечень ссылок, ко
торые используются в проекте. Ссылки мож
но удалить или добавить с помощью команды
Tools^References (Инструменты^Ссылки).
В отличие от других объектов, представлен
ных в окне проекта, объекты ссылок не име
ют связанных с ними модулей кода.
Переименование проекта
По умолчанию все проекты называются V B A P ro je c t. В окне проекта имя рабочей
книги отображается после име^и проекта. Например, проект может быть представлен
следующим образом:
VBAProject (budget.xlsm)
При желании проекту можно присвоить более описательное имя. Для этого выполни
те следующие действия.
1. Выберите проект в окне проектов.
2. Убедитесь, что отображено окно P ro p e rtie s (Свойства). Нажмите <F4>, если оно
скрыто.
3. В окне свойств замените имя VBAPro j e c t на другое.
После внесения изменений в окне проекта будет отображено новое имя.
Добавление нового модуля VBA
В новой рабочей книге Excel не существует ни одного модуля VBA. Для добавления
таких модулей в проект необходимо выбрать имя проекта в окне проекта, затем — ко
манду In se rt «=>Module (Вставка^Модуль).
Предупреждение
При создании функций необходимо следить, чтобы они находились в стандарт
ном модуле VBA, а не в окне кода для объекта листа или рабочей книги. Если код
функции расположен не в модуле VBA, то функция не будет работать. Помеще
ние кода VBA в неверное место является самой распространенной ошибкой но
вичков, которые учатся создавать пользовательские функции.
Переименование модуля
Модули VBA обладают именами, назначенными по умолчанию: M o d u le 1, M o dule2
и т.д. Для того чтобы переименовать модуль VBA, необходимо выбрать его в окне про
екта, а затем изменить имя, используя окно свойств (модуль VBA имеет только одно
554 Часть VI. Разработка пользовательских функций
свойство — Name). Если окно свойств не отображено на экране, нажмите <F4>. На
рис. 22.8 показан модуль VBA, переименованный в m o d F u n c tio n s .
Рис. 22.8. Для изменения имени модуля VBA используйте окно свойств
Удаление модуля VBA
Если нужно удалить модуль VBA из проекта, выделите в окне проекта его имя и вы
берите команду F ile ^ R e m o v e XXX (Файл«^Удалить имя_модуля). Будет задан вопрос,
хотите ли вы экспортировать модуль перед удалением. При экспортировании создается
резервный файл с содержимым текущего модуля. Модули можно импортировать из лю
бого проекта и экспортировать в любой проект.
Использование окна кода
За исключением объектов ссылки, любой объект в проекте имеет связанное с ним ок
но кода. Обычно к этим объектам относятся:
• сама рабочая книга (в окне проекта объект называется Э т а К н и га );
• рабочий лист или рабочая диаграмма (например, Л и с т 1 или Д и а г р а м м а 1 в окне
проекта);
• модуль VBA, содержащий коды пользовательских функций;
• модуль U s e г Form, содержащий код созданного пользователем диалогового окна;
• модуль класса (особый тип модуля, который позволяет создавать новые классы
объектов);
• список ссылок, вставленных с помощью команды T o o ls 1^ R eferences (Инструменты■=>
Ссылки).
Глава 22. Введение в VBA 555
Примечание
В данной книге рассмотрены исключительно модули VBA (иногда их назы
вают стандартными модулями), в которы х хранятся пользовательские ф унк
ции рабочего листа.
Сворачивание и разворачивание окон
В редакторе Visual Basic может быть открыто множество окон кода (рис. 22.9).
Рис. 22.9. Открыто несколько окон кода
Окна кода похожи на окна рабочих листов Excel. Их можно сворачивать, разворачи
вать, скрывать, упорядочивать и т.д. Многие считают, что окно кода, в котором ведется
работа, лучше развернуть. Однако иногда может возникнуть потребность отобразить од
новременно два или больше открытых окон с кодом (например, для сравнения кода двух
модулей или при копировании кода одного модуля в другой).
Сворачивание окна кода изменяет занимаемую им область. Можно щелкнуть на
кнопке З акры ть, находящейся в правом углу заголовка, для того чтобы полностью за
крыть окно кода. Для повторного открытия окна необходимо дважды щелкнуть на соот
ветствующем объекте в окне проекта.
Нельзя закрыть рабочую книгу непосредственно из редактора Visual Basic. Для этого
следует перейти в окно Excel и закрыть его обычным способом.
Сохранение кода
Модуль может содержать три типа кода.
• Процедура. Процедура представляет собой набор инструкций, выполняющих оп
ределенные действия. Например, процедура может скомбинировать несколько
частей рабочей книги в один краткий отчет.
• Функция. Функция представляет собой набор инструкций, которые возвращают
одно значение или массив. Функцию можно использовать в формулах. От проце
дуры функция отличается только тем, что возвращает значение.
556 Часть VI. Разработка пользовательских функций
• Объявление. Объявление — это предоставление интерпретатору VBA информа
ции о переменных, которые используются в коде VBA. Например, можно объя
вить тип переменных, которые будут использоваться в будущем. Обычно объяв
ления помещают в начало модуля.
В одном модуле VBA может храниться любое количество процедур, функций и объявле
ний. Процедуры и функции часто называют подпрограммами.
Примечание
В данной книге рассматриваются только функции, поскольку они являются
единственным типом кода, который можно использовать для построения
формул.
Ввод кода
В данном разделе описаны различные способы ввода кода VBA в окне кода. Для
функций окно кода всегда относится к модулю VBA. Добавить код в модуль VBA можно
тремя способами:
• введя его вручную с клавиатуры;
• используя рекордер макросов программы Excel (можно записать макрос и впо
следствии преобразовать его в код VBA);
• скопировать код из другого модуля и вставить его в тот модуль, с которым вы ра
ботаете.
Ввод кода вручную
Часто самый простой путь решения проблемы является самым лучшим. Ввод текста
программы и его редактирование в модуле VBA осуществляется обычным способом.
Можно выделить текст и скопировать его или вырезать и вставить в другое место.
Пользуйтесь клавишей <ТаЬ>, чтобы делать отступы в строках, которые логически
связаны одна с другой (например, в блоках условных инструкций I f E n d l f ) . Наличие
отступов необязательно, но оно облегчает чтение программы, делает ее более наглядной.
Длина простой инструкции в VBA может быть произвольной. Из соображений удобо
читаемости (т.е. чтобы вся инструкция была видна в окне кода) можно преобразовать одну
длинную инструкцию в несколько коротких. Для этого завершите строку пробелом и сим
волом подчеркивания, а затем нажмите клавишу <Enter> и продолжайте вводить код инст
рукции в новой строке. В следующем примере одна инструкция разбита на три строки.
I f IsN um eric(M yC ell) Then _
R e s u l t = "Number" E l s e _
R e s u lt = "Non-Number"
Обратите внимание, что в две последние строки инструкции добавлен отступ. Делать
это не обязательно, но так будет легче понять, что эти три строки представляют единую
инструкцию.
После ввода инструкций редактор Visual Basic для повышения их удобочитаемости
выполняет следующее.
• Вставляет между инструкциями пробелы. Например, при вводе A n s = l + 2 (без
пробелов) VBА преобразует данное выражение к следующему виду:
Ans = 1 + 2
Глава 22. Введение в VBA 557
• Приводит в порядок регистр символов ключевых слов, свойств и методов. К при
меру, если ввести такой текст:
u ser = a p p lica tio n .username
то редактор Visual Basic преобразует его в следующий:
user = Application.UserName
Поскольку регистр имен переменных не имеет значения, редактор Visual Basic
приводит все переменные, имена которых начинаются с одной и той же буквы,
к виду, который вы используете чаще всего. Например, если вы сначала определи
те переменную как m y v a l u e (все строчные) и потом введете переменную Му-
V a l u e (в смешанном регистре), VBA преобразует все последующие экземпляры
этой переменной в M yV alu e. Исключением может быть случай, когда переменная
определена явно с помощью инструкции Dim или функционально подобной ей.
Тогда переменная отображается в том виде, в котором была объявлена.
• Проверяет инструкции на наличие синтаксических ошибок. Если редактор Visual
Basic обнаружит ошибки в окне проекта, он изменит цвет строки и выведет преду
преждающее сообщение. Можно настроить различные режимы работы редактора
Visual Basic в диалоговом окне O p tio n s Чтобы открыть его, выберите команду
T o o ls ^ O p tio n s (Инструменты1^Параметры).
Совет
Как и Excel, редактор Visual Basic содерж ит многоуровневы е команды отм е
ны действий и повторного восстановления команд. Поэтому, если вы слу
чайно удалили важную инструкцию, можете, щелкнув несколько раз на кноп
ке Undo (Отмена) или нажав комбинацию клавиш <Ctrl+Z>, вернуть потерю.
Для восстановления прежнего варианта после выбора команды Undo выбе
рите команду E dit^R eD o Delete (Р едактированием Восстановить удаление).
Использование рекордера макросов
Альтернативным способом добавления кода в модуль VBA является запись его в виде
макроса Excel с помощью рекордера макросов. Записать можно только процедуру. По
пытки записать функцию (это разновидность подпрограмм, используемая в формулах
рабочего листа) окажутся тщетными. Все записанные макросы являются внутренними
процедурами. Рекордер макросов чрезвычайно удобен тем, что, глядя на результат его
работы, часто можно увидеть полезные функции Excel, о существовании которых вы да
же не подозревали. К примеру, можно включить запись действий, применяемых для из
менения имени пользователя. Для записи макроса с помощью рекордера перейдите в ок
но Excel, запустите рекордер и выполните нужные действия. Они будут записаны в про
цедуру VBA, и в следующий раз их можно будет автоматически выполнить, просто
запустив макрос. Например, чтобы записать макрос, изменяющий имя пользователя, вы
полните следующие действия.
1. Выберите команду Р а з р а б о т ч и к ^ К о д * ^ З а п и с а т ь м акрос.
2. В диалоговом окне З а п и сь м акроса оставьте без изменений стандартные на
стройки и щелкните на кнопке О К . Рекордер перейдет в режим записи. С этого
момента все ваши действия будут записаны и запомнены. Название кнопки З апи
са ть м акрос (на ленте) изменится на О ста н о в и ть запись.
3. Откройте диалоговое окно параметров Excel и выберите вкладку О бщ ие.
558 Часть VI. Разработка пользовательских функций
4. В разделе Л ичная настрой ка M icro so ft O ffice измените имя пользователя.
5. Щелкните на кнопке ОК, чтобы закрыть окно параметров программы.
6. Во вкладке Р а зр а б о тч и к щелкните на кнопке О с т а н о в и т ь зап и сь.
7. Нажмите <Alt+Fl 1>, чтобы открыть редактор Visual Basic.
8. В окне проектов выберите проект, соответствующий вашей рабочей книге.
9. Дважды щелкните на модуле VBA, содержащем записанный код (как правило,
это модуль с наибольшим номером).
Процедура VBA будет иметь такой вид.
Sub М акрос2()
I
' Макрос2 Макрос
I
I
A pplication.UserNam e = "Denis D anilkin"
End Sub
Следует отметить, что в данном случае представлена внутренняя процедура, а не
функция. Другими словами, эту процедуру нельзя использовать при работе с формулами.
Однако если проанализировать вид кода, то можно увидеть ссылку на объект имени
пользователя U serN am e. Эту информацию можно использовать при написании функ
ции. Например, следующая функция использует объект имени пользователя и при вы
полнении в формуле возвращает его.
F u n c t i o n U s e r ()
USER = A p p l i c a t i o n . U s e r N a m e
End F u n c t i o n
Чтобы познакомиться с различными свойствами объектов, можно обратиться к спра
вочной системе Excel, однако использование средств записи макроса дает возможность
решить проблему эффективнее, если точно не известно, что нужно искать. Тяжело найти
функцию, не зная ее имени и даже существует ли она вообще. После того как вы найдете
в процедуре имя нужного свойства или функции, подробности сможете узнать в спра
вочной системе.
Примечание
Можете снова открыть диалоговое окно параметров Excel и вернуть имя
пользователя в исходное состояние. То же можно сделать и с помощью VBA.
Для этого достаточно отредактировать имя в записанном макросе, после че
го установить курсор в любом месте процедуры и выбрать команду R un^
Run Sub/UserForm (Вы полнить^П роцедуру/Ф орм у) или нажать <F5>. После
выполнения макроса имя пользователя будет изменено.
Копирование кода VBA
В этой главе уже был рассмотрен процесс непосредственного ввода кода, а также за
пись действий для создания кода VBA. Еще одним способом ввода кода в модуль VBA
является его копирование из другого модуля. Например, если существует записанная
функция для одного проекта, ее впоследствии можно использовать в другом проекте.
Вместо того чтобы вводить код заново, можно открыть рабочую книгу, отобразить мо
дуль и с помощью обычных операций управления содержимым буфера обмена скопиро
вать код в текущий модуль VBA.
Глава 22. Введение в VBA 559
Код VBA можно копировать и из других источников. К примеру, нужный текст про
граммы можно найти на веб-странице или в группе новостей. В этом случае следует вы
делить в браузере текст, скопировать его в буфер обмена и затем вставить в модуль.
Сохранение проекта
Как и в любой другой прикладной программе, в редакторе Visual Basic рекомендуется
периодически сохранять изменения. Для этого необходимо выбрать команду F ile ^ S a v e
(Файл^Сохранить), нажать <Ctrl+S> или щелкнуть на кнопке сохранения, расположен
ной на стандартной панели инструментов.
• ч Примечание
При сохранении проекта ф актически сохраняется рабочая книга Excel. И на
оборот, при сохранении рабочей книги Excel автоматически сохраняются
изменения, внесенные в проекте VBA рабочей книги.
В редакторе Visual Basic отсутствует команда F ile ^ S a v e A s (Файл^Сохранить как).
Для сохранения проекта под другим именем необходимо запустить Excel и выбрать на
ленте команду Ф а й л ^ С о х р а н и т ь как.
Глава
Разработка функций
В этой главе...
♦ Зачем нужны пользовательские функции
♦ Простой пример функции VBA
♦ Создание функций
♦ Диалоговое окно вставки функции
♦ Тестирование и отладка функций
♦ Создание надстроек
В предыдущих главах рассматривались встроенные функции рабочих листов и спосо
бы построения с их помощью сложных формул. Эти функции обеспечивают большую
гибкость при создании формул. Однако возникают ситуации, когда встроенных функций
недостаточно и без пользовательских функций трудно обойтись. В этой главе описаны
случаи, в которых целесообразно применять пользовательские функции, созданные с по
мощью VBA. В главе также рассмотрены методы тестирования и отладки пользователь
ских функций.
Зачем нужны пользовательские функции
Наверняка вы знакомы с функциями рабочих листов Excel — даже новичкам извест
но, как пользоваться такими функциями, как СУММ, СРЗНАЧ и ЕСЛИ. В Excel 2010
встроено более 400 предопределенных функций — от ABS до ЯЧЕЙКА.
Для создания дополнительных функций можно использовать средства редактора Visual
Basic. Эти функции принято называть пользовательскими. В Excel и VBA существует мно
го функций, поэтому может возникнуть вопрос, зачем же создавать новые функции? Ответ
следующий: для упрощения работы и для предоставления формулам большей гибкости.
Например, можно создать пользовательскую функцию, значительно сокращающую
стандартные формулы. Сокращенные формулы более читабельны, с ними намного про
ще работать. Однако важно понимать, что пользовательские функции в формулах рабо
тают гораздо медленнее, чем встроенные, хотя в высокопроизводительных системах раз
личие в скорости часто остается незамеченным.
562 Часть VI. Разработка пользовательских функций
Процесс создания пользовательской функции несложен. Данная книга поможет вам
в созданий ваших собственных функций. В этой и в последующих главах вы ознакоми
тесь с примерами функций, которые можете применять в собственных целях.
Примечание
В имени пользовательской функции регистр букв не имеет значения. Для
единообразия рекомендуется применять в именах функций только буквы
верхнего регистра.
Простой пример функции VBA
Приведем простой пример функции VBA. Функция под названием USER не принима
ет каких-либо аргументов. С помощью этой функции формула может отобразить имя
пользователя символами верхнего регистра. Для создания функции USER необходимо
выполнить следующие действия.
1. Начните работу с новой книгой (указанное действие необязательное, но в данном
случае выполните этот этап).
2. Нажмите <Alt+Fl 1> для запуска редактора Visual Basic.
3. Щелкните кнопкой мыши на имени рабочей книги в окне проекта. Если окно про
екта скрыто, нажмите <Ctrl+R> для его отображения.
4. Выберите команду меню In s e rt^ M o d u le (Вставка^Модуль) для добавления мо
дуля VBA в проект.
5. Введите следующий текст в окне кода.
F u n c t i o n USER()
' Возвращает имя п о л ь зо в а т ел я
USER = A p p l i c a t i o n . U s e r N a m e
USER = UCase(USER)
End F u n c tio n
На рис. 23.1 эта функция показана в окне кода.
Рис. 23.1. Простая функция VBA, отображенная в окне кода
Опробуйте пользовательскую функцию. Для этого перейдите в окно Excel (нажав
<AltH-F11>) и введите следующую формулу в любую ячейку рабочей книги:
=USER()
Глава 23. Разработка функций 563
Чего не могут пользовательские функции
При соверш енствовании пользовательских функций вы должны четко понимать один
ключевой момент. Функция, используемая в формуле рабочего листа, должна быть
пассивной. Д ругими словами, она не должна менять данные на рабочем листе.
Можно попробовать написать пользовательскую функцию, изменяющую формат
ячейки. Например, в некоторых случаях полезно было бы иметь функцию, которая из
меняет цвет текста в ячейке в зависимости от значения. Однако такую функцию невоз
можно написать — что бы вы ни делали, функция всегда будет возвращать ош ибку при
попытке внести изменения в рабочий лист. Помните, что функция может возвращать
только значение; она не способна выполнять действия с объектами.
Ни одна встроенная функция Excel не может менять содерж имое рабочего листа,
поэтому такое же ограничение на пользовательские функции VBA вполне логично.
Если код VBA введен правильно, функция USER будет выполнена. Кроме того, имя
пользователя будет отображено символами верхнего регистра в ячейке.
Примечание
Если формула возвращает значение ошибки, убедитесь, что код VBA поль
зовательской функции находится в модуле VBA (модуль листа или книги не
является объектом). Также необходимо проверить, находится ли модуль
в проекте той книги, в которую вы пытаетесь ввести формулу.
Когда Excel вычисляет значения рабочего листа, он рассчитывает и пользовательскую
функцию USER. Каждая инструкция в функции анализируется и выполняется, а результат
возвращается на рабочий лист. Функцию можно использовать неограниченное количест
во раз в любом количестве ячеек.
Обратите внимание, что пользовательская функция работает так же, как и любая дру
гая встроенная функция. Ее можно вставить в формулу с помощью диалогового окна
вставки функции; также пользовательские функции отображаются в списке автозаверше
ния. В диалоговом окне вставки функции пользовательские функции представлены в ка
тегории Определенные пользователем. Как и другие функции, их можно использо
вать в более сложных формулах, например:
= "Привет "&USERO
Следующая функция подсчитывает количество символов в имени пользователя:
=ДЛСТР(USER( ) )
Если вам не нравится то, что имя пользователя отображается символами верхнего ре
гистра, исправьте процедуру следующим образом.
F u n c t io n USER()
' Возвращает имя п о л ь зо в а т ел я
USER = A p p l i c a t i o n . U s e r N a m e
End F u n c tio n
После внесения изменений в функцию перейдите в Excel и нажмите <F9> для пере
счета листа. В каждой ячейке, в которой находится пользовательская функция USER, бу
дет отображен конечный результат.
564 Часть VI. Разработка пользовательских функций
Создание функций
В этом разделе будут рассмотрены некоторые технические особенности применения
пользовательских функций. Будут даны общие инструкции по объявлению функций,
присвоению им имен, использованию функций в формулах и заданию аргументов.
Объявление функции
Для объявления функции используется общепринятый синтаксис.
[Public | Private] [Static] F u n c t i o n имя([ список_аргументов] ) [As тип]
[инструкции]
[имя = выражение]
[Exit Function]
[инструкции]
[имя = выражение]
End F u n c t io n
• Ключевое слово P u b l i c сообщает о том, что данная функция доступна для дру
гих процедур в других модулях рабочей книги (это слово необязательно).
• Ключевое слово P r i v a t e означает, что данная функция доступна только для дру
гих процедур того же модуля (это слово необязательно). При задании ключевого
слова P r i v a t e функция не будет отображаться в списке автозавершения и диало
говом окне вставки функции.
• Ключевое слово S t a t i c показывает, что значения переменных, объявленные в функ
ции, остаются неизменными между вызовами функции (это слово необязательно).
• F u n c t i o n является ключевым словом, обозначающим начало функции (это сло
во обязательно).
• Имя может быть любым допустимым для переменной именем. Когда функция за
вершает работу, ее результатом является значение, присваиваемое имени функции
(обязательно).
• Список_аргументов— это список нескольких переменных, представляющих
собой аргументы функции. Аргументы заключаются в круглые скобки. Для разде
ления аргументов необходимо использовать точку с запятой (наличие аргументов
необязательно)1.
• Тип показывает тип данных, возвращаемых функцией (необязательно).
• Инструкции являются полноценными инструкциями VBA (они необязательны,
но пустая функция, очевидно, будет бесполезной).
• E x i t F u n c t i o n — это инструкция, результат выполнения которой — выход из
функции (необязательная; если ее нет, работа функции завершится при достиже
нии инструкции End F u n c t i o n ) .
• End F u n c t i o n — инструкция, завершающий функцию (обязательный).
1В рабочей среде Excel разделителем аргументов должен быть символ, определенный в каче
стве разделителя в окне региональных параметров операционной системы Windows. По умолча
нию таким символом для США является запятая, а для России — точка с запятой. В среде VBA в
качестве разделителя аргументов всегда используется запятая, независимо от региональных пара
метров Windows. — Примеч. ред.
Глава 23. Разработка функций 565
Выбор имени функции
Каждая функция должна иметь уникальное имя. При выборе имени функции необхо
димо придерживаться следующих правил.
• Допускается использование символов алфавита, цифр и некоторых симво
лов пунктуации, но первый символ обязательно должен быть буквой.
• Можно использовать любую комбинацию букв верхнего и нижнего регистров.
• Нельзя использовать имена, похожие на адреса ячеек рабочей книги (такие,
как J 2 1 ) . Формально можно использовать такое имя для функции, однако это мо
жет привести к непредсказуемым результатам.
• VBA не различает регистры. Чтобы обеспечить имени функции лучшую чита
бельность, используйте символы разных регистров (лучше написать I n t e r e -
s t R a t e , чем i n t e r e s t r a t e ) .
• В имени нельзя использовать пробелы и точки. Улучшит читабельность имени
функции символ подчеркивания ( I n t e r e s t _ R a t e ) .
• В имя функции нельзя вставлять следующие символы: #, $, %, 1. Они явля
ются символами объявления типа, которые имеют специальное назначение в VBA.
• Имя функции должно состоять не более чем из 255 символов. На самом деле
с короткими именами легче работать, и они более читабельные.
Использование функций в формулах
Применение пользовательской функции VBA в формулах аналогично использованию
встроенных функций. Вы должны убедиться в том, что Excel может определить место
расположения функции. Если функция находится в той же рабочей книге, что и формула,
не нужно выполнять дополнительных действий. Если же онц расположены в разных ра
бочих книгах, следует указать Excel, где ее найти. Для этого выполните следующее.
• Начните имя функции ссылкой на файл. Например, если нужно использовать
функцию C o u n t N a m es (подсчет имен), объявленную в рабочей книге Му-
f u n c s . x l s m , следует использовать следующую формулу:
=M yfuncs.xlsm !CountN am es(А1:А1000)
Если вставить функцию с помощью диалогового окна вставки функции, ссылка на
рабочую книгу будет добавлена автоматически.
• Настройка ссылки на рабочую книгу. Воспользуйтесь следующей командой
редактора Visual Basic T oo ls'^R eferences (Инструменты«^Ссылки). Откроется
диалоговое окно, показанное на рис. 23.2. Если функция объявлена в рабочей кни
ге с помощью ссылки, указывать имя рабочего листа нет необходимости. Даже ко
гда зависимая рабочая книга задана как ссылка, диалоговое окно вставки функции
продолжит вставлять ссылку на рабочую книгу (несмотря на то, что необходимо
сти в этом уже нет).
• Создание надстройки. Если определена надстройка, в которой присутствует
нужная пользовательская функция, то для вызова функции ссылаться на файл не
обязательно. Надстройка должна быть установлена в Excel. Надстройки рассмот
рены далее.