Как я могу получить слова из клетки в Excel - PullRequest
1 голос
/ 30 марта 2012

Я хотел получить слова из клетки. Например, ячейка A2 имеет значение «Меня зовут Джейсон». Я хотел получить слова: «имя» и «Джейсон». Я хочу исключить слова, содержащие не более 3 символов. Как мне сделать это с помощью формулы / функции в Excel?

Спасибо.

Ответы [ 2 ]

3 голосов
/ 30 марта 2012

Этот код должен быть запущен с листа, который содержит ваши данные для соединения. Я предположил, что вы работаете в столбце A

код

  1. Использует регулярное выражение для удаления всех буквенно-цифровых строк, меньших или равных 3 символам
  2. Сбрасывает исправленный набор строк на вновь созданный лист
  3. Разбивает эти строки с помощью Excel "Text to Columns"

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

{Обновление: добавлена ​​версия без цикла}

enter image description here

Original Code

    Sub Spliced()
        Dim ws1 As Worksheet
        Dim ws2 As Worksheet
        Dim rng1 As Range
        Dim objRegex
        Dim X
        Dim lngRow As Long

        Set ws1 = Sheets(1)
        Set rng1 = ws1.Range(ws1.[a1], ws1.Cells(Rows.Count, "A").End(xlUp))
        Set ws2 = Sheets.Add

        X = rng1.Value2
        Set objRegex = CreateObject("vbscript.regexp")
        With objRegex
            .Pattern = "\b\w{1,3}\b"
            .Global = True
        End With

        For lngRow = 1 To UBound(X)
            X(lngRow, 1) = Application.Trim(objRegex.Replace(X(lngRow, 1), vbNullString))
        Next

        ws2.Range(rng1.Address) = X
        ws2.Columns("A").TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
                                       TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Space:=True
    End Sub

Updated:No loops

Sub Spliced_NoLoops()
    Dim ws1 As Worksheet
    Dim ws2 As Worksheet
    Dim rng1 As Range
    Dim objRegex
    Dim strDelim As String
    Dim strOut As String

    strDelim = "||"
    Set ws1 = Sheets(1)
    Set rng1 = ws1.Range(ws1.[a1], ws1.Cells(Rows.Count, "A").End(xlUp))
    strOut = Join(Application.Transpose(rng1), strDelim)

    Set ws2 = Sheets.Add
    Set objRegex = CreateObject("vbscript.regexp")
    With objRegex
        .Pattern = "\b\w{1,3}\b"
        .Global = True
    End With

    ws2.Range(rng1.Address) = Application.Transpose(Split(Application.Trim(objRegex.Replace(strOut, vbNullString)), "||"))
    ws2.Columns("A").TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
                                   TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Space:=True
End Sub
2 голосов
/ 30 марта 2012

Вы не показываете, что вы пробовали, поэтому кодирование с нуля ...
Передайте диапазон от ячейки до разделения этой функции, которая примерно выполняет следующее:

  1. Создайте коллекцию , в которую мы поместим любые строки с len> 2
  2. разбить содержимое ячейки на массив. ( варианты могут содержать массивы )
  3. оценивает длину каждого сегмента и добавляет в коллекцию строки с длиной> 2
  4. возвращаемое значение функции - это коллекция с квалификационными строками

Пожалуйста, всегда сохраняйте свою работу перед запуском любого VBA. Ура и счастливого кодирования.

function splitter(byref rng as range) 
    dim return_value as collection
    set return_value = new collection

    dim split_result as variant 
    dim idx as integer 

    split_result = split(rng.value, " ") 

    for idx = lbound(split_result) to ubound(split_result) 
        if len(split_result(idx)) > 2 then  
            return_value.add(split_result(idx))
        end if
    next  
    splitter = return_value
end function

У меня нет ни Windows, ни Mac OS для тестирования, но синтаксис должен быть правильным, если не совсем так.

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