|
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件 ★ 免费下载 ★ ★ 使用帮助★
本帖最后由 WYS67 于 2020-3-8 18:36 编辑
LOOKX 修改.zip
(36.13 KB, 下载次数: 2)
从网上下载了一个别的老师编写的自定义函数【上面附件的第一个工作表里有详细的参数设置、运算规则和代码】,几乎综合了LOOKUP、HLOOKUP、VLOOKUP的所有查找功能,很强大,使用起来非常方便!
只是在截图所示的《9.自定义筛选》工作表里,选定A14输入公式 =IFERROR(LOOKX($A$11,$B$2:$B$7,A$2:A$7,,ROW(A1)),"") ,右拉至C14,下拉至A20:C20时,发现了bug【详见上图黄色填充的A17:C20区域】,
按运算规则应该是:当查找不到符合条件的数据时,屏蔽错误的结果为空白!
所以我在公式外面套上了IFERROR,用于把A17:B17区域内显示的错误结果屏蔽为空白,不知是什么原因,A17:C20没有变成空白,仍然显示了明显错误的筛选结果。代码如下:
Function LOOKX(v, vY, vh, Optional m = 0, Optional n = 1) '匹配未完成
Dim arr, arr1, arr2()
Dim k As Integer
On Error Resume Next
If Len(v) = 0 Then v = 0
arr = vY
arr1 = vh
If UBound(arr1) = 1 Then
arr1 = Application.Transpose(arr1)
arr = Application.Transpose(arr)
End If
ReDim arr2(1 To 1)
For x = 1 To UBound(arr1)
If m = 2 Then
flg = arr(x, 1) Like v '通配符匹配
ElseIf m = 3 Then
flg = InStr(arr(x, 1), v) '包含匹配
Else
flg = (arr(x, 1) = v) '精确匹配
End If
If flg And n = 1 Then
If UBound(arr1, 2) > 1 Then
LOOKX = arr1(x, 1)
With Application.ThisCell
For j = 1 To UBound(arr1, 2) '自动填充
If .Offset(, j) = "" Then s = Null Else s = "*"
.Offset(, j).Replace s, arr1(x, j + 1)
Next j
End With
End If
LOOKX = arr1(x, 1)
Exit Function
Else
If arr(x, 1) = v Then
k = k + 1
ReDim Preserve arr2(1 To k)
arr2(k) = arr1(x, 1)
End If
End If
Next x
If Abs(m) = 1 Then
LOOKX = JS(v, vY, vh, m)
Else
If n = 0 Then LOOKX = Join(arr2, ",")
If n < 0 Then LOOKX = arr2(k)
If n > 0 Then LOOKX = arr2(n)
End If
End Function
Private Function JS(J1, R1, R2, m) '取上下接近值
Dim Jarr1, Jarr2
Dim x
Jarr1 = R1
Jarr2 = R2
For x = 1 To UBound(Jarr1)
If x + 1 > UBound(Jarr1) Then
JS = Jarr2(x, 1)
Exit Function
ElseIf J1 >= Jarr1(x, 1) And J1 < Jarr1(x + 1, 1) Then
If m = -1 Then JS = Jarr2(x, 1) Else JS = Jarr2(x + 1, 1)
Exit Function
End If
Next x
End Function
请老师们给予诊断,看看代码错在哪里了?怎样修改,才能使输入的公式,在查找不到符合条件的数据时,屏蔽错误的结果为空白?【最好把屏蔽为空的运算规则写进代码,以后输入公式时不用再外套IFERROR函数】
|
|