Excel VBA类似Vlookup函数功能,想要实现同时可正向和反向查找

VBA写了类似Vlookup函数的功能,想要实现同时可正向和反向查找,代码是利用InputBox选择的区域当类似Vlookup第二个参数。怎样判断:如果InputBox选... VBA写了类似Vlookup函数的功能,想要实现同时可正向和反向查找,代码是利用InputBox选择的区域当类似Vlookup第二个参数。怎样判断:如果InputBox选择是从左到右(如A1:C5)则正向查找返回C列值;如果InputBox选择是从右到左(如C1:A5)则逆向查找返回A列;求助怎样判断InputBox的选区是:从左到右还是从右到左选择的,谢谢! 展开
 我来答
飞雨飘eM
2018-12-15 · TA获得超过285个赞
知道小有建树答主
回答量:351
采纳率:81%
帮助的人:184万
展开全部

请确认百万条级的东西要在EXCLE中查么?会非常慢的,出一个简单的循环,表达一下达成的意思。

Function nlookup(rng1 As Range, rng2 As Range, col As Integer, n As String)
'n = InputBox("确定顺序,请输入Y或N,N为反查")
Dim icol%, irow%, i%
icol = rng2.Columns.Count
irow = rng2.Rows.Count
If n = "N" Then
    For i = 1 To irow
       If rng1 = rng2.Cells(i, icol) Then
       nlookup = rng2.Cells(i, icol - col + 1)
        Exit For
    End If
    Next
Else
    For i = 1 To irow
       If rng1 = rng2.Cells(i, 1) Then
       nlookup = rng2.Cells(i, col)
       Exit For
       End If
    Next
End If
End Function

追问
谢谢您的关注,因为工作中使用比较频繁,我用的字典+数组方式写的,正查已OK;已用一个inputbox选择区域当类似Vlookup第二个参数;为了代码的通用性,所以想要可以加句代码判断出inputbox选择区域,得出是要正向查找还是反向查找;请帮忙看看是否有代码可以实现,谢谢
追答
把你的代码贴上来,装两次字典即可。
尘宇心
2018-12-16 · TA获得超过762个赞
知道小有建树答主
回答量:1857
采纳率:53%
帮助的人:368万
展开全部
vlookup(条件,条件区域,匹配区域)
你的正反向查找是个什么概念?
条件存在于条件区域内,匹配匹配区域,存在于匹配区域内,匹配条件区域?
这样写个自定义高数,双向遍历就行了
追答

Function  双向lookup(A,B,C)
dim  bc,aa
aa=A.value
for each bc in B
if bc.value=aa then 
双向lookup=C.Parent.cells(bc.row,C.column).value
exit Function
end if
next
for each bc in C
if bc.value=aa then 
双向lookup=B.Parent.cells(bc.row,B.column).value
exit Function
end if
next
end Function

'B和C都是同起点行号且只有单列的数组单元。上面自定义函数应该没毛病,可公式直接引用。自己测试

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
可爱就是笑
2018-12-15 · TA获得超过1599个赞
知道大有可为答主
回答量:4011
采纳率:70%
帮助的人:621万
展开全部
那你应该使用鼠标按下,弹起事件啊
捕捉是从左到右,还是从右到左
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
Zhangweijun189
科技发烧友

2018-12-15 · 有一些普通的科技小锦囊
知道大有可为答主
回答量:3021
采纳率:59%
帮助的人:960万
展开全部
直接用VLOOKUP不行吗
for i = 1 to 5
Cells(i, 10) = Evaluate("=VLOOKUP(G" & i & ",IF({1,0},C:C,A:A),2,0)")
NEXT
追问
数据太大了,有接近一百万行,想写一个通用性强的代码,正向查找现在没问题,逆向不知道该怎么判断出来
追答

这就是逆向查找啊,for i =1 to 1000000,要不把你的代码看看,要快就用find函数查找C列区域,找到后获取行号,返回A列对应行号的单元格如返回cells(i,1)

在C列查找G列对应值,返回A列,写于H列

Sub 宏999()
Dim j%, n, rc, c
On Error Resume Next
rg = Range("G65536").End(xlUp).Row
rc = Range("C65536").End(xlUp).Row
Range("H2:H" & rg).Clear
For j = 2 To rg
c = Range("G" & j).Text
n = Range("C2:C" & rc).Find(What:=c, lookat:=xlWhole).Row
If n <> "" Then
    Range("H" & j) = Range("A" & n)
    n = ""
  End If
 Next 
End Sub
这个是调试过的,应该没问题。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
帐号已注销
2018-12-15 · TA获得超过1663个赞
知道小有建树答主
回答量:6318
采纳率:30%
帮助的人:929万
展开全部
写代码来实现
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式