1

У меня есть файл en excel с расходами (сумма потраченных денег находится в одном столбце), а в следующем столбце у меня есть краткое описание, которое в основном состоит из нескольких слов. Я хочу "упростить" описание и назначить одно или два слова каждому описанию, которое будет в другом столбце рядом с ним. Проблема в том, что описание не является "унифицированным", например, у меня могут быть строки типа «бизнес-ланч», «бизнес-ужин в ресторане XXX», "кофе с журналистами" и т.д., И я хотел бы назначить это описание "еда" " этикетка. Есть также различные категории, которые следуют за подобным образцом.

Моя идея состояла в том, чтобы создать другую таблицу (на другом листе) - в одном столбце у меня есть ключевые слова, такие как "кофе", "обед", "ужин", а в столбце рядом с ними я помечаю, что я хочу назначить, что является "еда ". Я использовал функцию vlookup с приблизительным соответствием, но она возвращает неверные результаты. По какой-то причине порядок слов в списке, похоже, влияет на результаты, и даже если есть частичное совпадение (точное в одном слове строки), vlookup игнорирует его и возвращает что-то еще. Например, у меня есть "парковка в отеле ххх", а в таблице у меня есть пара "парковка" - "командировочные расходы", vlookup возвращает ярлык "еда".

Можете ли вы помочь мне решить эту проблему? (есть ли другой подход, который вы бы предложили?)

2 ответа2

6

Вам нужна функция FIND() и / или SEARCH() .  Использование:

FIND(find_text, within_text)
                                                                возвращает начальную позицию первой текстовой строки
                                                                во второй текстовой строке (начиная с позиции 1)

Таким образом, FIND("lunch", "lunch with customer") возвращает 1, а FIND("lunch", "business lunch") возвращает 10.  Если первая строка не найдена во второй, это возвращает # #VALUE! значение ошибки.  SEARCH() похож на FIND() за исключением того, что FIND() чувствителен к регистру, а SEARCH() - нет.  Так

FIND("lunch", "Lunch with customer") возвращает # #VALUE!
но
SEARCH("lunch", "Lunch with customer") возвращает 1

Я предполагаю, что вы захотите использовать SEARCH() , без учета регистра.

Вы захотите настроить массив следующим образом:

                                                        список ключевых слов

Вероятно, лучше сделать это на отдельном листе; давайте назовем это Key-Sheet .  Затем на листе данных: если описание в свободной форме находится в столбце A (начиная с ячейки A1), введите в ячейку B1:

=MATCH(MIN(IFERROR(SEARCH('Key-Sheet'!$A$1:$A$7,$A1),LEN($A1)+1)), SEARCH('Key-Sheet'!$A$1:$A$7,$A1))

и нажмите Ctrl+Shift+Enter, чтобы сделать его «формулой массива».  (Он будет отображаться в строке формул в фигурных скобках.)  Объяснение:

  • SEARCH('Key-Sheet'!$A$1:$A$7,$A1) - для каждого ключевого слова из столбца A таблицы ключей ("кофе", "обед", "ужин" и т.д.) Найдите его в описании в текущей строке, столбец A таблицы данных (например, «бизнес-ланч»).  Это создаст массив, содержащий { #VALUE!; 10 ; #VALUE!; …} (Семь элементов (в этом примере), по одному на ключевое слово; второй показывает результат для "ланча", который находится в 'Key-Sheet'!A2).
  • IFERROR(…,LEN($A1)+1) - замените # #VALUE! значения с 15 , которые, будучи LEN("business lunch")+1 , не могут быть допустимым возвращаемым значением из SEARCH() (и которое, фактически, выше любого возможного действительного возвращаемого значения из SEARCH()), но который является действительным числом.  Итак, теперь наш массив { 15 ; 10 ; 15 ; …}
  • MIN(…) - извлечь минимальное значение из массива: в данном примере 10 .  В общем, это будет (первый) успешный возврат из SEARCH() .
  • =MATCH(…, …) - обратите внимание, что второй параметр MATCH() такой же, как и первый пункт выше.  Итак, мы ищем 10 в массиве { #VALUE!; 10 ; #VALUE!; …}  Это возвращает позицию 10 , то есть 2, что соответствует тому факту, что A1 на листе данных («бизнес-ланч») содержит "обед", который находится во 2-й строке таблицы ключей.

Чтобы получить категорию расходов, достаточно просто внести указатель в столбец B таблицы.  Установите для ячейки C1 значение =OFFSET('Key-Sheet'!$B$1,B1-1,0) .  (Это не обязательно должна быть формула массива.)

                                данные о расходах

Обратите внимание (как указано выше), что, если описание расхода содержит несколько ключевых слов, будет найдено только первое.

Если вы не хотите беспокоиться о промежуточном значении, вы можете просто вычислить

=OFFSET('Key-Sheet'!$B$1,MATCH(MIN(IFERROR(SEARCH('Key-Sheet'!$A$1:$A$6,$A1),LEN($A1)+1)),SEARCH('Key-Sheet'!$A$1:$A$6,$A1))-1,0)

Это должно быть формулой массива.


PS функции FIND() и SEARCH() имеют необязательный третий аргумент:

SEARCH(find_text, within_text, [start_num])

Так

SEARCH("cigar", "Sometimes a cigar is just a cigar.") возвращает 13
но
SEARCH("cigar", "Sometimes a cigar is just a cigar.", 17) возвращается 29

Я не вижу смысла для вас использовать его.

0

Как сказал Тайсон, «близко / ок.» совпадение не предназначено для слов. Чтобы процитировать файл справки:

If range_lookup is either TRUE or is omitted, an exact or approximate match is returned. If an exact match is not found, the next largest value that is less than lookup_value is returned.

Это означает, что если вы ищете значение "7" в «1,2,5,8,12», возвращаемое значение будет "5", что является ближайшим значением к 7, которое не больше 7.

Нет простого способа сделать то, что вы хотите, без какого-либо обширного программирования и оценки как отдельных слов, так и грамматического анализа.

Что вы должны сделать, так это приучить себя вводить своего рода "код категории" при первоначальном вводе данных, а затем использовать столбец "памятка" для "дополнительных сведений", таких как «01-Еда и напитки», «Взял босса для ужин на день рождения ".

Если у вас уже есть большой объем данных, в которых это может быть трудно сделать, вы можете сделать несколько трюков, чтобы ускорить процесс (хотя вам все равно придется выполнять много ручной сортировки).

Начните с добавления столбца, который проверяет описание для слова "парк" и возвращает 0, если не найден, 1, если найден .. что-то вроде «= If(Поиск (" парк ", A1)> 1,1,0)» (а затем автоматически скопируйте формулу по всем строкам ваших данных). Затем вы можете отсортировать всю таблицу по этому столбцу, чтобы ваши данные были разделены на две группы: описания с "парком" в них и без них. Добавьте еще один столбец, скажем, с "едой" в них. Затем, между "еда" и "парк", вы можете сортировать (используя обе колонки) по четырем группам: единицы без слов, группы с "едой", группы с "парком" и группы с обоими.

Делая это несколько раз, вы можете быстро отсортировать группы, которые явно относятся к той или иной категории, пометить их кодом категории и с тех пор игнорировать их при выполнении дополнительного поиска по словам, пока все не будет классифицировано.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .