如何使用vba搜索单元格中存在的数组中的所有值

时间:2013-10-28 11:53:32

标签: arrays excel vba excel-vba

我在工作表2的第a列中存储了一系列名称。说约翰,史密斯,鲍勃,彼得,威廉。我需要检查工作表1中的单元格,然后查看该单元格中最后的名称。

假设Sheet1,A1中的内容是“威廉早早回家。史密斯打电话给贝尔,鲍勃打开门,看看那是不是彼得”。在这个,我的要求是,这个句子中包含A1单元格中的所有名称,其名称在此最后。显然这是彼得,我需要使用vba返回它。

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

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

2 个答案:

答案 0 :(得分:1)

您可以使用函数返回上次使用的名称。

该函数用作Worksheet函数或VBA,因为它返回一个String(名称)

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

enter image description here

Sheet2 A列

enter image description here

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

enter image description here

答案 1 :(得分: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