我在工作表2的第a列中存储了一系列名称。说约翰,史密斯,鲍勃,彼得,威廉。我需要检查工作表1中的单元格,然后查看该单元格中最后的名称。
假设Sheet1,A1中的内容是“威廉早早回家。史密斯打电话给贝尔,鲍勃打开门,看看那是不是彼得”。在这个,我的要求是,这个句子中包含A1单元格中的所有名称,其名称在此最后。显然这是彼得,我需要使用vba返回它。
我使用InStrRev函数编写了一个宏,并使用包含名称的MyNames数组。但是,它仅按降序搜索数组中的名称。
InStrRev(Range("t" & r).Value, MyNames(t), -1, vbTextCompare)
答案 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
Sheet2 A列
如果您在任何单元格中粘贴函数名称,那么
答案 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