|
自2007版本后
微软推出几个带有IFS的函数
如sumifs、countifs、averageifs等
但是就是没有vlookupifs多条件查询
但是在之前回帖的过程中
就经常有一些朋友问
要返回符合某些条件的单元格值
之前用的是数组公式
如index(,small(if(.....)))
现在编写一个vlookupifs的自定义函数
只是根据这个理念编写的
没有考虑效率问题
在彭希仁版主的提示下
优化了不等号的做法
我原来用的是正则
现在调整为if+like
但是查询的效率还不是很高
- Function VLOOKUPIFS(lookup_range As Range, index_num As Long, ParamArray R() As Variant)
- n = UBound(R)
- m = n + 1
- ReDim arr(m)
- For i = 0 To n Step 2
- arr(i) = R(i)
- Next i
- k = UBound(arr(0))
- For h = 1 To k
- For j = 0 To n Step 2
- q = R(j + 1)
- If q Like ">*" Then
- If arr(j)(h, 1) > Replace(R(j + 1), ">", "") Then l = l + 1
- End If
- If q Like ">=*" Then
- If arr(j)(h, 1) >= Replace(R(j + 1), ">=", "") Then l = l + 1
- End If
- If q Like "<*" Then
- If arr(j)(h, 1) < Replace(R(j + 1), "<", "") Then l = l + 1
- End If
- If q Like "<=*" Then
- If arr(j)(h, 1) <= Replace(R(j + 1), "<=", "") Then l = l + 1
- End If
- If q Like "<>*" Then
- If arr(j)(h, 1) <> Replace(R(j + 1), "<>", "") Then l = l + 1
- Else
- If arr(j)(h, 1) = R(j + 1) Then l = l + 1
- End If
- Next j
- If l = (n + 1) / 2 Then p = p + 1
- l = 0
- If p = index_num Then
- y = h
- Exit For
- End If
- Next h
- Erase arr
- Set arr1 = lookup_range
- If y > 0 Then
- VLOOKUPIFS = arr1(y)
- Else
- VLOOKUPIFS = CVErr(xlErrValue) '这儿要返回一个错误值
- End If
- End Function
复制代码
该贴已经同步到 little-key的微博 |
|