Как разобрать строку из ячейки несколько раз в excel?

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

пример:

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.

18
задан Centimane
27.03.2023 23:50 Количество просмотров материала 2556
Распечатать страницу

2 ответа

общее решение VBA с регулярными выражениями

этот метод должен покрыть ваши потребности. Он также может быть использован другими пользователями для извлечения нескольких строк из данной строки с помощью регулярных выражений

enter image description here

  1. откройте редактор VBA (ALT+F11)
  2. вставить новый модуль (!) и вставьте в него приведенный ниже код
  3. Go вернитесь в Excel и используйте эту формулу в ячейке, где вы хотите, чтобы ваш вывод

    =REGEXTRACT(A1, "Fruit: .*?,")
    

Формула объяснения

  • =REGEXTRACT() Ваша новая изготовленная на заказ формула.
  • A1 - ячейка, в которую помещаются входные данные
  • Fruit: .*?, - регулярное выражение для нахождения всех вхождений fruit и соответствует до следующей запятой.
Function REGEXTRACT(objCell As Range, strPattern As String)

    Dim objMatches As Object
    Dim RegEx As Object
    Set RegEx = CreateObject("VBScript.RegExp")

    RegEx.IgnoreCase = True
    RegEx.Global = True
    RegEx.Pattern = strPattern

    Set objMatches = RegEx.Execute(objCell.Value)

    If objMatches.Count <> 0 Then
        For Each objMatch In objMatches
            REGEXTRACT= REGEXTRACT+ objMatch.Value
        Next objMatch
    Else: REGEXTRACT= ""
    End If

End Function

подсказка: осмотр сзади и Look-Ahead выражения не поддерживаются механизмом регулярных выражений VB. Поэтому нетривиально исключить запятую через регулярное выражение. Но это возможно с помощью обычных строковых операций VBA.

2
отвечен nixda 2023-03-29 07:38

Это смешно неуклюже, но, кажется, работает. Честно говоря, я бы рекомендовал решение VBA.

=TRANSPOSE(LEFT(MID(A1,FIND("~~~~~~",SUBSTITUTE(A1,"Fruit:","~~~~~~",ROW(INDIRECT("1:"&(LEN(A1)-LEN(SUBSTITUTE(A1,"Fruit","")))/LEN("Fruit"))))),IFERROR(FIND(",",A1,FIND("~~~~~~",SUBSTITUTE(A1,"Fruit:","~~~~~~",ROW(INDIRECT("1:"&(LEN(A1)-LEN(SUBSTITUTE(A1,"Fruit","")))/LEN("Fruit"))))))-1,LEN(A1)-FIND("~~~~~~",SUBSTITUTE(A1,"Fruit:","~~~~~~",ROW(INDIRECT("1:"&(LEN(A1)-LEN(SUBSTITUTE(A1,"Fruit","")))/LEN("Fruit")))))+1)),IFERROR(FIND(",",MID(A1,FIND("~~~~~~",SUBSTITUTE(A1,"Fruit:","~~~~~~",ROW(INDIRECT("1:"&(LEN(A1)-LEN(SUBSTITUTE(A1,"Fruit","")))/LEN("Fruit"))))),IFERROR(FIND(",",A1,FIND("~~~~~~",SUBSTITUTE(A1,"Fruit:","~~~~~~",ROW(INDIRECT("1:"&(LEN(A1)-LEN(SUBSTITUTE(A1,"Fruit","")))/LEN("Fruit"))))))-1,LEN(A1)-FIND("~~~~~~",SUBSTITUTE(A1,"Fruit:","~~~~~~",ROW(INDIRECT("1:"&(LEN(A1)-LEN(SUBSTITUTE(A1,"Fruit","")))/LEN("Fruit")))))+1))),1000)-1))

Это формула массива, и вы должны выбрать по крайней мере столько же клеток, сколько экземпляров "фрукты."Поэтому, если у вас есть четыре фрукта в одном столбце, выберите четыре ячейки по горизонтали, введите эту формулу и подтвердите с ctrl + shift+enter. Если вы выберете дополнительные ячейки, он начнет возвращать ошибку в конце, чтобы вы могли теоретически выбрать максимальное количество ячеек, которые вы понадобится для любого столбца и автозаполнения вниз.

Edit: я понял, что если есть только один плод, он вернет этот плод в каждую ячейку. Я не думаю, что есть способ обойти это с этой формулой.

Он также предполагает, что у вас не будет имени плода длиннее 1000 символов, и что "~ ~ ~ ~ " не будет отображаться в вашем тексте обычно.

пояснение: где n-количество фруктов в ячейке, формула использует FIND / SUBSTITUTE для построения n-элемента массив, где первое вхождение "Fruit" заменяется на"~~~~", затем второе... п. Затем он использует MID/FIND для извлечения текста. Поскольку Excel не имеет формулы" найти n-е вхождение строки x", мы оказываемся делать сумасшедшие вещи, как это. IFERROR там для последнего плода, так как я предполагал, что после него может не быть запятой.

1
отвечен Kyle 2023-03-29 09:55

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх