Stalker Пользователь Сообщений: 19 |
нашел мощную формулу массива типа автофильтра (выборка по 2 и более критериям!!!!) http://spreadsheetpage.com/index.php/tip/summing_and_counting_using_multiple_criteria/ НО!!! например формула завтра добавляю в массив еще 1000 строк получаю формулу формат ячеек копировал. не помогает. в чем заковырка? |
После ввода или изменения формулы массива нажать Ctrl+Shift+Enter не забываете? |
|
Stalker Пользователь Сообщений: 19 |
{quote}{login=}{date=13.04.2010 08:40}{thema=}{post}После ввода или изменения формулы массива нажать Ctrl+Shift+Enter не забываете?{/post}{/quote} не забываю. |
Dophin Пользователь Сообщений: 2684 |
вычислите формулу пошагово -посмотрите как и где спотыкается, выложите пример с неработающей формулой. |
vikttur Пользователь Сообщений: 47199 |
{quote}{login=StalkeR}{date=13.04.2010 07:04}{thema=периодически не работает формула массива}{post}было такое: нужно просматривать колонку «А», а формула видит только с колонки «С». пришлось вставлять пустые колонки, что бы сместить «А» на место «С»{/post}{/quote} |
{quote}{login=The_Prist}{date=13.04.2010 09:31}{thema=}{post}Может стоит диапазоны закрепить? =SUM(($A$2:$A$2000=»Jan»)*($B$2:$B$2000=»North»)*$C$2:$C$2000) А еще можно обойтись без Ctrl+Shift+Enter =SUMPRODUCT(($A$2:$A$2000=»Jan»)*($B$2:$B$2000=»North»);$C$2:$C$2000){/post}{/quote} извините, а по-русски это как? )))) я написал по англицки ибо со страницы формулу стащил для простоты. ))) |
|
Stalker Пользователь Сообщений: 19 |
{quote}{login=vikttur}{date=13.04.2010 09:32}{thema=}{post}{quote}{login=StalkeR}{date=13.04.2010 07:04}{thema=периодически не работает формула массива}{post}было такое: нужно просматривать колонку «А», а формула видит только с колонки «С». пришлось вставлять пустые колонки, что бы сместить «А» на место «С»{/post}{/quote} более. ((( 4,8мб. архив в мыло? |
Микки Пользователь Сообщений: 3280 |
{quote}{login=}{date=13.04.2010 09:38}{thema=Re: }{post}{quote}{login=The_Prist}{date=13.04.2010 09:31}{thema=}{post}Может стоит диапазоны закрепить? =SUM(($A$2:$A$2000=»Jan»)*($B$2:$B$2000=»North»)*$C$2:$C$2000) А еще можно обойтись без Ctrl+Shift+Enter =SUMPRODUCT(($A$2:$A$2000=»Jan»)*($B$2:$B$2000=»North»);$C$2:$C$2000){/post}{/quote} извините, а по-русски это как? )))) я написал по англицки ибо со страницы формулу стащил для простоты. ))){/post}{/quote} |
vikttur Пользователь Сообщений: 47199 |
Упростите пример, сохранив структуру данных, строк 20-30 достаточно. |
Stalker Пользователь Сообщений: 19 |
{quote}{login=vikttur}{date=13.04.2010 09:32}{thema=}{post}{quote}{login=StalkeR}{date=13.04.2010 07:04}{thema=периодически не работает формула массива}{post}было такое: нужно просматривать колонку «А», а формула видит только с колонки «С». пришлось вставлять пустые колонки, что бы сместить «А» на место «С»{/post}{/quote} да!!! просматривает со 2 стоки по 900. делаешь больше — ошибка. один чел говорит проблемы в длинных именах просматриваемых строк. |
vikttur Пользователь Сообщений: 47199 |
У Вас еще и «имена строк»? Тем более покажите зверя |
Stalker Пользователь Сообщений: 19 |
{quote}{login=vikttur}{date=13.04.2010 09:47}{thema=}{post}У Вас еще и «имена строк»? Тем более покажите зверя возможно я не правильно формулирую названия… ))) |
Haken Пользователь Сообщений: 495 |
У Вас в ячейке D969 на листе «потреб» стоит «56/0.11». Это значение не суммируется и из-за этого ошибка вылетает при расчетах. |
Dophin Пользователь Сообщений: 2684 |
ну и что? сложно было самому ошибку выцепить чтоли? у вас в ячейке Д969 стоит значение 56/0.11, что не является числом и выдает ошибку. |
vikttur Пользователь Сообщений: 47199 |
D969=56/0.11 — неверное значение, об него и спотыкается. |
Stalker Пользователь Сообщений: 19 |
{quote}{login=Dophin}{date=13.04.2010 10:01}{thema=}{post}ну и что? сложно было самому ошибку выцепить чтоли? у вас в ячейке Д969 стоит значение 56/0.11, что не является числом и выдает ошибку.{/post}{/quote} прошу прощения, что отнял время. …а сводная суммирует…. 8-\\ |
Serge Пользователь Сообщений: 11308 |
{quote}{login=StalkeR}{date=13.04.2010 10:32}{thema=Re: }{post} В сводной Шплинт 3.2х32.019 ГОСТ397-79 даёт значение 0,60 |
Stalker Пользователь Сообщений: 19 |
{quote}{login=The_Prist}{date=13.04.2010 10:42}{thema=}{post}=СУММ((потреб!$B$2:$B$1500=$A5)*(потреб!$A$2:$A$1500=D$4)*Ч(потреб!$D$2:$D$1500)){/post}{/quote} это чего? Ч будет только числовые суммировать? |
Stalker Пользователь Сообщений: 19 |
{quote}{login=Serge 007}{date=13.04.2010 10:45}{thema=Re: Re: }{post}{quote}{login=StalkeR}{date=13.04.2010 10:32}{thema=Re: }{post} В сводной Шплинт 3.2х32.019 ГОСТ397-79 даёт значение 0,60 не просчитывал, просто исправил если число * текст = ошибка |
vikttur Пользователь Сообщений: 47199 |
Верить правильным данным. Или ставить проверку, например, =СЧЕТЗ(диапазон)-СЧЕТ(диапазон) |
Serge Пользователь Сообщений: 11308 |
{quote}{login=StalkeR}{date=13.04.2010 11:55}{thema=Re: Re: Re: }{post} |
Stalker Пользователь Сообщений: 19 |
{quote}{login=Serge 007}{date=13.04.2010 12:07}{thema=Re: Re: Re: Re: }{post}{quote}{login=StalkeR}{date=13.04.2010 11:55}{thema=Re: Re: Re: }{post} не то имею ввиду. если таких строк с материалами и количествами 10000 будет? |
Serge Пользователь Сообщений: 11308 |
#23 13.04.2010 13:00:42 {quote}{login=StalkeR}{date=13.04.2010 12:31}{thema=Re: Re: Re: Re: Re: }Не то имею ввиду. См пример. Прикрепленные файлы
<#0> |
@california2007
Sorry, but I disagree. To use 365 as if nothing has changed is a dreadful choice. True Mike Girvin puts out some great material with more tricks than a cart load of monkeys, but the game has changed. All of the time-honoured tricks with AGGREGATE (to compress a list of indices) and ROW (to generate a sequence of numbers) are no longer needed.
= FILTER(Table, (SalesRep=SelectedRep)*(Date=selectedDate))
is neater or, padding it out
= LET(
repCriterion, (SalesRep=selectedRep)+(selectedRep=""),
dateCriterion, (Date=selectedDate)+(selectedDate=""),
FILTER(Table, repCriterion*dateCriterion)
)
is more flexible in terms of catering for omitted criteria. Similarly, Mike’s other formula would now be
= TAKE(SORTBY(UnitsRep, Units,-1), Top)
or, failing that,
= INDEX(
SORTBY(UnitsRep, Units,-1),
SEQUENCE(Top),
{1,2}
)
On the illustration all formulas are array. The range that each formula spans is bordered, and the first formula on each block is written on the top of that block.
Range A4:A103
is an input vector (which is numeric), range C4:G23
is a given (input) permutation of the rows of A4:A103
(necessarily positive non-zero integer numbers not greater then the length of the input vector).
Let us I interpret the permutation matrix as set of rows.
How to compute for each row in a constant number of cells the minimal number in the input vector? By the constant number of cells, I mean solution, that would require fixed number of cells for each row, regardless of the number of columns in permutation. (In the production case each dimension is much, much bigger; there is about 100 columns in the permutation matrix.)
I don’t ask for VBA solutions. If it is necessary the solution can use a free and publicly available Excel add-on, like MoreFunc, but I’d prefer to keep it vanilla Excel 2007 or later.
I thought that the formula {=MIN(INDEX(INDIRECT($A$2);$C4:$G4))}
would solve my problem. Surprisingly, Excel seems to not take into account the array nature of the formula, and evaluates it as if it was written as =MIN(INDEX(INDIRECT($A$2);$C4)
which is equivalent to dysfunctional =INDEX(INDIRECT($A$2);$C4)
.
On the other hand, we can see the argument to the MIN
is understood as array in the range I4:M4.
Как узнать, является ли данная формула формулой массива? Что вообще она означает?
На этапе создания формула (или также функция) сама по себе не является ни формулой массива, ни обычной формулой. Это вы определяете, как Excel должен истолковать формулу, которую вы вводите. То, что формула является формулой массива – это не столько особенность самой формулы, а скорее способом, которым программа Excel введенную формулу «обрабатывает». Подтверждение формулы с помощью сочетания клавиш «Ctrl + Shitf + Enter» – это является для Excelя командой на выполнение (обработку данных) как массив вычислений. Тогда он используется в качестве аргумента функции и возвращает в качестве результата вычислений таблицу (массив данных).
Примеры формул массива и отличие от обычных формул в Excel
Некоторые функции Excelя по умолчанию в качестве аргумента принимают диапазон ячеек (массив) и в результате возвращают одно значение. Отличными примерами являются функции СУММ, СЧЕТЕСЛИ, СРЗНАЧ и т.д. Для этих функций не имеет никакого значения, вводите ли вы их как функции массива или нет. Они и так обрабатывают таблицы, и найдут выход (сработают правильно) из любой ситуации. Вот такие маленькие Excel-евские приспособленцы.
К счастью, существуют другие функции, которые работают совершенно иначе, т.е. в зависимости от вашего решения относительно их принадлежности к «функциям массива» (иногда они вообще не хотят работать). Прекрасным примером является функция ЕСЛИ.
Когда формула является формулой массива, а когда обычной?
Для начала определимся как выглядит обычный массив значений в Excel. Это значения, которые находятся внутри фигурных скобок и разделены между собой точкой с запятой. Например:
{23;-32;15;7} – это синтаксис массива значений в Excel. Он может быть использован в аргументах функций.
Диапазон ячеек A1:A4 – так же является массивом значений в Excel. Естественно так же используется в аргументах функций. Например сравним результаты вычислений двух формул: =СУММ(A1:A4) и =СУММ({23;-32;15;7}) – они идентичны:
Визуально формула массива находится так же внутри фигурных скобок, но они не должны быть введены вручную, а только лишь при помощи комбинации клавиш CTRL+SHIFT+Enter. Если ввести вручную фигурные скобки, то формула не будет выполнятся в массиве – это будет синтаксическая ошибка в Excel.
Формула массива (введенная с помощью сочитания CTRL+SHIFT+Enter) будет использоваться везде, где вы хотите, чтобы функция, которая обычно работает с отдельными значениями (ячейками), внезапно повела себя иначе и приняла в качестве аргумента и вернула в качестве результата массив значений (таблицу). Вернемся к уже упомянутой функции ЕСЛИ. В качестве аргумента она принимает логическое значение ИСТИНА или ЛОЖЬ. В классической форме:
=ЕСЛИ($A$1>0;»больше»;»меньше»)
Если значение в ячейке A1 больше нуля, в качестве аргумента функция получит значение ИСТИНА и в качестве результата вернет текстовую строку «больше». Однако, если бы вы хотели проверить несколько ячеек сразу и передать результат такой проверки другой функции, вы должны были бы использовать вышеуказанную формулу как формулу массива. Для этого при вводе нажмем сочитание клавиш CTRL+SHIFT+Enter, а не как обычно (просто Enter):
{=ЕСЛИ($A$1:$A$4>0;»больше»;»меньше»)}
В качестве аргумента функция принимает целый диапазон $A$1:$A$4. В результате проверки каждой ячейки диапазона в памяти компьютера создается таблица значений в массиве. Схематически таблицу можно отобразить так:
А так выглядят эти значения в массиве:
{ИСТИНА;ЛОЖЬ;ИСТИНА;ИСТИНА}
Например, чтобы прочитать этот массив и получить второе значение (сделать выборку значений) воспользуемся функцией:
=ИНДЕКС({ИСТИНА;ЛОЖЬ;ИСТИНА;ИСТИНА};2)
Тоже самое что и:
Затем создается другая таблица, значения которой зависят непосредственно от значений в первой таблице. Если элемент в первом массиве имеет значение ИСТИНА, во втором массиве он примет значение «больше». Если он имеет значение ЛОЖЬ, элемент во второй таблице примет значение «меньше». После этой операции первая таблица удаляется из памяти компьютера, и в конечном счете, функция возвращает массив {«больше», «меньше», «больше», «больше»}. Схематически вторую таблицу можно отобразить так:
Так же ее можно прочитать функцией:
=ИНДЕКС({«больше»;»меньше»;»больше»;»больше»};2)
В примере с функцией ЕСЛИ была введена формула массива только в одну ячейку, поэтому в результате получили только одно значение, соответствующее первому значению в таблице. Однако достаточно ввести формулу массива в диапазон ячеек, чтобы увидеть все значения массива результатов. Для этого выделяем диапазон из нескольких ячеек, нажимаем клавишу F2 (или заново вводим формулу вручную) и жмем CTRL+SHIFT+Enter.
В примере (рисунок ниже) видно, что таблица результатов содержит ровно четыре элемента, о которых я упоминал выше.
Примеры как использовать формулу массива в Excel
Это все хорошо, но возникают некоторые вопросы: «Зачем же нужна формула массива?» или «Как или где использовать формулу в массиве?», «Чем она лучше обычной формулы?».
Разумеется, массив, возвращаемый функцией ЕСЛИ, может передаваться далее на «обработку» в качестве аргумента для другой функции.
Пример. Представим, что вы хотели бы найти сумму ячеек B7:B10, но только тех, которые имеют значение больше нуля. Конечно же, вы можете использовать функцию СУММЕСЛИ, однако в нашем примере мы хотим сделать это только с помощью формулы массива. Суммируя значения ячеек нашего диапазона, необходимо будет как-то избавиться от значения «-32». Функции СУММ необходимо передать массив, в котором содержатся только значения больше нуля. Везде там, где значение меньше нуля, мы заменяем его на ноль, что, конечно же, не повлияет на результат. Как вы уже знаете, временную таблицу с соответствующими значениями вы можете получить, используя функцию ЕСЛИ. В конечном итоге соответствующая формула будет выглядеть так:
Вводим формулу и не забываем для подтверждения ввода нажать комбинацию клавиш CTRL+SHIFT+Enter. В результате проверки каждой ячейки диапазона $A$1:$A$4 (является ли значение больше нуля) в памяти компьютера создается массив {ИСТИНА; ЛОЖЬ; ИСТИНА; ИСТИНА}. Затем создается очередная таблица. Если элемент в первом массиве имеет значение ИСТИНА, то во второй таблице будет отображаться значение из соответствующей ячейки. Если он имеет значение ЛОЖЬ, то элемент во второй таблице примет значение 0. После этой операции первая таблица удаляется из памяти компьютера, и в конечном итоге функция ЕСЛИ возвращает массив {23; 0; 15; 7}. Затем эта таблица передается в качестве аргумента функции =СУММ({23; 0; 15; 7}), которая, согласно своему предназначению, возвращает сумму всех элементов в таблице. В нашем примере сумма равна 45. В завершении, посмотрите, что произойдет, если вы скажете Excelю обработать приведенную выше формулу не как формулу массива.
Ни одна из описанных выше таблиц, в этом случае, не будет создана. Только одна ячейка диапазона будет проверена (ячейка в той же строке, в которой находится функция). В нашем случае 15>0 значит, как первый аргумент функция ЕСЛИ получит логическое значение ИСТИНА. Затем ВЕСЬ диапазон A1:A4 будет передан функции СУММ, и в результате функция возвращает значение равное 13 (23-32+15+7). Если бы в ячейке вместо значения 15 было число меньше нуля, функция ЕСЛИ в качестве аргумента получила бы значение ЛОЖЬ, и, следовательно, только значение нуля было бы передано функции СУММ. Наша функция СУММ в результате также вернет значение равное нулю.
Как отличать формулу массива от обычной формулы
При нажатии клавиш CTRL+SHIFT+Enter для подтверждения ввода в строке формул будут отображены фигурные скобки по краям. Значит данная формула выполняется в массиве. Но что если еще на этапе создания неизвестно какой тип формул следует применять?
Правильное «распознавание», когда следует нажимать CTRL+SHIFT+Enter, а когда просто Enter полностью зависит от понимания того, как работают массивы в формулах. Когда вы это поймете, сможете сказать, что конкретную формулу следует вводить (подтверждать) сочетанием клавиш – CTRL+SHIFT+Enter.
Конечно же, не подтвержденная, а просто как формула также может возвращать КАКОЙ-ТО результат (в чем вы могли только что убедиться сами). Однако, если вы сможете прочитать формулу и понять механизм, то вы заметите, что такой результат является ОШИБОЧНЫМ. И поэтому для правильной работы формулы вам необходимо ее подтвердить «Ctr+Shift+Enter». Как и все, понимание и использование формул массива требует практики. Тем не менее, стоит некоторое время посвятить тому, чтобы во всем разобраться. Потому что формулы массива позволяют решить многие проблемы, которые на первый взгляд могут казаться неразрешимыми.
Примеры вычислений и анализа формул массива
Каким образом можно просматривать и проверять значения промежуточных результатов расчета, например, содержание массивов, созданных в памяти компьютера и используемых для выполнения последующих действий? Ничего сложного! Пример 1:
Перейдите на ячейку с формулой, а затем в строке формул выделите в первом аргументе функции ссылку на диапазон ячеек:
Нажмите клавишу F9 (или «Пересчет» в правом верхнем углу меню «Формулы»), и вы получите (в строке формулы) значения аргументов, которые используются для вычислений, как показано ниже:
— запись с использованием двоеточий означает, что мы имеем дело с элементами вертикального (столбикового) массива, элементы горизонтального (строкового) разделены стандартным символом — «;» (точкой с запятой).
Пример 2: Снова перейдите на ячейку с формулой массива, но на этот раз выделите первый аргумент функции целиком вместе со знаком сравнения «>» и значением критерия – «0»).
Нажмите кнопку F9, и вы получите массив результатов вычислений, как показано ниже:
То есть, созданный в памяти компьютера массив:
{ИСТИНА:ЛОЖЬ:ИСТИНА:ИСТИНА}
Пример 3: Выделите ячейку формулой массива где в функцию СУММ вложена функция ЕСЛИ. Затем в строке формул выберите весь аргумент функции СУММ (вместе с функцией ЕСЛИ):
Нажмите клавишу F9 и вы получите массив итоговых результатов вычисления, которые используются для суммирования, как показано ниже:
То есть, созданный в памяти компьютера массив:
{23157}
Пример 4: Просто перейдите на ячейку с формулой B1 и выберите инструмент «ФОРМУЛЫ»-«Зависимости формул»-«Вычислить формулу»
После чего нажмите на кнопку «Вычислить»:
В результате ссылка на диапазон ячеек в аргументе вложенной функции ЕСЛИ разложилась на массив значений. Снова нажмите на кнопку «Вычислить»:
Мы получили массив значений теперь уже для функции СУММ. Такой же, как и в примере 3.
Читайте также: Работа с массивами функций в Excel.
Часто неопытные пользователи Excel возмущаются, что формула не работает. В конце концов оказалось, как легко догадаться, формулу в массиве вводили как обычную (просто Enter). Речь идет не о недоразумении, которое произошло, а о том факте, что у этих пользователей возникает вопрос: как избегать таких ошибок? Поэтому важно сразу во всем разобраться, чтобы в дальнейшем больше не задавать таких вопросов.
Почему не работает формула массива в таблице? |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |