Поиск положения текста в абзаце с помощью VBA

#excel #vba #user-defined-functions #xlsx #xlsm

#excel #vba #определяемые пользователем функции #xlsx #xlsm

Вопрос:

У меня есть заданный текст и абзац, точный текст присутствует в абзаце. Рассматриваем первое слово с индексом 0, второе с индексом 1 и так далее.. Я хочу найти начальный и конечный индексы текста в абзаце.

Я написал код для определения количества присутствующих слов, индекса начала и конца абзаца, но полностью застрял в этом коде

это код для нахождения начального индекса абзаца

 =B1 LEN(TRIM(A1))-LEN(SUBSTITUTE(TRIM(A1)," ","")) 1
  

Хотя это бесполезно подвергать сомнению..

Рассмотрим пример с 4 столбцами

1) Абзац

2) точный ответ, присутствующий в абзаце

3) Ответьте на начальный индекс в абзаце

4) Ответьте на конечный индекс в абзаце

 Paragraph                  |  Answer             | StartIndex| EndIndex 

Hello Lorem ipsum Hello    |amet, consectetur    |     6     |   20
dolor sit amet, consectetur|adipisicing elit,    |           | 
adipisicing elit, sed do   |sed do eiusmod tempor|           |
eiusmod tempor incididunt  |incididunt ut labore |
ut labore et dolore magna  |et dolore magna      |
aliqua. Ut enim ad minim   |aliqua               |
veniam, quis nostrud       |
exercitation ullamco labor | 
nisi ut aliquip ex Hello   |
ea commodo consequat.   
  

Для начального и конечного индекса просто посчитайте слова в абзаце от 0,1,2,…
Пожалуйста, помогите мне с приведенным выше кодом VBA, если это можно решить.

Комментарии:

1. Функция VBA InStr() возвращает начальный индекс. Например, InStr(paragraph, answer) возвращает число типа 15 , которое будет начальным индексом. Тогда конечным индексом будет просто это полученное вами число Len(answer) .

2. извините, но я пытался и не смог найти ни одной такой функции

3. Вы уверены, что выполняете поиск в редакторе VB, а не на листе Excel? Это очень простая встроенная функция, было бы очень странно, если бы у вас ее не было.

4. Он работает, но он работает по символам, а не на основе word, поскольку я хочу, чтобы индекс основывался на word, а не на character

5. Если вы не поделитесь с нами тем, что пытаетесь сделать, будет сложно помочь вам больше. Пожалуйста, дополните свои вопросы подробностями о том, что вы пытаетесь сделать, чтобы кто-нибудь мог вам помочь. Пожалуйста, обратите внимание, что функция работает со словами, наверняка.

Ответ №1:

Это должно быть то, что вы хотите:

 Sub TestIt()
    Const WHOLE_TEXT As String = "Hello Lorem ipsum Hello dolor sit amet, consecteturadipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim  veniam, quis nostrud exercitation ullamco labor nisi ut aliquip ex Hello ea commodo consequat."
    Const SEARCH_TEXT As String = "amet, consecteturadipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua"

    Dim startIndex As Long
    Dim endIndex As Long
    If FindText(WHOLE_TEXT, SEARCH_TEXT, startIndex, endIndex) Then
        Debug.Print "StartIndex: " amp; startIndex amp; vbNewLine amp;  "EndIndex: " amp; endIndex
    Else
        Debug.Print "Not found."
    End If
End Sub

'Returns True if searchText has been found.
'The *index parameters are ByRef because they will contain the results.
Function FindText(ByVal wholeText As String, ByVal searchText As String, ByRef outStartIndex As Long, ByRef outEndIndex As Long) As Boolean
    Dim substringPos As Long
    substringPos = InStr(wholeText, searchText)

    If substringPos = 0 Then Exit Function

    outStartIndex = UBound(Split(Trim(Left(wholeText, substringPos - 1)), " "))   1

    outEndIndex = UBound(Split(Trim(searchText), " "))   1   outStartIndex

    FindText = True
End Function
  

Результат:

  • Начальный индекс: 6
  • Конечный индекс: 20