发布网友 发布时间:2022-04-22 10:36
共1个回答
热心网友 时间:2022-06-06 21:45
展开3全部
先创建自定义函数:allLookup(被查找值,数据区域,返回行偏移量,返回列偏移量,首表编号,末表编号,模糊查询,是否查询全部)
被查找值:需要查找的内容,如本例中”描述“所在单元格。
数据区域:在何处查找。注意,选定的范围应该包括返回值所在区域。如本例中可设为D6:K21
返回行偏移量:找到被查找值后,需返回结果相对的行偏移量。如本例中为0(行不变)
返回列偏移量:找到被查找值后,需返回结果相对的行偏移量。如本例中为1(右侧一列)
首表编号:需要查找的区域的第一个工作表编号(自最左边开始计数),如本例中5
末表编号:需要查找的区域的最后一个工作表编号(自最左边开始计数),如本例中5
注意:虽然sheet名为sheet6,但从左数,它是第5个。
模糊查询:是否模糊查询。是=1,否=0。默认为0。当选择模糊查询,指字符内容互相包含。本例为否。
是否查询全部:是=1,找全部,否=0,找第一个。本例为是。
所以公式为:
=SUMPRODUCT(alllookup("张三",D6:K21,0,1,5,5,0,1))
附代码:
Public Function allLookup(findValue, targetAreas, rowOffset%, columnOffset%, _
fristSheetNo%, lastSheetNo%, Optional fuzzySearch As Boolean = 0, Optional lookupAll As Boolean = 0)
Dim Rslt(10), t%
For sh = fristSheetNo To lastSheetNo
x = Sheets(sh).Range(targetAreas.Address)
For i = 1 To UBound(x, 1)
For j = 1 To UBound(x, 2)
If Not IsEmpty(x(i, j)) Then
If fuzzySearch Then
If InStr(x(i, j), findValue) > 0 Or InStr(findValue, x(i, j)) > 0 Then
Rslt(t) = x(i + rowOffset, j + columnOffset)
t = t + 1
If lookupAll = 0 Then Exit For
End If
Else
If findValue = x(i, j) Then
Rslt(t) = x(i + rowOffset, j + columnOffset)
t = t + 1
If lookupAll = 0 Then Exit For
End If
End If
End If
Next
If lookupAll = 0 And j < UBound(x, 2) Then Exit For
Next
If lookupAll = 0 And i < UBound(x, 1) Then Exit For
Next sh
If t = 0 Then
allLookup = CVErr(xlErrNA)
Else
ReDim Rslt1(1 To t)
For i = 1 To t
Rslt1(i) = Rslt(i - 1)
Next
allLookup = Rslt1
End If
End Function