0

我在表 2 的 a 列中存储了一组名称。比如说 John、Smith、Bob、Peter、William。我需要检查表 1 中的一个单元格,并查看该单元格中的最后一个名称。

假设Sheet1 中的内容,A1 是“William 早早回家了。Smith 敲响了铃,Bob 开门看看是不是Peter”。在此,我的要求是,A1 单元格中该句子中包含的所有名称以及其名称在此中的最后一个。显然是彼得,我需要使用 vba 将其返回。

我已经使用 InStrRev 函数和包含名称的 MyNames 数组编写了一个宏。但是,它仅按降序搜索数组中的名称。

InStrRev(Range("t" & r).Value, MyNames(t), -1, vbTextCompare)
4

2 回答 2

1

您可以使用函数返回最后使用的名称。

该函数作为工作表函数或 VBA 工作,因为它返回一个 String(name)

Function LastUsedName(rng As Range) As String

    Dim names As Variant
    names = Sheets(2).Range("A1:A" & Sheets(2).Range("A" & Rows.Count).End(xlUp).Row)

    Dim cell As Range, i As Long, j As Long
    Dim arr As Variant
    arr = Split(rng, Chr(32))

    For j = UBound(arr) To LBound(arr) Step -1
        For i = LBound(names) To UBound(names)
            If names(i, 1) = arr(j) Then
                LastUsedName = names(i, 1)
                Exit Function
            End If
        Next i
    Next j

End Function

所以

Sheet1 单元格 A1

在此处输入图像描述

Sheet2 A 列

在此处输入图像描述

如果您将函数名称粘贴在任何单元格中,那么

在此处输入图像描述

于 2013-10-28T13:10:42.867 回答
0

您需要将该函数的返回值存储在某处,然后返回对应于最后一个位置的值。

我假设您正在使用t遍历名称。

添加这些行:

dim BigPos as long
dim BigLoc as long
dim CurrentPos as long

然后更改您的循环以实际记住它在字符串中找到的最远的名称

BigPos=0
BigLoc=0 ' set to zero, so no old checks can be found

for t=lbound(MyNames) to ubound(MyNames)
    currentpos=InStrRev(Range("t" & r).Value, MyNames(t), -1, vbTextCompare)
    if currenpos>bigpos then 
        'found one of the names *and* 
        'it's further along than the previous found name
        bigpos=currentpos 'remember where in the string we found the text
        bigloc=t 'and remember which name
    end if
next t 'check them all, so there's no exit out of the for loop

然后你可以显示结果:

if bigloc=0 then 
    msgbox "No names found"
else
    msgbox "Name " & MyNames(bigloc) & " found at character " & bigpos
end if
于 2013-10-28T12:44:29.817 回答