Получение номера индекса первого слова строки, полученного из абзаца в VBA - PullRequest
0 голосов
/ 28 марта 2019

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

Я могу получить длину слова в тексте для верхней ячейкизначение используется ActiveCell.Offset(-1, 0).Activate, но оно не работает для меня.

Public Function StartIndex(ByVal strText As String) As Long

    Application.Volatile
    Length = UBound(Split(strText, " ")) + 1
    StartIndex = ActiveCell.Offset(-1, 0).Activate + Length

End Function

посмотрите ниже, подумайте, у меня по умолчанию col1 и хотите startIndex через VBA;

      Col1                           |   startIndex        
VBA Index Printer Friendly version   |         1            
 Adobe Acrobat version               |         6          
A UDF can remain in a code module    |         9          

, как показано выше, учитывая, что таблица имеет 3 строки и два столбца, порядковый номер слова "VBA" ** в столбце col1 строки1 равен 1, аналогично слову ** "является" рядом со словом "VBA" имеет индекс 2 и т. Д. Рассмотрим строки, представляющие собой комбинацию абзаца, и поэтому, когда мы достигаем Col1 row2 индекс слова "Adobe " должно быть 6, как показано в таблице

На самом деле столбец startIndex показывает порядковый номер первого слова из абзаца, который разделен на строки

Ответы [ 3 ]

2 голосов
/ 28 марта 2019

VBA не нужна, просто используйте формулу для подсчета слов:

Затем добавьте количество слов к предыдущему количеству слов (из строки выше).

enter image description here

  • Запись 1 в B1 (это всегда 1)
  • Используйте следующую формулу в B2:

    =B1+LEN(TRIM(A1))-LEN(SUBSTITUTE(TRIM(A1)," ",""))+1
    
  • Скопируйте формулу из B2 в B3

0 голосов
/ 28 марта 2019

Я немного изменил вашу оригинальную функцию, чтобы иметь возможность обрабатывать диапазоны:

Public Function StartIndex(ByVal vRNG As Range) As Long
Application.Volatile
Dim rng As Range

For Each rng In vRNG
    StartIndex = UBound(Split(rng.Value, " ")) + 1 + StartIndex
Next rng

End Function

Затем вы можете применить его так:

=StartIndex($A$1:A1)+1

Но чтобы это сработало, нужно применить его из строки 2 ....

enter image description here

Другим вариантом было бы ввести в B1 только 1 (потому что это всегда будет 1), а затем в B2, та же формула:

=StartIndex($A$1:A1)+1

И это будет работать:

enter image description here

0 голосов
/ 28 марта 2019

Я бы подошел к этому немного по-другому и вместо этого передал бы диапазон.

Public Function StartIndex(ByVal textCell As Range) As Long

    Dim text As String
    text = textCell.Value

    Dim result As Long

    result = (UBound(Split(text, " ")) + 1)

    If textCell.Row > 1 Then
        result = result - (UBound(Split(textCell.Offset(-1, 0).Value, " ")) + 1)
    End If

    StartIndex = result

End Function

пример использования:

=StartIndex(A1)

или в VBA:

Dim index As Long
index = StartIndex(Range("A1"))
...