Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 9505|回复: 8

[已解决]关于在excel中使用VBA实现查找符合条件的多条记录的问题

[复制链接]
发表于 2010-6-4 09:41 | 显示全部楼层 |阅读模式
关于在excel中使用VBA实现查找符合条件的多条记录的问题
我在网络上找到了可以实现查找符合条件的多条记录的自定义函数的办法,完全可以实现我想要的结果,但有一个最大的问题,就是执行效率非常的低,只要改动一下原始数据,整个表就要重算一遍,重算时间得用上好几分钟,现在我表中还只设置了一个库房的数据公式,那要把几个库房的都给设上公式,那不要好几个小时啊。
请各位大哥些帮我优化下这个程序嘛,谢谢
同时也感谢写这个自定义函数的人,要是excel哪天自带这个函数就更好了。

'Vlookup_each("mp3",A2:A6,B2:B99,2),查找符合条件的多条记录。
Vlookup_each(条件,判断条件的区域条件,符合条件需要显示的区域,第几条记录)
zl46v5io.rar (19.63 KB, 下载次数: 192)

关于在excel中使用VBA实现查找符合条件的多条记录的问题

关于在excel中使用VBA实现查找符合条件的多条记录的问题

关于在excel中使用VBA实现查找符合条件的多条记录的问题

关于在excel中使用VBA实现查找符合条件的多条记录的问题
发表于 2010-6-4 09:54 | 显示全部楼层

'Vlookup_each("mp3",A2:A6,B2:B99,2)£¬²éÕÒ·ûºÏÌõ¼þµÄ¶àÌõ¼Ç¼£¬Vlookup_each(Ìõ¼þ,ÅжÏÌõ¼þµÄÇøÓòÌõ¼þ,·ûºÏÌõ¼þÐèÒªÏÔʾµÄÇøÓò,µÚ¼¸Ìõ¼Ç¼)
Public Function Vlookup_each(Lookup_value As String, Lookup_vector As Range, Result_vector As Range, K As Integer)

If K <= 0 Or (K Mod 1) <> 0 Then
    Vlookup_each = "#REF!"
    Exit Function
End If
Dim cell As Range
Dim i As Integer
Dim cellrow As Range
Dim Arr
Arr = WorksheetFunction.Index(Lookup_vector, 0, 1)
For Each cell In Arr
    If cell.Value = Lookup_value Then
        i = i + 1
            If i = K Then
                Set cellrow = Worksheets(cell.Parent.Name).Range(cell.Row & ":" & cell.Row)
                Vlookup_each = Intersect(cellrow, Result_vector).Value
                Exit Function
            End If
    End If
        Next
    If i = 0 Or K > i Then
        Vlookup_each = ""
    End If

End Function

回复

使用道具 举报

发表于 2010-6-4 09:57 | 显示全部楼层
回复

使用道具 举报

发表于 2010-6-4 10:17 | 显示全部楼层

这个帖子不错,把电脑的心电图拿出来,证明原公式效率低。十分地形象,OK
回复

使用道具 举报

 楼主| 发表于 2010-6-4 10:28 | 显示全部楼层

我按2楼的改了,执行效率确实快了去了,但是没有取出数来,提示出错了。

6ZTwveae.rar (18.12 KB, 下载次数: 77)

关于在excel中使用VBA实现查找符合条件的多条记录的问题

关于在excel中使用VBA实现查找符合条件的多条记录的问题
回复

使用道具 举报

发表于 2010-6-4 10:33 | 显示全部楼层

Public Function Vlookup_each(Lookup_value As String, Lookup_vector As Range, Result_vector As Range, K As Integer)
    If K <= 0 Or (K Mod 1) <> 0 Then
        Vlookup_each = "#REF!"
        Exit Function
    End If
    Dim cell
    Dim i As Integer
    Dim cellrow As Range
    Dim Arr
    Arr = WorksheetFunction.Index(Lookup_vector, 0, 1)
    For j = 1 To UBound(Arr)
        If Arr(j, 1) = Lookup_value Then
            i = i + 1
            If i = K Then
                Vlookup_each = Result_vector(j, 1)
                Exit Function
            End If
        End If
    Next
    If i = 0 Or K > i Then
        Vlookup_each = ""
    End If
End Function
回复

使用道具 举报

 楼主| 发表于 2010-6-4 10:47 | 显示全部楼层

还是不对,再麻烦哥哥改下。 pvDtSdjX.rar (17.26 KB, 下载次数: 157)
回复

使用道具 举报

发表于 2010-6-4 10:50 | 显示全部楼层    本楼为最佳答案   

我这里测试正常啊

Public Function Vlookup_each(Lookup_value As String, Lookup_vector As Range, Result_vector As Range, K As Integer)
    If K <= 0 Or (K Mod 1) <> 0 Then
        Vlookup_each = "#REF!"
        Exit Function
    End If
    Dim i&, j&
    Dim Arr
    Arr = WorksheetFunction.Index(Lookup_vector, 0, 1)
    For j = 1 To UBound(Arr)
        If Arr(j, 1) = Lookup_value Then
            i = i + 1
            If i = K Then
                Vlookup_each = Result_vector(j, 1)
                Exit Function
            End If
        End If
    Next
    If i = 0 Or K > i Then
        Vlookup_each = ""
    End If
End Function

回复

使用道具 举报

 楼主| 发表于 2010-6-4 10:55 | 显示全部楼层

呵呵,不好意思,我用的excel2007的,没注意到提示的启用宏,谢谢了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-5-17 05:21 , Processed in 0.287506 second(s), 10 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表