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

Posted

技术标签:

【中文标题】获取从VBA中的段落获得的行的第一个单词的索引号【英文标题】:Getting index number of first word of row obtained from paragraph in VBA 【发布时间】:2019-03-28 09:28:02 【问题描述】:

我正在尝试获取一个列,该列将包含引用列中第一个单词的索引号。

我能够获取文本中单词的长度,因为上面的单元格值使用了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行2列,col1 row1中单词"VBA"**的索引号为1,同样单词旁边的单词**"is" >"VBA" 的索引为 2,依此类推.. 考虑行是段落的组合,因此当我们到达 Col1 row2 时,单词 "Adobe" 的索引应该如表所示为6

实际上 startIndex 列显示了段落中第一个单词的索引号

【问题讨论】:

对不起,但您要达到的目标尚不清楚。您说 获取一列,该列将包含引用的列单元格中第一个单词的索引号,但您的示例仅显示 2 列。为什么第一行返回 1?为什么第二个返回 6?为什么第三个返回 9?请更具体一点。 请看说明 我建议使用公式而不是 VBA。它们的计算速度应该比 VBA 快,如果数据发生变化,它们会自动重新计算。 【参考方案1】:

不需要VBA,只需使用公式来计算单词:

然后将单词的数量添加到之前的单词数量(从上面的行开始)。

1 写入B1(始终为1)

在 B2 中使用以下公式:

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

将公式从 B2 复制到 B3

【讨论】:

非常感谢,这只是 VBA 的要求,否则你的代码非常棒 @andro 请注意,公式的计算速度通常比 VBA 快。【参考方案2】:

我稍微修改了你原来的函数,以便能够处理范围:

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 行应用它......

另一种选择是在 B1 中输入一个 1(因为它总是为 1),然后在 B2 中输入相同的公式:

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

它会起作用的:

【讨论】:

在每一行中,它会一次又一次地计算所有先前行的字数。这意味着您添加的每一行都会变得越来越慢。您真的应该使用上一个单元格,然后将当前行中的单词数量相加。这样会快得多。 @Pᴇʜ,你是对的。我没想过OP得到了多少数据。另外,我赞成您的回答,因为我认为它要好得多。我喜欢 VBA,但如果可能的话,我更喜欢使用普通公式来获得解决方案。【参考方案3】:

我的处理方式略有不同,而是通过范围。

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

【讨论】:

我很想采用你的方法,但它显示出一些与预期不同的结果,你能纠正它吗?索引位置不合适 无论如何我都会选择@Pᴇʜ 的答案,这要好得多 - 不需要重新发明***并在不需要时使用 VBA。

以上是关于获取从VBA中的段落获得的行的第一个单词的索引号的主要内容,如果未能解决你的问题,请参考以下文章

将(各种大小的)行拆分为两列,保持列中的第一个单词

如何扩展Word VBA Range.Find返回的范围,直到段落结束

我如何获得第一个双引号中的值?

iOS:如何传递节中的行索引

Word VBA大写单词的第一个字符问题

如何在 SQL 查询中仅检查从存储过程返回的行的第一个值