Скопировать значение по совпадению наименований товаров

Автор ForumOOo (бот), 1 августа 2018, 16:54

0 Пользователи и 1 гость просматривают эту тему.

ForumOOo (бот)

Компонент: Calc
Версия продукта:
Сборка:
ОС:

Товарищи, мне необходимо получить следующий результат:
есть 4 столбца; В 1м и 3м наименования товаров. Мне необходимо каждую
строку третьего столбца сравнить со всеми строками первого, найти
совпадение и скопировать значение из 2-го в 4-й. Такое вообще
возможно? Может я не правильно описал... Понятно ли что я ищу?<br/><br/>--<br/>Подпись: Lyolik<br/>Эл. почта: Lyolibolikne@gmail.com

JohnSUN

#1
Добро пожаловать на форум!
Да, Lyolik, это не очень сложно. Только уточни, пожалуйста, ты каким Calc'ом пользуешься?
Для Calc'а из LibreOffice формула будет покороче, для Calc'а из OpenOffice - длиннее (хоть и делают эти формулы одно и то же)
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

LyoliBolik

#2
Я пользуюсь LibreOffice на Linux Ubuntu Mate

JohnSUN

#3
Отлично!
Тогда решение может быть таким:
=IFERROR(VLOOKUP(C2;A:B;2;0);"не найден")
=ЕСЛИОШИБКА(ВПР(C2;A:B;2;0);"не найден")

или
=IFERROR(INDEX(B:B;MATCH(C2;A:A;0);1);"не найден")
=ЕСЛИОШИБКА(ИНДЕКС(B:B;ПОИСКПОЗ(C2;A:A;0);1);"не найден")

Это сработает, если в первом столбце названия товаров уникальны, не повторяются. Любой из вариантов будет находить первый товар и выводить значение для него.
А вот если - может ведь и такое случиться - товары в первых двух колонках дублируются, тогда лучше использовать формулу
=SUMIF(A:A;C2;B:B)
=СУММЕСЛИ(A:A;C2;B:B)

Любую из этих формул нужно вписать в ячейку D2 и растянуть до конца данных в третьей колонке
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

LyoliBolik

Благодарю Вас, сэр! Сейчас буду тестировать) Отпишусь о результате)

LyoliBolik

Доброго времени...
Формула работает. Благодарен!
Но я столкнулся с тем что в ячейках пишет не найдено, однако ctrl+F находит соответствия. Т.е. В Ячейке С2 есть значение, которое соответствует значению в массиве А:А, но при этом может отличаться на 1-2 символа (запятая или пробел в конце выражения в массиве). В таком случае мне формула пишет "не найдено". Возможно ли как-то повлиять на это? Что бы сравнение шло не на 100% на например соответствие 12-15 символов? Потому что, опять же, я копирую полностью содержание ячейки С2 вставляю в поиск и сразу нахожу строку в массиве из первого столбца.

JohnSUN

Да, Lyolik, это тоже можно сделать.
Какую из формул решил использовать?
Я, например, вот только что изменил формулу с SUMIF:
=SUMIF(A:A;".*"&C2&".*";B:B)
Зашёл в Tools - Options - LibreOffice Calc - Calculate (Сервис - Параметры - Calc - Вычисления) и отметил "Разрешить регулярные выражения в формулах"
Считает...
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

LyoliBolik

У меня формулы на русском.
Изначально подошла эта
=ЕСЛИОШИБКА(ИНДЕКС(B:B;ПОИСКПОЗ(C2;A:A;0);1);"не найден")
и всё считалось.
Так, это Вы заменили С2 на ".*"&C2&".*"? И в настройках регулярные выражения позволили?
Сейчас попробую.

LyoliBolik


JohnSUN

В каком смысле? Нашло, но не то? Не нашло вообще?
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

OOKapitan

Цитата: LyoliBolik от 12 августа 2018, 13:36
не дало результата, к сожалению(((

Гадать можно вечно. Файл покажите, пожалуйста.

JohnSUN

Не нужен файл, и так понятно: в текстах ячеек встречаются специальные символы - звёздочки, точки, скобки.
Решение простое. Их даже два:
Предварительно подготовить списки в колонках A и C - чтобы не попадались эти самые
Цитата: LyoliBolik от 12 августа 2018, 12:33
1-2 символа (запятая или пробел в конце выражения в массиве).
Другими словами, обеспечить полное совпадение текстов
Второе решение - более длинная формула:
=ЕСЛИОШИБКА(ИНДЕКС($B$2:$B$3000;ПОИСКПОЗ(СЖПРОБЕЛЫ(C2);ЛЕВ(СЖПРОБЕЛЫ($A$2:$A$3000);ДЛСТР(СЖПРОБЕЛЫ(C2)));0);1);"не найден")
=IFERROR(INDEX($B$2:$B$3000;MATCH(TRIM(C2);LEFT(TRIM($A$2:$A$3000);LEN(TRIM(C2)));0);1);"не найден")
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

kompilainenn

Цитата: JohnSUN от 20 августа 2018, 09:08Второе решение - более длинная формула:
Шаман однако

ps: для меня такие штуки будут волшебством еще долго
Поддержать разработчиков LibreOffice можно тут, а наш форум вот тут

JohnSUN

Ай, брось - какое там "волшебство"? Обычное камлание...
Лёлик написал, что у него может быть
Цитата: LyoliBolik от 12 августа 2018, 12:33
...пробел в конце выражения...
С пробелами в конце (а заодно и в начале) боремся обычным TRIM() - "обжимаем" с его помощью и строку, которую будем искать, и все строки, в которых будем искать
...TRIM(C2)...
...TRIM(A:A)...
Комбинация INDEX(<кого выводить>;MATCH(<где искать>;<кого искать>;0))  настоятельно рекомендуется вместо VLOOKUP - записывается не намного сложнее, а работает не хуже. Получаем
...INDEX(B:B;MATCH(TRIM(C2);LEFT(TRIM(A:A);LEN(TRIM(C2)));0);1)...(единичка в качестве номера колонки - которая последний параметр в INDEX - здесь не обязательна, но пусть будет)
Что случится, если нужная строка не будет найдена? Получим #N/A. Не аккуратненько как-то... Значит всю конструкцию оборачиваем в
IFERROR(<вся наша формула>;"не найден")
Запускаем, проверяем - тормозит... Ну, конено, тормозит - отыскать строчку в миллионе ячеек задача не из простых. Значит, вместо всей колонки A:A или B:B возьмём не такой большой диапазон - что-нибудь достаточно большое, чтобы точно захватить все нужные ячейки. Ну, две-три тысячи ячеек. Значит, вместо A:A будем писать A1:A3000. А зачем нам A1? Там же просто заголовок колонки. Измменяем на A2. Ну и чтобы адреса не сползали, когда будем формулу растягивать, меняем адреса на абсолютные - $A$2:$A$3000 и $B$2:$B$3000.
Теперь осталось только стукнуть в бубен и камлание закончено
=IFERROR(INDEX($B$2:$B$3000;MATCH(TRIM(C2);LEFT(TRIM($A$2:$A$3000);LEN(TRIM(C2)));0);1);"не найден")
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне