Разбор строки как массива в Excel 2010 (без VBscript) - PullRequest
3 голосов
/ 02 июля 2011

У меня есть целая куча ячеек, содержащих массивы произвольной длины, которые хранятся в виде строк, разделенных точкой с запятой, длиной от 1 до 65 записей, например:

  • pcmsh15 (232); pcmsh16 (232); ПКМШ17 (136);
  • ПКМШ12 (40);
  • ПКМШ12 (40);
  • ПКМШ12 (5); ПКМШ15 (20);

Мне нужен способ суммировать числа в скобках в Excel 2010 без использования VBA, помня, что они представляют собой строки произвольной длины , каждая из которых содержится в своей собственной ячейке.

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

="{"&SUBSTITUTE([@[data]],";",",")&"}"

Но, к сожалению, Excel не будет анализировать это как массив в SUM или COUNTIFтолько в виде строки.Один обходной путь, который я нашел, создает именованный диапазон, который ссылается на ячейку с массивом в виде строки, но так как у меня также есть произвольное число этих массивов в ячейках, я не могу присвоить имя каждой отдельной ячейке.

Isчто-то подобное возможно в «чистых» функциях Excel?

1 Ответ

2 голосов
/ 05 июля 2011

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

В ячейку B4 Я поместил одну из строк, которую вы хотите "разобрать":

B4:  pcmsh15(232);pcmsh16(232);pcmsh17(136);

Затем я поместил следующие формулы в ячейкиуказано:

B6:  =SUBSTITUTE(B4,"pcmsh", """dummy")
B8:  =SUBSTITUTE(B6,"(",""";")
B10: =SUBSTITUTE(B8,")","")
B12: =MID(B10, 1, LEN(B10)-1)
B14: ="{"&B12&"}"

Преобразует начальный текст в текстовое представление допустимого массива Excel:

B14: {"dummy15";232;"dummy16";232;"dummy17";136}

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

=EVALUATE(B14)

Обратите внимание, что в формуле используется относительная ссылка, поэтому, если вы используете это имя из ячейки, отличной от C14, вы 'Вы увидите, что B14 изменился на любую ячейку слева.

Используется старая макрос-функция Excel 4 EVALUATE, которая принимает строку и возвращает значение, которое представляет эта строка.Теперь мы можем поместить окончательную формулу в ячейку C14:

C14: =SUM(eval_left)

Поскольку SUM игнорирует нечисловые строки, вы получите нужный ответ без VBA.(Вы все еще получаете предупреждение о макросе, хотя из-за использования EVALUATE.)

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

РЕДАКТИРОВАТЬ:

В маловероятном случае, когда вы захотите сделать что-то подобное, вы столкнетесь с пределом длиныEVALUATE может справиться.Вам придется разделить более длинные строки на менее чем 65 значений, не использовать «пустышку» и т. Д., Но это все равно будет выполнимо.

...