В моей таблице есть столбец, который часто содержит строку, которую я хочу поместить в другой столбец. Эта строка может встречаться несколько раз, и я хочу поместить ВСЕ ее экземпляры в другой столбец. Столбец разделен, и я хотел бы взять соответствующую строку и до разделителя.
Пример:
Possessions
Fruit: apple, Car: Ford, Fruit: banana,
Car: Saturn,
Fruit: orange,
Я хотел бы, чтобы следующий столбец содержал:
Fruit
Fruit: apple, Fruit: banana,
Fruit: orange,
Достаточно просто найти первый экземпляр строки (новые строки для удобства чтения):
MID(A2,
FIND( *first instance of Fruit:* ),
FIND( *first comma after Fruit:* ) - FIND( *first instance of Fruit:* )
)
Однако я мог встречаться со строкой любое количество раз и хочу поймать их все.
Кроме того, столбец уже является вычисляемым полем (ссылка на другой лист), поэтому я не могу использовать текст для столбцов для разделения на разделитель.
Любые идеи о том, как вернуть все экземпляры строки? Я бы предпочел избегать сценария VBA, если это возможно, и использовать функции рабочего листа, но если это невозможно с функциями, я открыт для VBA.
Ответы:
Типовое решение VBA с регулярными выражениями
Этот метод должен покрывать ваши потребности. Другие пользователи также могут использовать его для извлечения нескольких строк из заданной строки с помощью регулярных выражений.
Вернитесь в Excel и используйте эту формулу в ячейке, где вы хотите выводить
Объяснение формулы
=REGEXTRACT()
ваша новая формулаA1
это ячейка, в которой находятся ваши входные данныеFruit: .*?,
является регулярным выражением, чтобы найти все вхожденияfruit
и совпадает до следующей запятой.Подсказка: Смотри сзади и смотри вперед выражения не поддерживаются в регулярном выражении VB. Так что нетрудно исключить запятую через RegEx. Но это возможно через обычные строковые операции VBA.
источник
=REGEXTRACT()
, Причина, по которой я не наткнулся на это, заключалась в том, что я использую локализованную версию Excel, и они также переводят эти зарезервированные слова. Очень надоедливыйЭто нелепо неуклюже, но, похоже, работает. Я бы порекомендовал решение VBA, если честно.
Это формула массива, и вам нужно выбрать как минимум столько ячеек, сколько есть экземпляров «Fruit». Поэтому, если в одном столбце четыре плода, выделите четыре ячейки по ширине, введите эту формулу и подтвердите, нажав Ctrl + Shift + Enter. Если вы выберете дополнительные ячейки, то в конце начнет возвращаться ошибка, поэтому теоретически вы можете выбрать максимальное количество ячеек, которое вам понадобится для любого столбца, и выполнить автоматическое заполнение.
Редактировать: Я понял, что если есть только один фрукт, он вернет этот фрукт в каждой клетке. Я не думаю, что есть способ обойти это с этой формулой.
Он также предполагает, что у вас не будет названия фруктов длиннее 1000 символов, и что «~~~~~» не будет отображаться в вашем тексте как обычно.
Объяснение: где n - это число плодов в ячейке, формула использует FIND / SUBSTITUTE для создания массива из n элементов, в котором первое вхождение «Fruit» заменяется на «~~~~~», а затем второе. и т. д. Затем он использует MID / FIND для извлечения текста. Поскольку в Excel нет формулы «найди вхождение строки x», мы делаем сумасшедшие вещи, подобные этой. IFERROR существует для последнего Fruit, так как я предполагал, что после него может не быть запятой.
источник