2012-03-30 2 views
1

Я хотел получить слова из ячейки. Например, ячейка A2 имеет значение «Мое имя - jayson». Я хотел получить слова: «name» & «jayson». Я хочу исключить слова с менее чем 3 символами. Как это сделать, используя формулу/функцию в excel?Как получить слова из ячейки в excel

Спасибо.

+1

Что вы хотите, чтобы результаты выглядели, например, хотите ли вы «имя jayson» в одной ячейке? –

+0

по одному в каждой ячейке, например, результат может быть во втором листе: A1: имя, A2: jayson. Я буду использовать значение позже. :) –

ответ

3

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

Код

  1. использует регулярное выражение, чтобы удалить все алфавитно-цифровые строки меньше или равно 3 символов
  2. Сплин пересмотренного набора строк для вновь созданных лист
  3. Разделяет эти строки, используя в Excel «текст по столбцам»

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

{Обновление: добавлена ​​нет версии петли}

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 
+1

+1 Ха-ха! Использование регулярного выражения! Просто любите это !!!! –

+0

«.TextToColumns» в вашем коде дал мне представление. Как насчет того, чтобы сначала использовать '.TextToColumns', а затем использовать автофильтр для удаления слов, которые составляют менее 4 символов? Будет экономить время, так как нам тогда не придется зацикливаться? Что вы думаете об этом? –

+0

@SiddharthRout, потому что вам придется автофильтировать, а затем очистить все использованные столбцы, которые могут быть значительными в зависимости от длины тестовых строк. Я думаю, что вариантный массив будет быстрее - хотя, возможно, расщепляется волосок с вероятным размером записи – brettdj

2

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

  1. Создать a collection, в который будут помещены любые строки с len> 2
  2. Разделите содержимое ячейки на массив. (variants can contain arrays)
  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 под рукой, чтобы проверить, но синтаксис должен быть правильным, если не почти так.

+0

это дает мне '#NAME?'. Я использовал эту функцию как: '= splitter (C5: C6)' –

+0

ah, это пользовательская функция (UDF). см. «Доступ к вашим пользовательским функциям» здесь (http://www.fontstuff.com/vba/vbatut01.htm) И, пожалуйста, примите мои извинения, я должен бежать, но завтра вернется.Удачи вам в вашем проекте. – bernie

Смежные вопросы