2016-04-20 3 views
0

Я хотел бы создать функцию в VBA для извлечения первых слов степени п из строки и выглядеть такExcel Извлечения степени п первых слов из строки

ExtractWords (affected_text, разделитель, number_of_words_to_extract)

Я попробовал решение, но он извлекает только первые два слова.

Function FirstWords(myStr As Variant, delimiter,words_to_extract) As Variant 
    FirstWords = Left(myStr, InStr(InStr(1, myStr, delimiter) + 1, myStr, delimiter, vbTextCompare) - 1) 
End Function 

Любые идеи? Thanks

ответ

3

Использование Split() функция. Он возвращает массив String, разделенный с использованием разделителя и ограничения слов, которые вы указываете.

Dim Result As Variant 
Result = Split("Alice,Bob,Chuck,Dave", ",") 'Result: {"Alice,"Bob","Chuck","Dave"} 
Result = Split("Alice,Bob,Chuck,Dave", ",", 2) 'Result: {"Alice,"Bob"} 
+0

Не могли бы вы дать мне часть кода, чтобы понять? Я не настолько опытен. – redviper2100

+0

Добавлено в ответ. – Taosique

0

@ ответ Taosique, используя Split отлично, но если вы хотите, результат возвращается в виде строки вы можете сделать следующее:

Function FirstWords(myStr As String, delimiter As String, words_to_extract As Long) As Variant 
    Dim i As Long, k As Long 
    For i = 1 To Len(myStr) 
     If Mid(myStr, i, 1) = delimiter Then 
      k = k + 1 
      If k = words_to_extract Then 
       FirstWords = Mid(myStr, 1, i) 
       Exit Function 
      End If 
     End If 
    Next I 

    'if you get to here -- trouble 
    'unless the delimiter count is words_to_extract - 1 
    If k = words_to_extract - 1 Then 
     FirstWords = myStr 
    Else 
     FirstWords = CVErr(xlErrValue) 
    End If End Function 

Sub test() 
    Debug.Print FirstWords("This is a test. I hope it works", " ", 4) 
    Debug.Print FirstWords("This is a test. I hope it works", " ", 10) 
End Sub 

Когда test запускается он первым отображается строка «Это тест." затем печатает условие ошибки.

Значительный эффект, аналогичный приведенному выше, может быть достигнут путем первого разделения строки с использованием Split, а затем воссоединиться с ней, используя Join. Тонкая разница - это поведение, если есть меньше, чем words_to_extract слов. Подход Split, затем Join, вернет всю строку. Вышеприведенный код рассматривает это как условие ошибки и, если он используется в качестве функции рабочего листа UDF, отображает #VALUE! в любой ячейке, которая его содержит.

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