Имя: Пароль:
IT
 
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 здесь подразумевается любая строка) и скопировать эту формулу вниз по всем ячейкам.