ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 25353|回复: 61

[原创] Find查询与字典的应用

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2011-7-18 15:01 | 显示全部楼层 |阅读模式
本帖已被收录到知识树中,索引项:数据查询和匹配

数据取唯一值并生成有效性的下拉列表,用字典是首选
而且根据数据有效性的选择对象生成查询结果,用FIND较快
此类需求虽然用公式也可以实现,但是公式的缺点是要用到辅助区域,且效率太差,运算慢
VBA一键生成
效果如下:

VBA查询.gif

VBA查询.rar (110.13 KB, 下载次数: 1020)

Sub 生成材料名称()
On Error Resume Next
    Dim Dic1, str As String
    Set Dic1 = CreateObject("scripting.dictionary")
    For Item = 2 To Cells(Rows.Count, 3).End(xlUp).Row
        Dic1.Item(Cells(Item, 3).Value) = Cells(Item, 3).Value
    Next
    With [k3].Validation
        .Delete
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:=Join(Dic1.items, ",")
    End With
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target(1).Address = "$K$3" Then
        If Len(Target(1)) > 0 Then
            Range("L3:L10000").Clear
            Dim cell As Range, firstAddress As String, arr(1 To 10000, 1 To 1), i As Integer
            With Worksheets(1).Range("C:C")
                Set cell = .Find(Target, LookAt:=xlWhole, LookIn:=xlValues)
                If Not cell Is Nothing Then
               
                    firstAddress = cell.Address
                    Do
                    i = i + 1
                       arr(i, 1) = cell.Offset(0, 1).Value
                        Set cell = .FindNext(cell)
                    Loop While cell.Address <> firstAddress
                End If
            End With
            With [l3].Resize(i, 1)
            .Value = arr
            .Borders.LineStyle = xlContinuous
            .HorizontalAlignment = xlCenter
            End With
        End If
    End If
End Sub

_______________________________________

 

[ 本帖最后由 andysky 于 2011-7-19 12:58 编辑 ]

评分

3

查看全部评分

TA的精华主题

TA的得分主题

发表于 2011-7-18 15:17 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
收下学习了 感谢罗版主

TA的精华主题

TA的得分主题

发表于 2011-7-18 15:44 | 显示全部楼层
感谢罗版分享。
个人感觉用字典加数组 应该不会比字典加FIND 来的慢吧。

TA的精华主题

TA的得分主题

发表于 2011-7-18 15:56 | 显示全部楼层
二点数建议:
1、用数组不会比FIND差,2、在Worksheet_Change中改变单元格加Application.EnableEvents开关,不必做无谓的循环触动。
  1. Private Sub Worksheet_Change(ByVal Target As Range)
  2. If Target(1).Address = "$K$3" Then
  3.   s = Target(1)
  4.   If Len(s) > 0 Then
  5.     r = Range("d2", [c65536].End(3))
  6.     For i = 1 To UBound(r)
  7.       If r(i, 1) = s Then
  8.         j = j + 1
  9.         r(j, 1) = r(i, 2)
  10.       End If
  11.     Next
  12.     Range("L3:L10000").Clear
  13.     With [l3].Resize(j)
  14.       Application.EnableEvents = False
  15.       .Value = r
  16.       Application.EnableEvents = True
  17.       .Borders.LineStyle = xlContinuous
  18.       .HorizontalAlignment = xlCenter
  19.     End With
  20.   End If
  21. End If
  22. End Sub
复制代码

[ 本帖最后由 Zamyi 于 2011-7-18 15:57 编辑 ]

TA的精华主题

TA的得分主题

发表于 2011-7-18 16:38 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2011-7-18 16:41 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2011-7-18 20:10 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2011-7-18 20:35 | 显示全部楼层
Sub 數組()
Dim r, L$, i&, j%
r = Range("d2", [c65536].End(3)): L = [k3]
For i = 1 To UBound(r)
If r(i, 1) = L Then j = j + 1: r(j, 1) = r(i, 2)
Next
[l3].Resize(j).Value = r
End Sub

TA的精华主题

TA的得分主题

发表于 2011-7-18 20:39 | 显示全部楼层
不知道什么时候能学到罗老师的1‰不

TA的精华主题

TA的得分主题

发表于 2011-7-18 21:03 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-3-29 21:09 , Processed in 0.051473 second(s), 11 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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