Извлечь подстроку списка на основе другого списка - PullRequest
1 голос
/ 25 марта 2012

Использование двух списков, один из которых состоит из имен с добавленной информацией в различных формах (см. Ниже, например, список 1) и один, состоящий из четко отформатированных имен, то есть без добавленной информации (список 2)

List 1
--------
Netto City      | Value
Imerco City     | value 
Bilka Suburb    | value
Bauhaus, City   | Value
City FDB Superb | Value

List 2
------
Netto
Imerco
Bilka
Bauhaus
FDB Super

Я пытаюсь создать фильтр, чтобы независимо от того, как выглядел первый столбец моих исходных данных (список 1), я мог суммировать значения на основе (список 2).

Что-то похожее на это: Excel - извлечение данных на основе другого списка

Я пытался использовать vlookup, но он не ищет подстроки, затем я попытался использовать

=IF(COUNTIF(A$4:A$9;"*"&D5&"*")>0;
    INDIRECT(ADDRESS(MATCH("*"&D5&"*";A$4:A$9;0);4));"not found")

Но это, похоже, делает обратное, поиск в списке 1 для одного значения ячейки из списка 2. Я не могу полностью разобраться, если это работает так же хорошо, я все равно не смог заставить его работать, поэтому я искал другой путь. Список поиска 2, для каждого элемента из списка 1.

Но, в конечном итоге, я пытаюсь создать список из исходных данных, который я могу использовать для классификации каждого элемента в списке 1, на основе списка 3

List 3
Bilka     | Cat1
Imerco    | Cat2
FDB Super | Cat1
etc. 

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

Я использую следующую сумму

=SUMIFS($F$3:$F$703;$B$3:$B$703;
    "="&$H4;$D$3:$D$703;">="&I$2;$D$3:$D$703;"<="&I$3)

для суммирования всех сумм, принадлежащих определенному элементу в Списке 3 (где я вручную создал Список 3), между датами.

Цель этого состоит в том, чтобы создать лист, который содержит все расходы на конкретный магазин или категорию по своему выбору, например, перечисленные в списке 1, в основном это продовольственные магазины.

Правка - Уточнение.

То, что я предлагаю сделать, - это многоступенчатый процесс. Этап 1: Вставить исходные данные (сделано)

Стадия 2: Фильтрация исходных данных по уникальным значениям (сделано)

Стадия 3: Создать список утвержденных имен для каждого элемента в исходных данных - То есть, пригород Билка в Билку, Нетто-Сити в Нетто Здесь 'Netto' и 'Bilka' являются утвержденными именами, которые создаются вручную для обеспечения возможности группировки на этапе 4. Я собираюсь автоматизировать этот этап.

Этап 4: Сгруппируйте каждый элемент из списка Стадии 3, основываясь на имени и интервале дат, еженедельно ежемесячно, независимо от того, что (сделано), если бы я только мог заставить Стадию 3 работать, так как она работает с моими вручную исправленными данными.

Этап 5: Выберите соответствующую категорию и введите для каждого элемента в результирующем списке на этапе 3: Билка, это продовольственное место, поэтому она получит категорию «еда», так же как и нетто, где Баухауз получит категорию «Строительные материалы», каждый из этих предметов получит тип «расход», где, скажем, заработная плата получит тип «доход» (сделано)

решение для этапа 5 - это просто vlookup, основанное на категории в таблице, в которой перечислены все категории с типом, так что это достаточно просто.

Окончательное решение: требует, чтобы список для перебора был в столбце G, и выводит список утвержденных имен в столбце H. Есть ошибка, если не удается узнать разницу между такими элементами, как «Супер» и "СУ", я не знаю, как это исправить. Если у кого-то есть какие-либо предложения по этому поводу, я весь слух.

Sub LoopCells()
Sheets("RawData").Select
Sheets("RawData").Activate
LRApproved = Cells(Rows.Count, "H").End(xlUp).Row
LRsource = Cells(Rows.Count, "G").End(xlUp).Row
For Each approvedcell In Worksheets("RawData").Range("H2:H" & LRApproved).Cells     'Approved stores entered by users
For Each sourcecell In Worksheets("RawData").Range("G2:G" & LRsource).Cells 'items found from bank statement export
    If InStr(UCase(sourcecell.Value), UCase(approvedcell.Value)) <> 0 Then
                sourcecell.Offset(0, 2).Value = approvedcell.Value
    End If
   Next sourcecell
Next approvedcell
End Sub

Спасибо за помощь. Изменить: Добавлено окончательное решение и тег VBA.

Ответы [ 3 ]

2 голосов
/ 26 марта 2012

Это работает для меня:

=SUM(B$3:B$7*NOT(ISERROR(SEARCH(A11,A$3:A$7))))

Это предполагает, что ваш пример списка 1 находится в диапазоне A3: B7, а ваш список 2 в A11: B15.Вставьте приведенную выше формулу в ячейку B11 и нажмите Ctrl Shift - Введите , чтобы ввести ее в качестве формулы массива.Затем вы можете перетащить его до B15.

Объяснение: SEARCH например, для "Netto" в ячейках Списка 1. Для ячеек, которые не содержат эту строку, SEARCH возвращает ошибку.Поэтому мы ищем ячейки, которые не возвращают ошибку.Теперь у нас есть массив логических значений, указывающих на это.Умножьте это поэлементно на массив значений.В этом умножении TRUE интерпретируется как 1, а FALSE как ноль, поэтому вы отбираете значения, которые не соответствуют «Нетто».

Вот скриншот моей установки:

enter image description here

1 голос
/ 25 марта 2012

Возможно, я неправильно понял, но вы не можете использовать SUMIF?

=SUMIF(A$4:A$9;"*"&D5&"*";B$4:B$9)

0 голосов
/ 19 декабря 2017

вместо использования VBA вы можете извлечь это с помощью простой маленькой формулы. = Индекс (List2! A2: A10, Match (1, Countif (List1A2, "" & List2! A2: A10 & ""), 0)) (Нажмите Ctrl + Shift + Enter). Предположим, вы хотите извлечь список 2 в список 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...