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

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

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

Определение допустимых значений диапазона

Иногда возникает следующая задача: необходимо проконтролировать содержимое списка на предмет допустимости значений в нем. Например, список всех допустимых чисел хранится в диапазоне с именем Master. При импортировании списка чисел в диапазон с именем MyList требуется убедиться, что все числа допустимы, путем сравнения элементов в импортируемом списке с элементами в списке Master.

Приведенная ниже формула массива возвращает значение ИСТИНА,если каждый элемент диапазона с именем MyList найден в диапазоне с именем Master. Оба этих диапазона должны состоять из одного столбца в независимости от числа строк.

(=EHfl(nOMCKnO3(HCTMHA;EHfl(nOHCKnO3(MyList;Master;0));0))}

Также можно определить количество недопустимых значений. Иными словами, если нужно подсчитать количество элементов в MyList, которые отсутствуют в Master, можно воспользоваться следующей формулой:

{=CyMM(l*EHfl(nOHCKnO3(MyList;Master;0)))}

А для определения первого недопустимого элемента в MyList можно успешно использовать формулу:

(=MHflEKC(MyList;nOMCKnO3(MCTMHA;EHfl(nOHCKnO3(MyList;Master;0));0))}

Определение суммы цифр числа

Для вычисления суммы цифр в положительном целом числе, которое хранится в ячейке А1, можно применить формулу:

{=СУММ(ПСТР(А1;СТРОКА(ДВССЫЛ("1:"&ДЛСТР(А1)));1)*1)}

Например, если ячейка А1 содержит значение 409, приведенная выше формула возвратит значение 13 (4+0+9=13).

А чтобы понять, как работает эта формула, рассмотрим функцию СТРОКА в формуле:

{=СТРОКА(ДВССЫЛ("1:"&ДЛСТР(А1)))}

Эта формула возвращает массив последовательных целых чисел, начинающийся с единицы и заканчивающийся количеством цифр в числе, находящемся в ячейке А1. Например, если ячейка А1 содержит значение 409, функция ДЛСТР возвратит значение 3, функцией СТРОКА будет сгенерирован массив:

Подробная информация об использовании функции двссыл приведена в главе14.

Затем полученный массив используется в качестве второго аргумента функции ПСТР. Если в формулу с ПСТР подставить полученные в описанном примере значения, формула упростится и будет иметь вид:

П С Т Р ( 4 0 9 ; ( 1 ; 2 ; 3 } ; 1 ) * 1 Эта формула генерирует массив, состоящий из трех элементов:

{4;0;9}

350

Часть IV. Формулыма

Теперь общая формула с функцией СУММ еще более упростится ибудет иметь вид:

=СУММ({4;0;9})

Результат вычислений равен13.

Функция ПСТР возвращаеттекстовую строку. Для преобразованиятекста в число элементы массива, находящиеся в аргументе функции ПСТР, умножаются на 1. Альтернативный путь — использование функции ЗНАЧЕН, которая также преобразует строку текста, отображающую число, в числовое значение.

Заметьте, чтоописанная выше формула не работает с отрицательными значениями, так как знак минус не является цифрой. Ниже приводится формула, которая исправляет этот недостаток. Дляэтого применяется функция ABS, которая возвращает абсолютное значение числа. На рис. 15.4 представлен рабочий лист, содержащий вячейке В 2 следующую формулу:

{=СУММ(ЗНАЧЕН(ПСТР(ABS(A2);СТРОКА(ДВССЫЛ("1:"&ДЛСТР(ABS(A2))));!)))}

 

J b

Widgets

$11.69

5.23%;

$66.47

1

 

"3

Sprockets

$9.74

5.23%:

$7184

 

JjSnapholytes

$9.85

5.23%;

$28.00

 

 

"siGRAND TOTAL

 

 

$168.32

 

 

'Si

 

 

 

 

 

 

iL

 

 

 

 

Рис. 15.4. Формула массива вы-

Рис. 15.5. Применение формулы массива

устраняет

числяет сумму цифр любого це-

ошибку округления

 

 

 

 

лого числа

 

 

 

 

 

 

Формула вячейке В2 была скопирована в другие ячейки столбца В для вычисления суммы чисел, находящихся встолбцеА.

Суммирование округленных значений

На рис. 15.5представлен рабочий лист, который иллюстрирует проблему всех электронных таблиц — ошибку округления.

Как видно из рисунка, общая сумма в ячейке Е5 не является точной суммой чисел в столбце Е.Значения в столбце Е используют числовой формат, в котором отображается две цифры после запятой. Действительные значения имеют больше знаков после запятой, которые не отображаются. Таким образом, в ячейках находятся значения, округленные до двух десятичных разрядов после запятой. Результирующее влияние погрешностей округления может привести к общему неточному результату. Общее точное значение составляет $168,320997, отображаемое — $168,32.

Формула массива создает новый массив, который состоит из округленных значений в столбце Е:

{=СУММ(ОКРУГЛ(Е2:Е4;2))}

Эта формула возвращает правильную величину суммы округленных значений — $168,31. Для устранения таких ошибок округления можно ввести в ячейки столбца Еуже округленные

значения спомощи функцииОКРУГЛ. Этот подход не требует создания формулы массива.

Глава 15.Магия формулмассива

351

В главе 10 содержится подробная информация о функциях Excel, осуществляющих округление.

Суммирование каждого n-го значения вмассиве

Предположим, что существует диапазон значений и необходимо высчитать сумму каждого третьего значения в нем: первого, четвертого, седьмого и т.д. Один из путей решения этой задачи — внести адреса ячеек в формулу суммирования. Однако лучшим решением является использование формулы массива.

Обратимся к данным рис. 15.6. Значения хранятся в диапазоне В2 : В20 с именем Data, a значение п задается в ячейке D6, названной п.

ISjjjjj S ^ В

ШШШШШШШШШШШШШШШШШШШШШШШШЙ 1

s i r

Data

3

- nth value

| Ц

l l

1

3

 

 

 

В

2

70

- Result returned by a tingle array formula

H

1

 

 

 

 

В

4

 

 

 

я

5

 

 

*«|

8

 

 

 

Я

6

 

 

I 2

в

9

 

 

 

Я1

7

 

 

 

я

 

 

 

 

я

10

 

 

 

 

 

 

 

 

11

 

 

 

 

12

 

 

 

 

13

 

 

 

!!

14

 

 

„„«

15

 

 

,2

 

 

 

т

16

 

 

17

 

 

 

ш

18

 

 

 

 

 

 

 

 

19

 

 

 

 

^SumEy try Nth(vert) /ШШЩЖфЩ^ J <\Т№^В»ШЯ№0&!й

Si1

Рис. 15.6. Формуламассива возвращает сумму каждого п-го значенияв диапазоне

Для суммирования каждого л-го элемента диапазона воспользуемся формулой:

{ = С У М М ( Е С Л И ( О С Т А Т ( С Т Р О К А ( Д В С С Ы Л ( " 1 : " & Ч С Т Р О К ( D a t a ) ) ) - l ; n ) = 0 ; D a

Эта формула создает массив последовательных целых чисел, а функция ОС ТАТ использует его в качестве первого аргумента. Второй аргумент функции ОС ТАТ — значение п. Функция ОС ТАТ создает другой массив, состоящий из остатков деления каждого последовательного целого числа на п. При равенстве элемента этого массива 0 (это значит, что деление прошло без остатка) происходит суммирование соответствующих значений в диапазоне Data.

Эта формула выдает сообщение об ошибке, если принять значение п равным 0. Улучшенная формула массива включает функцию ЕСЛИдля успешной работы прип=0:

{=ЕСЛИ(п=0;0;СУММ(ЕСЛИ(ОСТАТ(СТРОКА(ДВССЫЛ("1:"&ЧСТРОК(data)))- l;n)=0;data;"")))}

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

352

Часть IV.Формулы массива

Для создания формулы, работающей с горизонтальным диапазоном, необходимо транспонировать массив целых чисел, генерируемых функцией СТРОКА. Модифицированная формула массива, предназначенная для обработки горизонтального диапазона Data, имеет вид:

{=ЕСЛИ(п=0;0;СУММ(ЕСЛИ(ОСТАТ(ТРАНСП(СТРОКА(ДВССЫЛ( " 1 : " & Ч С Т Р О К ( D a t a ) ) ) )

- l ; n ) = 0 ; D a t a ; " " ) ) ) }

Исключение нечисловых символов из текстовой строки

Приведенная ниже формула проводит извлечение числа из текстовой строки. Например, при применении формулы к текстовой строке, содержащей текст ABC145Z, возвращается значение 145.

{=ПСТР(А1;ПОИСКПОЗ(0;(ЕОШИБКА(ПСТР(А1;СТРОКА(ДВССЫЛ("1:"&ДЛСТР(А1)));1) *1)*1);0);ДЛСТР(А1)-

СУММ((ЕОШИБКА(ПСТР(А1;СТРОКА(ДВССЫЛ("1:"&ДЛСТР(А1)));1)*1)*1)))}

Эта формула работает только с непрерывными цифровыми последовательностями. Например, формула не даст правильного ответа при применениик текстовой последовательности X45Z99.

Определение ближайшего значения вдиапазоне

Пусть ячейка с произвольным числом имеет название Target. Для определения ближайшего к нему числа из массива Data воспользуемся формулой массива:

{=MHflEKC(Data;nOMCKnO3(HAMMEHbmPm(ABS(Target-Data);1);ABS(Target- Data) ;0) ) }

Если в массиве существует два числа, ближайших к Target,формула возвратит значение первого такого числа. На рис. 15.7 представлен при-

мер применения этой формулы.

 

 

 

 

Щ

 

п'ИМ

 

 

 

 

 

 

В этом примере Data

находится

в

диапазоне

 

Data

Target Value•->

45

f-V;

А2:А20,

значение

Target

составляет

45.

Формула

3'..

-12

-4

Closest Match.

48

массива

находится

в ячейке D3 и возвращает бли-

4 4

4

 

 

'\'J

В

12

 

 

*,%

жайшее к Target значение, равное 48.

 

 

8

20

 

 

\*5

 

 

Г

32

 

 

*. :

Возвращение последнего

8

40

 

 

М;

9 :

48

 

 

 

 

 

 

 

 

 

10

56

 

 

 

 

 

 

 

 

 

11

72

 

 

 

значения встолбце

 

 

ИГ

80

 

 

i *•

 

 

97

 

 

 

 

 

 

 

 

п

88

 

 

 

 

 

 

 

 

 

14

96

 

 

 

Предположим, существует рабочий лист, в стол-

16 i

105

 

 

№'

\7

137

 

 

 

бец А которого периодически вносятся новые данные.

18-

145

 

 

if

20

173

 

 

 

 

 

 

 

 

Ш

165

 

 

 

Необходимо отобразить последнее введенное значе-

 

 

 

 

ad

ние. Если столбец А не содержит пустых ячеек, дан-

Н 4

* 4Hf\sheetl/

 

 

 

 

 

ную задачу можно решить сравнительно просто, не

Рис

1 5 7

формуламассива возвращает

прибегая к использованию формул массива:

 

ближайшее значение

 

 

=СМЕЩ(А1;СЧЕТЗ(А:А) - 1;0)

Эта формула использует функцию СЧЕТЗдля подсчета количества непустых ячеек в столбце А. Это значение (минус 1) используется в качестве второго аргумента функции СМЕЩ. Например, пусть последнее значение было введено в строку с номером 100. Функция СЧЕТЗ возвратит значение 100, а функция СМЕЩ — значение в ячейке, находящейся на 99 строк ниже ячейкиА1.

Глава 15.Магия формул массива

353

Однако столбец А вполне может содержать хотя бы одну пустую ячейку внутри диапазона. Это приведет к тому, что предыдущая формула будет выполняться неправильно. Дело в том, что функция СЧЕТЗ не подсчитывает пустые ячейки.

Приведенная ниже формула возвращает содержимое последней непустой ячейки в первых 500 строках столбца А:

{=ИНДЕКС(А1:А500;МАКС(СТРОКА(А1:А500)*(А1:А500<>"")))}

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

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

Возвращение последнего значения встроке

Аналогично можно найти значение последней непустой ячейки в строке. Для этого воспользуемся формулой:

{=ИНДЕКС (1:1;МАКС (СТОЛБЕЦ (1:1) *(1:1<>||И))) }

Эта формула осуществляет поиск в первой строке. Чтобы применить ее для других строк, нужно вместо ссылки 1:1 задать ссылку на соответствующую строку.

Упорядочение данных с помощью формулы массива

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

Использование для этой цели стандартной функции Excel РАНГ может приводить не совсем к тем результатам, которые ожидаются. Например, если два значения находятся на третьем месте, функция РАНГ присваивает каждому из них значение, равное 3. Однако может возникнуть желание определить их ранг как средний относительно других рангов. Иными словами, ранг 3,5 в этой функциидля обоих значений связан с третьим местом.

 

На рис. 15.8 представлен рабочий лист, в котором применяется два метода оценки значе-

ний,

находящихся в столбце В (диапазон Sales). Первый метод (столбец С) использует функ-

цию

РАНГ. В столбце Dвычисляется ранг с помощью формулы массива.

 

В ячейке D2 находится формула массива:

{=СУММ(1* (B2<=Sales.) ) -(СУММ(1* (B2=Sales) ) -1) /2} Эта же формула скопирована в нижниеячейки.

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

354

Часть IV. Формулы ма

 

А

 

 

 

 

 

 

V Salesperson

Sales |

 

I Array Formula

 

! 2 j Adams

123.000

6

 

6

 

 

3yBige!ow

98.000'

9

 

 

 

"\

J4J Fredericks

98.000

9

(

10

J Assigned middle rank

¥,}

5

Georgio

98.000

9

V

Ю J

\\

8

Uensen

25.000

12

^*~~VL

 

T\

fj

Juarez

101,000

8

 

8

 

j '

TlKlein

305.000

1

 

 

 

 

T ] Lynch

145.000

3

(

3.5 ^

j

 

"ШЗМаупе

145.000

3

 

 

Assigned average rank

 

I t

]Roberton

121.000

7

 

7

 

 

lijsiokum

124.000

5

 

5

 

 

13jWu

150.000

2

 

2

 

 

N*'"«, * «\sheetl / 7

 

v ;•

f•<:

 

 

 

Puc. 15.8. Оценкаданныхс помощифункции РАНГи формулы массива

Каждая формула массива работает следующим образом. Вычисляется количество значений, больших анализируемого значения. Затем определяется количество равных значений минус один. А потом из первого количества вычитается половина второго.

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

Перекрестные таблицы представляют обрабатываемые данные в двух измерениях. Рассмотрим данные примера, представленного на рис. 15.9.

 

 

 

 

в

Аякний

 

 

 

 

 

 

 

 

Category

 

 

 

 

 

 

 

 

Food

23 50

 

T m n ep

Food

Lodqmg

 

 

 

 

Transp

1500

4-Jan

160 50

49 57

65 95

 

 

 

 

Food

912

5-Jm»

20 00

27 80

89 00

 

 

 

 

Food

1695

 

0 00

101 96

75 30

6 14-Jan

 

 

Transp

145 50

 

11 50

25 00

11200

JH+Jan

 

 

Lodging

65 95

 

 

 

 

l l S

5 "

J

a n

Transp

20 00

 

 

 

 

Jtj5-Jan

 

 

Food

7 80

 

 

 

 

 

 

 

 

Food

20 00

 

 

 

 

| t j 5-Jan

 

 

Lodging

89 00

 

 

 

 

J2J6-Jan

 

 

Food

9 00

 

 

 

 

"i3h6-Jan

 

 

Food

350

 

 

 

 

14j 6-Jan

 

 

Food

1102

 

 

 

 

 

 

 

 

Food

7844:

 

 

 

 

lf":6-Jan

 

 

Lodging

7530

 

 

 

 

]7i7-Jan

 

 

Transp

1150

 

 

 

 

1|]7-Jan

 

 

Food

1550

 

 

 

 

 

 

 

 

Food

950

 

 

 

 

2CM7-Jan

 

 

Lodging

11200

 

 

 

 

2\k

«\sheell

 

 

 

 

 

Puc. 15.9. Использованиеформулмассива для суммирования данных в динамическихперекрестных таблицах

На этом рабочем листе представлен простейший список общих издержек. В столбцах содержится информацияо дате (Date), статье издержек (Category) и общей сумме издержек(Amount).

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

{=СУММ(($E3=Date)*(F$2=Category)*Amount)}

Эта формула скопирована и в остальные 14 ячеек таблицы. Формула отображает общие итоги каждого дня по категориям.

Глава 15. Магия формул массива

355

Она суммирует значения в диапазоне Amount в том случае, если названия строки и столбца в сводной таблице совпадают с данными в соответствующих диапазонах Date и Category. Это достигается путем умножения двух булевых (логических) выражений на Amount. Если оба булевых выражения — ИСТИНА,то результат равен Amount. Если хотя бы одно из булевых выражения — ЛОЖЬ,результат равен 0.

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

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

Работа сформулами массива, возвращающими несколько значений

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

Извлечение положительных значений из диапазона

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

используется формула массива:

Ри. 15.10.

Применение

формулы

массива

для возвращения

из

диапазона

только положитель-

 

{=ИНДЕКС(Data;НАИМЕНЬШИЙ(ЕСЛИ(Data>0;СТРОКА

(ДВССЫЛ("1:"&4CTPOK(Data))));СТРОКА(ДВССЫЛ("1:

"&4CTPOK(Data)))))}

Как видно из рис. 15.10, эта формула работает, но несовершенно.

Диапазон Data находится в А2:А21, а формула массива введена в диапазон С2 : С21. Однако формула массива выдает сообщение об ошибке #ЧИСЛО! для ячеек, которые не содержат значения.

Более комплексная формула массива, избегающая это сообщение об ошибке, имеет вид:

{ = Е С Л И ( Е О Ш ( Н А И М Е Н Ь Ш И Й ( Е С Л И ( D a t a > 0 ; С Т Р О К А ( Д В С С Ы Л ( " 1 : " & 4 C T P O K ( D a t a ) ) ) ) ; С Т Р О К А ( Д В С С Ы Л ( " 1 : " & Ч С Т Р О К

( D a t a ) ) ) ) ) ; " " /ИНДЕКС ( D a t a / Н А И М Е Н Ь Ш И Й (ЕСЛИ ( D a t a > 0 ; СТРОКА (ДВССЫЛ (" 1 : "&ЧСТРОК ( D a t a ) ) ) ) /СТРОКА

(ДВССЫЛ ( " 1 : "&ЧСТРОК ( D a t a ) ) ) ) ) ) }

ных значений

356

Часть IV. Формулы массива

Puc. 15.11. Порядок следования элементов массива изменяется на противоположный с помощью формулы массива
first
!*:
VI
10
9
8
7th
6th
5th fourth third second
'i
?
k

Извлечение непустых ячеек издиапазона

Формула этого раздела — вариация формулы из предыдущего. Она работает с одномерным вертикальным массивом с именем Data. Формула массива вводится в такой же по размерности диапазон, что и Data, и возвращает только непустые ячейки из диапазона Data:

{ =ЕСЛИ(ЕОШ(НАИМЕНЬШИЙ (ЕСЛИ ( D a t a o " " ; С Т Р О К А (ДВССЬШСЧ: "&4CTPOK(Data) ) ) ) ; СТРОКА(ДВССЫЛ("1:"&4CTP0K(Data)))));"";ИНДЕКС(Data;

НАИМЕНЬШИЙ (ЕСЛИ ( D a t a o 1 1 " ; СТРОКА (ДВССЬШСЧ: "&4CTP0K(Data) ) ) ) ; СТРОКА(ДВССЫЛ("1:"&ЧСТРОК(Data))))))}

Изменение напротивоположный порядка следования элементов вдиапазоне

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

ком следования элементов, нежели в Data, используется

формула массива:

1

OetaErttiYRaiW

2 '

first

{=EOIH(HHflEKC(Data;4CTPOK(Data) -

СТРОКА ( Д В С С Ы Л П : "&ЧСТРОК ( D a t a ) ) ) + 1 ) = " " ; 11 " /ИНДЕКС (Data;ЧСТРОК ( D a t a ) - СТРОКА(ДВССЫЛ("1:"&ЧСТРОК(Data)))+1))}

Присвоим диапазону А2 : А2 0 имя Data, а формулу массива введем в диапазон С2 : С20. На рис. 15.11 продемонстрирована работа представленной выше формулы массива.

Динамическая сортировка величин вдиапазоне

3

-

second

 

'A

J

third

 

5

;

fourth

 

6

'

5th

 

7

«

6th

 

8

:

7th

 

В *

8

 

10

 

9

 

11

 

10

 

12;

 

 

13-

 

 

H

 

 

 

1$:

 

 

16

 

 

 

1?

 

 

 

18

 

 

 

19

 

 

 

20-

 

 

21,

.

. , _ „

• «»au .

H 4 »

H\sheetl/

,

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

{=НАИБОЛЫ11ИЙ (Data; СТРОКА (ДВССЬШ("1: "&ЧСТРОК (Data) ) )•)}

Она должна вводиться в такой же по размеру диапазон, что и Data, и производить сортировку только числовых значений.

Для сортировки значений Data по возрастанию применяется формула: { НАИМЕНЬШИЙ (Data; СТРОКА (ДВССЬШСЧ: "&ЧСТРОК (Data) ) ) ) }

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

Для ячеек в Data, не имеющих значения, формула массива будет выдавать сообщение об ошибке #ЧИСЛО!. Этот факт может раздражать при вводе данных. Улучшенная версия формулы, исключающая появление сообщений об ошибке, имеет вид:

{=ЕСЛИ(ЕОШ(НАИБОЛЫ11ИЙ(БаЬа;СТРОКА(ДВССЫЛСЧ: "&ЧСТРОК (Data) ) ) ) ) ; " " ; НАИБОЛЬШИЙ (Data; СТРОКА (ДВССЬШСЧ: "&ЧСТРОК (Data) ) ) ) ) }

Глава 15.Магия формул массива

357

Возвращение списка уникальных значений диапазона

Если существует одномерный диапазон с именем Data, для вывода списка уникальных элементов этого диапазона можно воспользоваться формулой:

{=ИНДЕКС(Data;НАИМЕНЬШИЙ(ЕСЛИ(П0ИСКП03

(Data;Data;0)=CTPOKA(flBCCbm("l:"&ЧСТРОК

(Data)));nOHCKnO3(Data;Data;0);"")/СТРОКА (ДВССЫЛС'1: "&4CTPOK(Data))))) }

 

 

 

тапя

 

 

ч Ш

- •

2 t

Dog

Doq

щ

3 '

Doj^

Cat

м

*i

DOJJ

Monkey

 

a

Doq

Elephant

 

Cat

Piqeon

я

7

Cat

Donkey

в :

Cat

/ЧИСЛО'

 

9

Cat

/ЧИСЛО!

 

10

Monkey

/ЧИСЛО!

 

 

Cat

/ЧИСЛО!

 

12

Elephant

/ЧИСЛО!

'*1

13 i

Elephant

/ЧИСЛО!

 

14

Elephant

/ЧИСЛО!

^1

Pigeon

/ЧИСЛО!

 

16-.

Pigeon

/ЧИСЛО!

 

 

Piqeon

/ЧИСЛО!

1

1 8 , _

Donkey

/ЧИСЛО!

 

19

Dog

/ЧИСЛО!

 

20

Monkey

/ЧИСЛО!

 

1 (

 

 

ни

Эта формула неработает, если диапазон Data содер-

Рис- 15.12. Формула массива приме-

жит хотя бы одну пустую ячейку. В незаполненных

етс» для создания списка уникаль-

ячейках формулы массива будет отображаться сообще-

^гх элементовдиапазона данных

ние об ошибке #ЧИСЛО!. Нарис. 15.12представлен пример применения формулы массива. Диапазон А2 :А20 имеет имя Data, а формула массива введена в диапазон С2 : С20.

Отображение календаря вдиапазоне

На рис. 15.13 представлен календарь, отображаемый в диапазоне ячеек..

Рабочий лист имеет дваопределенных имени: т (для месяцев), у (для лет). Единая формула массива вводится во все 42 ячейки, отображающие числа календаря. Диапазон В6 :Н И содержит формулу массива:

{=ЕСЛИ(МЕСЯЦ(ДАТА(у;т;1))оМЕСЯЦ(ДАТА(у;т;1)-(ДЕНЬНЕД(ДАТА(у;т;1))- 1)+{0:1:2:3:4:5}*7+{1;2;3;4;5;б;7}-1);"";ДАТА(у;т;1)- (ДЕНЬНЕД(ДАТА(у;т;1) )-1)+{0:1:2:3:4:5}*7 + {1;2;3;4;5;6;7}-1)}

Рис. 15.13. Отображение календаря с помощью одной формулы массива

358

Часть IV. Формулы массива

В действительности, формула массива возвращает значение даты, а ячейки отформатированы так, чтобы отображать только день из даты. Отметим, что формула массива использует массив констант. Для небольшого упрощения формулы массива, можно исключить функцию ЕСЛИ:

{=ДАТА(у;т;1)-(РАБДЕНЬ(ДАТА(у;т;1))- 1)+{0:7:14:21:28:35}+{0;1;2;3;4;5;6}>

В главе 14можно найти дополнительную информацию о массиве констант.

Эта версия формулы отображает дни из предыдущего и следующего месяцев. Функция ЕСЛИ в первоначальной формуле проверяет каждую дату на предмет принадлежности к текущему месяцу. Если дата не принадлежит к текущему месяцу, возвращается пустая строка.

Возвращение массива спомощью VBA-функций

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

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

Представленная формула работает, но только в том случае, если диапазон Data не содержит повторяющихся значений:

{=ИНДЕКС(БаЬа;П0ИСКП03(СТР0КА(ДВССЫЛ(и1:"&ЧСТРОК(Data)));СЧЕТЕСЛИ(Data ; " < = " & D a t a ) ; 0 ) ) }

Поэтому создана пользовательская VB А-функция, названная SORTED:

Function SORTED(rng, Optional ascending) As Variant Dim SortedData() As Variant

Dim CellCount As Long

Dim Temp As Variant, i As Long, j As Long CellCount = rng.Count

ReDim SortedData(1 To CellCount)

If IsMissing(ascending) Then ascending = True

If rng.Columns.Count > 1 Then

SORTED =CVErr(xlErrValue)

Exit Function

End If

For i = 1 To CellCount

SortedData(i) = rng(i)

If TypeName(SortedData(i)) = "Empty" _

Then SortedData(i) = ""

Next i

On Error Resume Next

For i = 1 To CellCount

For j = i + 1 To CellCount

Глава 15.Магия формул массива

359