获取从VBA中的段落获得的行的第一个单词的索引号

时间:2019-03-28 09:28:03

标签: excel vba user-defined-functions

我正在尝试从被引用的列中逐个单元格获取包含第一个单词的索引号的列。

我能够获得文本中单词的长度,因为其中的上单元格值使用了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 ,并希望通过VBA startIndex

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

如上图所示,考虑到该表具有3行和两列,col1第1行中单词“ VBA” **的索引号是1个类似的单词**“ is” ,紧挨单词“ VBA” 的索引为2,依此类推..考虑到行是段落的组合,因此当我们到达Col1 row2时,单词“ Adob​​e” 的索引应如表所示为6

实际上,startIndex列显示了段落中第一个单词的索引号,该单词被分成行

3 个答案:

答案 0 :(得分:2)

不需要VBA,只需使用公式即可对单词进行计数:

然后将单词数量添加到上一个单词数量(从上一行开始)。

enter image description here

  • 1写入B1(始终为1)
  • 在B2中使用以下公式:

    =B1+LEN(TRIM(A1))-LEN(SUBSTITUTE(TRIM(A1)," ",""))+1
    
  • 将公式从B2复制到B3

答案 1 :(得分:0)

我会略有不同,然后通过范围。

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"))

答案 2 :(得分:0)

我已经修改了原始功能,使其能够处理范围:

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