|
|
|
Excel. Формула? Макрос? | ☑ | ||
|---|---|---|---|---|
|
0
twilight5023
28.06.06
✎
10:32
|
Вопрос такой, имеется отчет по продажам из ТиС'а, сохраненный в Excel'е и следующие позиции товара, например:
Сухарики "Кириешки" сало/чеснок 50г (60) - 145.000 шт Сухарики "Компашки" бекон 125г(24) - 24.000 шт Сухарики "Компашки" бекон 35г(40) - 170.000 шт Сухарики "Компашки" бекон 65г(20) - 55.000 шт В скобках в наименовании номенклатуры указано количество штук в коробке. Требуется написать формулу / макрос, которая будет смотреть количество указанное в скобках в наименовании номенклатуры, затем выделять количество в штуках из соответствующей колонки (при условии, если единица - "шт", блоки, коробки и прочие в расчет не берутся) и делить количество на количество в коробке, помещая результат в отдельную колонку. Т.е. необходимо получить те же самые продажи, но только в коробках. Предлагать менять основные единицы измерения перед снятием отчета в 1С не предлагать, начальными условиями задачи полагаем что имеется только XLS файл с отчетом. Подскажите в какую сторону копать, реально ли все эти действия осуществить одними формулами или придется прибегать к VBA? |
|||
|
1
RomaH
naïve
28.06.06
✎
10:36
|
можно формулами
посредством преобразования строки + поиск по строке |
|||
|
2
RomaH
naïve
28.06.06
✎
10:36
|
т.е. найти позиции скобок
и выделить строку в скобках |
|||
|
3
twilight5023
28.06.06
✎
10:42
|
(1,2) Угу... уже выделил количество... получилось что-то вроде =ПСТР(R11C1;НАЙТИ("(";R11C1)+1;НАЙТИ(")";R11C1)-НАЙТИ("(";R11C1)-1)
|
|||
|
4
Gluk
28.06.06
✎
10:44
|
(3) как то некрасиво
|
|||
|
5
twilight5023
28.06.06
✎
10:44
|
(4) Есть другие предложения по получению числа из скобок?
|
|||
|
6
asady
28.06.06
✎
10:44
|
Функция НАЙТИ находит вхождение одной текстовой строки (искомый_текст) в другую текстовую строку (просматриваемый_текст) и возвращает положение начала искомого текста относительно крайнего левого знака просматриваемого текста. Для поиска вхождений одной текстовой строки в другую текстовую строку можно использовать также функцию ПОИСК, но в отличие от функции ПОИСК функция НАЙТИ учитывает регистр и не допускает использования подстановочных знаков.
Функция НАЙТИБ находит вхождение одной текстовой строки (искомый_текст) в другую текстовую строку (просматриваемый_текст) и возвращает положение начала искомого текста относительно крайнего левого знака просматриваемого текста с учетом числа байтов, используемых каждым знаком. Эта функция используется при работе со знаками, занимающими два байта. Для поиска вхождений одной текстовой строки в другую текстовую строку можно использовать также функцию ПОИСКБ. Синтаксис НАЙТИ(искомый_текст;просматриваемый_текст;нач_позиция) НАЙТИБ(искомый_текст;просматриваемый_текст;нач_позиция) Искомый_текст — это искомый текст. Просматриваемый_текст — это текст, включающий искомый текст. Нач_позиция — это позиция знака, с которой следует начинать поиск. Первый знак в аргументе просматриваемый_текст имеет номер 1. Если аргумент нач_позиция опущен, то он полагается равным 1. Совет Аргумент нач_позиция можно использовать, чтобы пропустить нужное количество знаков. Например, задана текстовая строка «МДС0093.МесячныеПродажи». Чтобы найти первое вхождение знака «М» в описательную часть текстовой строки, задайте аргумент нач_позиция равным 8. В этом случае в части текста, которая является серийным номером, поиск производиться не будет. Функция НАЙТИ начинает со знака номер 8, находит искомый_текст в следующей позиции и возвращает число 9. Функция НАЙТИ всегда возвращает номер знака, считая от левого края текста, а не от значения аргумента нач_позиция. Заметки Если искомый_текст равен «» (пустая строка), то функция НАЙТИ считает подходящим первый знак в просматриваемой строке (то есть возвратит значение аргумента нач_позиция или 1). Искомый_текст не должен содержать никаких подстановочных знаков. Если искомый_текст не входит в просматриваемый_текст, то функции НАЙТИ и НАЙТИБ возвращают значение ошибки #ЗНАЧ!. Если нач_позиция меньше или равна нулю, то функции НАЙТИ и НАЙТИБ возвращают значение ошибки #ЗНАЧ!. Если нач_позиция больше длины строки просматриваемый_текст, то функции НАЙТИ и НАЙТИБ возвращают значение ошибки #ЗНАЧ!. Пример 1 (НАЙТИ) Чтобы этот пример проще было понять, скопируйте его на пустой лист. Инструкции Создайте пустую книгу или лист. Выделите пример в разделе справки. Не выделяйте заголовок строки или столбца. Выделение примера в справке. Нажмите сочетание клавиш CTRL+C На листе выделите ячейку A1 и нажмите сочетание клавиш CTRL+V. Чтобы переключиться между просмотром результатов и просмотром формул, возвращающих эти результаты, нажмите сочетание клавиш CTRL+` (апостроф) или в меню Сервис укажите на пункт Зависимости формул и выберите режим Режим проверки формул. 1 2 A Данные Николаневская Нина Формула Описание (результат) =НАЙТИ("Н";A2) Положение первой буквы «Н» в ячейке А2 (1) =НАЙТИ("н";A2) Положение первой буквы «н» в ячейке А2 (7) =НАЙТИ("Н";A2;3) Положение первой буквы «Н» в ячейке А2, начиная с третьего знака (15) Пример 2 (НАЙТИ) Чтобы этот пример проще было понять, скопируйте его на пустой лист. Инструкции Создайте пустую книгу или лист. Выделите пример в разделе справки. Не выделяйте заголовок строки или столбца. Выделение примера в справке. Нажмите сочетание клавиш CTRL+C На листе выделите ячейку A1 и нажмите сочетание клавиш CTRL+V. Чтобы переключиться между просмотром результатов и просмотром формул, возвращающих эти результаты, нажмите сочетание клавиш CTRL+` (апостроф) или в меню Сервис укажите на пункт Зависимости формул и выберите режим Режим проверки формул. 1 2 3 4 A Данные Керамические изоляторы #124-TD45-87 Медные катушки #12-671-6772 Переменные сопротивления #116010 Формула Описание (результат) =ПСТР(A2;1;НАЙТИ(" #";A2;1)-1) Извлекает текст от позиции 1 до позиции знака «#» в ячейке А2 (Керамические изоляторы) =ПСТР(A3;1;НАЙТИ(" #";A3;1)-1) Извлекает текст от позиции 1 до позиции знака «#» в ячейке А3 (Медные катушки) =ПСТР(A4;1;НАЙТИ(" #";A4;1)-1) Извлекает текст от позиции 1 до позиции знака «#» в ячейке А4 (Переменные сопротивления) Пример (НАЙТИБ) В приведенных ниже примерах НАЙТИ возвращает 2, так как пустая строка находится во второй позиции в строке, а НАЙТИБ возвращает 3, поскольку каждый знак учитывается со своей длиной (первый знак занимает 2 байта, поэтому второй знак начинается с байта 3). НАЙТИ("";"") равняется 2 НАЙТИБ("";"") равняется 3 |
|||
|
7
edelweiss
28.06.06
✎
10:46
|
(5)скобки всегда одни?
|
|||
|
8
twilight5023
28.06.06
✎
10:51
|
(6) Эээ... ну а как это поможет упростить выражение? Все равно для извлечения числа между скобками с помощью ПСТР необходимо знать позиции открывающей и закрывающей скобки, из них вычислять количество символов между ними... собственно так я и сделал, или я чего-то недопонимаю?
(7) Да, скобки всегда круглые... либо их вообще нет. p.s. Может там поиск по шаблону есть, что-нибудь вроде "(%d)"? ;) |
|||
|
9
edelweiss
28.06.06
✎
10:57
|
если всегда помещены в () и ... только один раз... то
number(strreplace(strName, left(strName, find(strName, "(")), "")) |
|||
|
10
twilight5023
28.06.06
✎
11:11
|
(9) Ну да... в принципе идея, заменить всю строку до вхождения первой скобки на пустую, а потом оставшееся преобразовать в число. Только вот тут два момента есть, допустим на первом примере, когда в скобках содержится "Наименование (30)" ... strreplace вернет "30)", а number это в число не преобразует, т.к. придется еще закрывающую скобку перед этим как-то отсекать. Да и в русском синтаксисе это еще страшнее выглядит:
=ПОДСТАВИТЬ(RC[-10];ЛЕВСИМВ(RC[-10];НАЙТИ("(";RC[-10]));""), это без number, который вообще обозвали как ЗНАЧЕН. Ладно, всем спасибо, оставлю так, как было у меня. |
|||
|
11
edelweiss
28.06.06
✎
11:12
|
number("300)данунафих") = 300
|
|||
|
12
twilight5023
28.06.06
✎
11:16
|
(11) ЗНАЧЕН("300ненафиг") = #ЗНАЧ! (с) Microsoft Excel 2002.
|
|||
|
13
edelweiss
28.06.06
✎
11:17
|
туплю... я думал ты 1С ковыряешь
|
|||
|
14
twilight5023
28.06.06
✎
11:19
|
(13) =) Бывает.
|
|||
|
15
Bagirius
29.06.06
✎
13:16
|
Если у тебя столбцы пронумерованы цифрами, то Сервис/Параметры/Общие - Стиль ссылок R1C1 сними.
Сухарики "Кириешки" сало/чеснок 50г (60) - 145.000 шт (индекс ячейки A1) 1 Этап - находим количество в упаковке 1. Находим "(" =НАЙТИ("(";A1;1). - результат 37 2. Находим ")" =НАЙТИ(")";A1;1) - результат 40 Теперь получаем следующую информацию - первый симол Количества = 37+1 - Количество Символо в количестве 40-37-1 т.е. 2 3. Вычисляем количество =ПСТР(A1;38;2) Можно все сделать в одной формуле =ПСТР(A1;НАЙТИ("(";A1;1)+1;НАЙТИ(")";A1;1)-НАЙТИ("(";A1;1)-1) 2 Этап - Находим количество штук По логике, все что после скобок - количество и минус " - " т.е. 3 символа Следовательно находим конечную часть 1. Находим ")" =НАЙТИ(")";A1;1)+4 - результат 44 - Это первый символ в Количестве штук 2. Находим Длину строки =ДЛСТР(A1) = результат 53 3. Определяеи кольчество символов справа 53-44 = 9 4. Находим количество =ПРАВСИМВ(A1;9) или =ПРАВСИМВ(A1;ДЛСТР(A1)-НАЙТИ(")";A1;1)-4) результат 45.000 шт 3 Этап Единица измерения Есть уже таблица Столбец А - инфа из 1С, B - Количество (1 Этап), C - Количество штук (Этап 2) 1. Находим первый пробел в результате полученном на 2 этапе =НАЙТИ(" ";С1;1) результат 7 2. Длина Строки =ДЛСТР(С1) результат 9 3. Получим Единицу измерения =ПРАВСИМВ(С1;9-7) или =ПРАВСИМВ(C1;ДЛСТР(C1)-НАЙТИ(" ";C1;1)) 4. Результат в колонку D 4 Этап Из результата 2 Этапа вычлини число 1. =НАЙТИ(" ";С1;1) результат 7 2. =ЛЕВСИМВ(C1;НАЙТИ(" ";C1;1)-1) 3. И преобразуем в число, т.е. удалим точки все по томуже принципу. Если хочешь автоматизировать, то заменяй точки формулами, если проще - то Заменить "." на пустоту "", только предварительно скопируй формулу где количество штук и вставь специальной ставкой как значение. 5 Этап делим только Шт, иначе возвращаем количество =ЕСЛИ(D1="шт";E1/B1;E1) |
|||
|
16
smaharbA
29.06.06
✎
13:18
|
все гораздо просче
|
|||
|
17
Bagirius
29.06.06
✎
13:18
|
(16) и как?
|
|||
|
18
smaharbA
29.06.06
✎
13:21
|
(17) а лениво, сами гадайте, ну и походу пьессы называйте меня болтуном и земляным червяком, я привык, тока патом будет самим мучительно больно за бесцельное старание :) так уж бывает, так уж выходит кто то ныряет, а кто то и так знает...
|
|||
|
19
Bagirius
29.06.06
✎
13:44
|
Можешь воспользоваться - Текст по столбцам
|
|||
|
20
twilight5023
29.06.06
✎
16:38
|
(15) Спасибо. Правда у меня все оказалось несколько проще, первый этап, собственно реализацию алгоритма вытаскивания числа из скобок я получил еще в (3), ну а деление количества, например 145.000 шт на полученный коэффициент получился просто с помощью операции деления, т.к. 145 (тип ячейки) оказался числом, к которому был применен соответствующий формат (штуки это уже "дописка" формата), так что выделять количество еще там не пришлось. Снимать стиль ссылок R1C1 также незачем... достаточно в формуле прописать относительную ссылку RC1 (под R здесь подразумевается любая строка) и скопировать эту формулу вниз по всем ячейкам.
|
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |