获取从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中的段落获得的行的第一个单词的索引号的主要内容,如果未能解决你的问题,请参考以下文章