Изначально у нас есть 2 листа: 1) Исходные данные 2) Список возможных значений
В идеале макрос создает на листе Исходные дынные 7 дополнительных столбцов (Тип кампании, категория и т.д.) Дальше он начинает искать значение в исходной ячейке из всех возможных Типов кампаний. Если находит, то передает соответствующее значение, если нет, то оставляет пробел. Дальше макрос ищет все возможные значения Категорий. И так для каждого из семи столбцов. В итоге имеем лист То что хочется получить.
PrettyBoyElias пишет: Может ли макрос искать совпадение в исходной ячейке и если он находит соответсвие, то возвращать значение в нужную ячейку? В противном случае оставлять в нужной строке пробел? Возможно ли такую проблему решить?
1) да 2) да 3) да
Цитата
PrettyBoyElias пишет: Список возможных значений известен.
Вам легче.
фрилансер Excel, VBA - контакты в профиле "Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
Форумчане, может я недостаточно понятно расписал проблему, поэтому вы не можете подсказать в какую сторону копать.
Постараюсь проще расписать, есть, например, 3 ячейки (содержащие 3 компонента в разной последовательности, в реальности этих компонентов будет десяток и различных написаний этих текстов будет несколько десятков): Текст_текст_2_текст_3 Текст_2_текст_текст_3 Текст_2_текст_3_текст
Как сделать макрос, чтобы применить его на имеющиеся 3 ячейки и получить в итоге таблицу из трех столбцов? Название столбца 1 Текст Текст Текст
На самом деле я никакой логики уловить не могу, при помощи которой можно было бы попытаться верно разбить данные по столбцам, как я могу понять например что n_n это город, или _блабла не относится к подтипам а явл. частью категории, таких моментов в вашем примере очень много, и непонятно вообще откуда начинать копать и куда, единственное что хорошо просматривается логически это цифры ID ))
Извиняюсь за недостаточно понятную формулировку задачи. Файл экселя обновил, прикладываю его сюда.
Изначально у нас есть 2 листа: 1) Исходные данные 2) Список возможных значений
В идеале макрос создает на листе Исходные дынные 7 дополнительных столбцов (Тип кампании, категория и т.д.) Дальше он начинает искать значение в исходной ячейке из всех возможных Типов кампаний. Если находит, то передает соответствующее значение, если нет, то оставляет пробел. Дальше макрос ищет все возможные значения Категорий. И так для каждого из семи столбцов. В итоге имеем лист То что хочется получить. Надеюсь сейчас более понятно объяснил.
можно и формулами, но с некоторыми мелкими неудобствами: иногда будет ложно определять Тип_кампании_3 вместо Тип_кампании_34, если он указан в конце строки.
Спасибо вам! В том, то и дело, что порядок значений может быть абсолютно разным...точность в данной задаче критична. К тому же ячеек будет на столько много, что отловить такие нестыковки будет нереально
ну вообще решение есть. преобразовать строки исходных данных в _строка_ (т.е. с обязательными знаками подчеркивания в начале и конце). Тогда в формуле (которая в файле) будет примерно так (для типа кампании):
Код
=ИНДЕКС('Список возможных значений'!$A$4:$A$103;МАКС(СТРОКА($A$4:$A$103)*НЕ(ЕОШ(НАЙТИ("_"&'Список возможных значений'!$A$4:$A$103&"_";"_"&$A13&"_"))))-3)
Максим Зеленский пишет: ну вообще решение есть. преобразовать строки исходных данных в _строка_ (т.е. с обязательными знаками подчеркивания в начале и конце). Тогда в формуле (которая в файле) будет примерно так (для типа кампании):
Ячейки формируются роботами, к сожалению ничего в них перед выгрузкой изменить не получится.
Где-то нижнее подчеркивание может быть, а где-то нет. (Я просто не стал усложнять файл с примером). Но все возможные значения мы знаем.
EliasRus, я формулу привел уже исправленную, которая подставляет эти подчеркивания. Можно ее еще усложнить, добавив проверку на начальные и конечные подчеркивания в исходной строке. Вы проверили?
Рекомендую дать диапазонам возможных значений имена, чтобы не путаться при правке формул.
в качестве рекомендации: если отсортировать каждый из столбцов на листе "Список возможных значений" по убыванию - будет проще. хоть формулами, хоть макросом
фрилансер Excel, VBA - контакты в профиле "Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
если ID нужен в виде текста (для отображения цифр вида 0001452):
Код
=ЕСЛИОШИБКА(ПСТР(A2;1;НАЙТИ("_";A2)-1);"")
ограничения: 1) ID всегда в начале искомой строки 2) после ID всегда есть символ подчеркивания (_) (конец ID в формуле определяется первым найденным символом подчеркивания в искомой строке) если список ограничений удовлетворяет вашим условиям, то норм., в противном случае нужно искать другие пути.
Максим Зеленский пишет: EliasRus , я формулу привел уже исправленную, которая подставляет эти подчеркивания. Можно ее еще усложнить, добавив проверку на начальные и конечные подчеркивания в исходной строке. Вы проверили?
Спасибо огромное. Работает!
У нас постоянно будет пополняться список возможных значений, поэтому возникла пара пожеланий, может вы сможете помочь: 1) Можно ли расширить диапазон "возможных значений". Ну,например, в формуле для "типа кампаний" использовать диапазон не $A$4:$A$103, а, например, $A$4:$A$2000. Это будет удобно, чтобы при добавлении нового возможного значения не переделывать формулы. Если в текущей реализации расширить диапазон, то вместо пустых ячеек будут появляться нули. (файлик приложил) 2) Можно ли автоматизировать этот процесс? Чтобы по одному клику создались столбцы с формулами?
Цитата
Максим Зеленский пишет: Рекомендую дать диапазонам возможных значений имена, чтобы не путаться при правке формул.
Вы имеете ввиду имена, такие как (Тип кампании, категория, под тип 1 и т.д.)? Давайте использовать те диапазоны, которые есть, наличие и количество этих диапазонов может меняться.
Цитата
GeorgeDark пишет: Формула для поиска ID пока самая простая, если ID нужен в виде числа (для ячейки B2):
Идеально, спасибо! Первая формула подходит, а вторая нет (она возвращает в том числе текст, если в ячейке не стоит число).
Цитата
ikki пишет: в качестве рекомендации: если отсортировать каждый из столбцов на листе "Список возможных значений" по убыванию - будет проще. хоть формулами, хоть макросом
Может пояснить в чем логика? В реальном кейсе возможными значения будут абсолютно различные текстовые значения, их будет нереально упорядочить.
при просмотре по справочнику (сверху вниз) находится сначала более "полное" совпадение. например, в строке "хххх-12345-ххххх" найдётся сначала собственно "12345", а потом уж "123" (конечно, если оба таких возможных значения есть в справочнике) другой вариант - усложнять алгоритм (просматривать всегда справочник целиком и затем, среди найденных вариантов, выбирать самый полный)
пс. наконец-то заметил ошибку в своём предыдущем сообщении - упорядочивать справочники нужно по убыванию длины, конечно. это подразумевалось, мне кажется, я так и писал, но сам вижу, что пропустил. теперь Ваше недоумение более понятно.
Я имею ввиду динамические именованные диапазоны, которые изменяют свою длину в зависимости от количества значений. Тогда формула становится однотипной, и не считает лишнего.
Максим Зеленский,вот вот как это можно сделать? чтобы например превратить н1+н2+н3 в СРЗНАЧ( н1, н 2,.....н 3) , н=i точнее ну чтобы к последовательности значений любой длины приписать формулу.. н-р: к (А1; А2; А3) в сумм(А1;А2;А3)
Смотрю на эту формулу и понимаю, что я нифига не "формулист", и осознание этого увеличивается с осознанием того, что это еще маленькая формула. макросом имхо было б проще. хотя я пока еще плохо знаком с синтаксисом и вобще языком, но алгоритм понятен.
вдогонку вопрос. это реальные данные? спрашиваю потому, что имхо с другими данными могут быть какие-либо незамеченные подводные камни.
svetikzzkb пишет: ну чтобы к последовательности значений любой длины приписать формулу
это в эту тему вопрос-то? не совсем понял его. Если есть именованный диапазон, например, динамический, и называется он, например, "Подтип_5", то можно и СУММ(Подтип_5), и СРЗНАЧ(Подтип_5), и СЧЁТЗ(Подтип_5), и так далее
например, создаем именованный диапазон с названием "Город", с областью видимости "Книга" с вот такой формулой вместо ссылки на ячейки:
Код
=СМЕЩ('Список возможных значений'!$C$3;1;;СЧЁТЗ('Список возможных значений'!$C$4:$C$10000);1)
'Список возможных значений'!$C$4:$C$10000 - это заведомо больший диапазон, в котором будет находиться список городов. Дальше формула, вытаскивающая название города из строки, будет выглядеть вот так (формула массива):
Преимущество в том, что можно не париться, правильно ли указаны ссылки на список городов в формуле. Если создать такие именованные диапазоны для каждого из списков допустимых значений параметров, то потом для копирования формулы можно менять название диапазона, и всё. Сейчас приходится в каждой формуле указывать три раза адрес диапазона, и если его размер изменится - изменять все эти формулы опять.