При использовании функции IF как использовать динамический набор для сравнения в аргументе «Logical_test»? - PullRequest
0 голосов
/ 09 августа 2010

Я использую формулу массива (в Excel 2003) для подсчета количества строк, удовлетворяющих определенному условию. Я использую столбец строк вместо таблицы ячеек для хранения моих данных из-за ограничений размера файла.

Формула ниже:

{=SUM(IF((VALUE(MID(INDIRECT(CONCATENATE(D1,"test")),6,1))*VALUE(MID(INDIRECT(CONCATENATE(D1,"test")),1,1)))=VLOOKUP(D2,t.lkup,2,FALSE),1,0))}

Выражение VALUE(MID(INDIRECT(CONCATENATE(D1,"test")),6,1)) просматривает ячейки в именованном диапазоне, чтобы вернуть значение. Это значение умножается на другое значение, возвращаемое выражением VALUE(MID(INDIRECT(CONCATENATE(D1,"test")),1,1)). Полученный результат затем ищется в наборе чисел, заданных VLOOKUP(D2,t.lkup,2,FALSE), который возвращает строку типа "{1,2,3,4}". Если продукт является элементом множества, то к сумме добавляется 1, иначе к сумме добавляется 0.

Когда я использую формулу массива выше (с установленным динамическим поиском), возвращается нулевое значение. Если я использую следующую формулу,

{=SUM(IF((VALUE(MID(INDIRECT(CONCATENATE(D1,"test")),6,1))*VALUE(MID(INDIRECT(CONCATENATE(D1,"test")),1,1)))={1,2,3,4},1,0))}

тогда верная сумма возвращается. Кто-нибудь знает, как заставить Excel рассматривать набор как статический набор вместо строки?

1 Ответ

0 голосов
/ 18 августа 2010

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

в вашем первом примере вы сравниваете одно значение чего-либо (поскольку самая внешняя функция в IF - это функция VALUE ()) с VLOOKUP, который возвращает строку ... которая должна быть неправильной ... тот факт, что ваш строка содержит фигурные скобки, не преобразует ее в массив.

во втором примере вы сравниваете одно значение с массивом, содержащим элементы {1,2,3,4}, поэтому на самом деле вы делаете четыре сравнения, и если одно из них разрешается в TRUE, вы добавляете 1.

Я не знаю, как преобразовать строку с разделителями-запятыми "{1,2,3,4}" в массив {1,2,3,4} без использования VBA, но, возможно, вы можете изменить свой тактику путем преобразования вашего значения VALUE (...) * VALUE (...) в строку и использования функции FIND (), чтобы определить число как подстроку строки условия.

например. скажем, ваш MID_CONCATENATE_TIMES_BLA_BLAH результат 7, а ваш

  • строка условия = "{1, 3, 5, 7, 9}", НАЙТИ (MID_BLA, CONX_STR) = ИСТИНА
  • строка условия = "{1, 2, 3, 4}", НАЙТИ (MID_BLA, CONDX_STR) = ЛОЖЬ

Это будет работать до тех пор, пока ваши результаты будут 1 цифрой. С более чем 1 цифрой вам нужно будет добавить пробел перед номером в MID_BLA и CONDX_STR; тоже не слишком сложно, но добавляя еще больше сложности в формулы.

Если вы хотите использовать VBA, вы можете использовать функцию Split () для создания массива, начинающегося с нуля, из отдельной строки

Function StrToArray(Arg As String) As Variant
    StrToArray = Split(Arg, ",")
End Function

и окружите свой VLOOKUP в (1) с помощью StrToArray (VLOOKUP (...)), в этом случае вы должны удалить фигурные скобки из строк условий.

Надеюсь, это поможет - удачи

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...