Страницы: 1
RSS
Как распарсить ячейки?
 
Добрый день, форумчане!
Очень нужна ваша помощь.

Изначально у нас есть 2 листа:
1) Исходные данные
2) Список возможных значений

В идеале макрос создает на листе Исходные дынные 7 дополнительных столбцов (Тип кампании, категория и т.д.)
Дальше он начинает искать значение в исходной ячейке из всех возможных Типов кампаний. Если находит, то передает соответствующее значение, если нет, то оставляет пробел. Дальше макрос ищет все возможные значения Категорий. И так для каждого из семи столбцов.
В итоге имеем лист То что хочется получить.  
Изменено: EliasRus - 11.11.2014 15:12:25
 
Так ли нужно столько пустых строк в сообщении? Исправьте, пожалуйста.
 
Пустые строки убрал, спасибо за бдительность :)

По поводу сабжа, есть идеи как реализовать такой алгоритм?  
 
Цитата
PrettyBoyElias пишет:
спасибо за бдительность
А вот ёрничать не нужно.
 
Цитата
PrettyBoyElias пишет:
Может ли макрос искать совпадение в исходной ячейке и если он находит соответсвие, то возвращать значение в нужную ячейку? В противном случае оставлять в нужной строке пробел?
Возможно ли такую проблему решить?
1) да
2) да
3) да
Цитата
PrettyBoyElias пишет:  Список возможных значений известен.
Вам легче.
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Цитата
А вот ёрничать не нужно.
Эм..а я не ерничал. Я писал текст сообщения в блокноте, а потом вставил сюда...видимо, поэтому текст поехал.

ikki, можете подсказать какие формулы использовать? Или данную задачку можно решить только с помощью макроса?
Изменено: EliasRus - 05.11.2014 12:06:58
 
Форумчане, может я недостаточно понятно расписал проблему, поэтому вы не можете подсказать в какую сторону копать.

Постараюсь проще расписать, есть, например, 3 ячейки (содержащие 3 компонента в разной последовательности, в реальности этих компонентов будет десяток и различных написаний этих текстов будет несколько десятков):
Текст_текст_2_текст_3
Текст_2_текст_текст_3
Текст_2_текст_3_текст

Как сделать макрос, чтобы применить его на имеющиеся 3 ячейки и получить в итоге таблицу из трех столбцов?
Название столбца 1
Текст
Текст
Текст

Название столбца 2                  
Текст_2                              
Текст_2                                  
Текст_2                                  

Название столбца 3
Текст_3
Текст_3
Текст_3
Изменено: EliasRus - 11.11.2014 14:30:25
 
теоретически сделать можно, но слишком много "скользких" моментов, которые могут свести на нет всю работу
 
На самом деле я никакой логики уловить не могу, при помощи которой можно было бы попытаться верно разбить данные по столбцам, как я могу понять например что n_n это город, или _блабла не относится к подтипам а явл. частью категории, таких моментов в вашем примере очень много, и непонятно вообще откуда начинать копать и куда, единственное что хорошо просматривается логически это цифры ID ))
 
Спасибо большое за ответ!

Извиняюсь за недостаточно понятную формулировку задачи.
Файл экселя обновил, прикладываю его сюда.

Изначально у нас есть 2 листа:
1) Исходные данные
2) Список возможных значений

В идеале макрос создает на листе Исходные дынные 7 дополнительных столбцов (Тип кампании, категория и т.д.)
Дальше он начинает искать значение в исходной ячейке из всех возможных Типов кампаний. Если находит, то передает соответствующее значение, если нет, то оставляет пробел. Дальше макрос ищет все возможные значения Категорий. И так для каждого из семи столбцов.
В итоге имеем лист То что хочется получить.
Надеюсь сейчас более понятно объяснил.
Изменено: EliasRus - 11.11.2014 15:32:00
 
можно и формулами, но с некоторыми мелкими неудобствами: иногда будет ложно определять Тип_кампании_3 вместо Тип_кампании_34, если он указан в конце строки.
F1 творит чудеса
 
Спасибо вам!
В том, то и дело, что порядок значений может быть абсолютно разным...точность в данной задаче критична.
К тому же ячеек будет на столько много, что отловить такие нестыковки будет нереально  :(
Изменено: EliasRus - 24.11.2014 11:03:32
 
ну вообще решение есть. преобразовать строки исходных данных в _строка_ (т.е. с обязательными знаками подчеркивания в начале и конце). Тогда в формуле (которая в файле) будет примерно так (для типа кампании):
Код
=ИНДЕКС('Список возможных значений'!$A$4:$A$103;МАКС(СТРОКА($A$4:$A$103)*НЕ(ЕОШ(НАЙТИ("_"&'Список возможных значений'!$A$4:$A$103&"_";"_"&$A13&"_"))))-3) 
F1 творит чудеса
 
Цитата
Максим Зеленский пишет:
ну вообще решение есть. преобразовать строки исходных данных в _строка_ (т.е. с обязательными знаками подчеркивания в начале и конце). Тогда в формуле (которая в файле) будет примерно так (для типа кампании):
Ячейки формируются роботами, к сожалению ничего в них перед выгрузкой изменить не получится.

Где-то нижнее подчеркивание может быть, а где-то нет. (Я просто не стал усложнять файл с примером). Но все возможные значения мы знаем.
Изменено: EliasRus - 11.11.2014 17:09:06
 
EliasRus, я формулу привел уже исправленную, которая подставляет эти подчеркивания. Можно ее еще усложнить, добавив проверку на начальные и конечные подчеркивания в исходной строке. Вы проверили?

Рекомендую дать диапазонам возможных значений имена, чтобы не путаться при правке формул.
F1 творит чудеса
 
в качестве рекомендации: если отсортировать каждый из столбцов на листе "Список возможных значений" по убыванию - будет проще.
хоть формулами, хоть макросом  
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Формула для поиска ID пока самая простая, если ID нужен в виде числа (для ячейки B2):

Код
=ЕСЛИОШИБКА(ЗНАЧЕН(ПСТР(A2;1;НАЙТИ("_";A2)-1));"")
если 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 пишет: в качестве рекомендации: если отсортировать каждый из столбцов на листе "Список возможных значений" по убыванию - будет проще.
хоть формулами, хоть макросом
Может пояснить в чем логика? В реальном кейсе возможными значения будут абсолютно различные текстовые значения, их будет нереально упорядочить.
Изменено: EliasRus - 24.11.2014 11:03:53
 
Цитата
EliasRus пишет: в чем логика?
при просмотре по справочнику (сверху вниз) находится сначала более "полное"  совпадение.
например, в строке "хххх-12345-ххххх" найдётся сначала собственно "12345", а потом уж "123" (конечно, если оба таких возможных значения есть в справочнике)
другой вариант - усложнять алгоритм (просматривать всегда справочник целиком и затем, среди найденных вариантов, выбирать самый полный)

пс. наконец-то заметил ошибку в своём предыдущем сообщении - упорядочивать справочники нужно по убыванию длины, конечно.
это подразумевалось, мне кажется, я так и писал, но сам вижу, что пропустил.  :(  теперь Ваше недоумение более понятно.
Изменено: ikki - 24.11.2014 11:04:02
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Цитата
EliasRus пишет: Вы имеете ввиду имена, такие как
Я имею ввиду динамические именованные диапазоны, которые изменяют свою длину в зависимости от количества значений. Тогда формула становится однотипной, и не считает лишнего.
F1 творит чудеса
 
Максим Зеленский,вот вот как это можно сделать?  :D   чтобы например превратить  н1+н2+н3   в  СРЗНАЧ( н1, н 2,.....н 3) , н=i
точнее ну чтобы к последовательности значений любой длины приписать формулу.. н-р: к (А1; А2; А3) в сумм(А1;А2;А3)
 
вы б пример приложили
Изменено: Сергей - 24.11.2014 11:51:34 (или создайте новую тему)
Лень двигатель прогресса, доказано!!!
 
Смотрю на эту формулу и понимаю, что я нифига не "формулист", и осознание этого увеличивается с осознанием того, что это еще маленькая формула.
макросом имхо было б проще. хотя я пока еще плохо знаком с синтаксисом и вобще языком, но алгоритм понятен.

вдогонку вопрос. это реальные данные? спрашиваю потому, что имхо с другими данными могут быть какие-либо незамеченные подводные камни.
Изменено: VideoAlex - 24.11.2014 12:11:35
 
Цитата
svetikzzkb пишет: ну чтобы к последовательности значений любой длины приписать формулу
это в эту тему вопрос-то? не совсем понял его. Если есть именованный диапазон, например, динамический, и называется он, например, "Подтип_5", то можно и СУММ(Подтип_5), и СРЗНАЧ(Подтип_5), и СЧЁТЗ(Подтип_5), и так далее
Цитата
EliasRus пишет: Вы имеете ввиду имена
например, создаем именованный диапазон с названием "Город", с областью видимости "Книга" с вот такой формулой вместо ссылки на ячейки:
Код
=СМЕЩ('Список возможных значений'!$C$3;1;;СЧЁТЗ('Список возможных значений'!$C$4:$C$10000);1) 
'Список возможных значений'!$C$4:$C$10000 - это заведомо больший диапазон, в котором будет находиться список городов.
Дальше формула, вытаскивающая название города из строки, будет выглядеть вот так (формула массива):
Код
=ЕСЛИОШИБКА(ИНДЕКС(Город;МАКС(СТРОКА(Город)*НЕ(ЕОШ(ПОИСК("_"&Город&"_";"_"&$A13&"_"))))-3);"")
Преимущество в том, что можно не париться, правильно ли указаны ссылки на список городов в формуле.
Если создать такие именованные диапазоны для каждого из списков допустимых значений параметров, то потом для копирования формулы можно менять название диапазона, и всё.
Сейчас приходится в каждой формуле указывать три раза адрес диапазона, и если его размер изменится - изменять все эти формулы опять.
F1 творит чудеса
Страницы: 1
Читают тему
Наверх