分享

经典代码解析5:查找并显示部分匹配的数据

 L罗乐 2017-08-03

 

引子:本文中的代码来源于www.excelhero.com,文中稍作修改,演示了如何高效地从大量的数据中查找与想要的内容部分匹配的数据。本文提供的方法比《经典代码解析2:查找并获取所查找内容的全部单元格》中的代码更简洁更快速。我觉得可以作为一个模板,在类似的情形中使用。

 

目的

在大量的数据中,快速查找与查找值部分匹配的所有数据。

 

示例工作簿与程序代码

如下图所示,工作簿包含两个工作表,一个工作表Data用作数据库,包含大量的数据;另一个工作表Search用来从数据库工作表Data中查找想要的数据并显示。

 

方法1:使用Range对象的AdvancedFilter方法

在工作表中定义名称

Search工作表中定义的名称如下:

C3单元格名称:search_string

C8单元格名称:result_target

 

Data工作表中将单元格区域z1:z2定义的名称为:filter_criteria

 

在“定义名称”对话框中直接定义的名称(隐藏的名称):

Database=Data!$B$1:INDEX(Data!$1:$1048576,COUNTA(Data!$A:$A),COUNTA(Data!$1:$1))

result=Search!$C$8:INDEX(Search!$C$8:$XFD$1048576,COUNTA(Search!$C$8:$C$1048576),COUNTA(Search!$C$8:$XFD$1048576))

 

Search工作表单元格C5中,使用下面的公式统计找到的记录数:

=SUMPRODUCT( --(C9:C1048576>''))

 

设置工作表Search

设置Search工作表单元格C3的格式,在“单元格格式”的“保护”选项卡中取消“锁定”复选,以便于在“保护工作表”时仍能编辑该单元格。

保护工作表Search

 

编写代码

Search工作表对象模块中的代码为:

说明:

  • 代码中的方括号直接获取名称定义的单元格或单元格区域。

  • 先撤销对工作表的保护,然后才能对工作表操作。

  • 代码中设置了一个临时的条件区域,用于高级筛选,使用完后删除。使用Transpose函数将水平数组转换为垂直数组,即在同一列的两行中放置数据。

  • AdvancedFilter方法的使用详见《Excel VBA解读(53):高级筛选——AdvancedFilter方法》。

  • 设置计算模式,让工作表中统计记录数的SUMPRODUCT公式自动计算以实时获取最新得到的记录数。

 

方法2:使用ADO

在工作表中定义名称

除以下变化外,工作表中名称与方法1相同。

C9单元格名称:result_target

 

在“定义名称”对话框中直接定义的名称(隐藏的名称):

Database=Data!$A$2:INDEX(Data!$2:$1048576,COUNTA(Data!$A:$A),COUNTA(Data!$1:$1))

result=Search!$C$9:INDEX(Search!$C$9:$XFD$1048576,COUNTA(Search!$C$9:$C$1048576),COUNTA(Search!$C$8:$XFD$1048576))

 

Search工作表单元格C3中,使用下面的公式统计找到的记录数:

=SUMPRODUCT((C9:C65536>'') * 1 )

 

设置工作表Search

除以下变化外,工作表设置与方法1相同。

与方法1相比,本方法增加了一个复选框,其目的是为了避免内存泄漏而导致计算机崩溃。其工作表界面如下图所示。


编写代码

Search工作表对象模块中的代码为:

说明:

  • Excel工作簿作为数据库,使用ADO结合数据库查询语句获取结果。

  • 根据是否选取复选框,来确定是否创建工作簿副本,即是否在工作簿副本中查询数据。

  • 基于Excel单元格区域进址进行查询时,使用的是“[工作表名 $ 单元格区域地址]”的格式。因此,语句[database].Parent.Name & '$' &Replace([database].Address, '$', vbNullString)将单元格地址转换成正确的查询格式。

  • SQL查询语句中,使用[F2][F3][F4]来表示第2列、第3列、第4列。(第一次见到这种用法,还没有查到相应的详细资料。有熟悉的朋友能够详细介绍一下吗?

  • 有关ADO的详细介绍参见《经典代码解析4:使用ADO整合ExcelAccess》。

 

小结

  • 在工作表中设置公式,通过公式来计算记录数。

  • 定义名称并在代码中使用,充分利用名称简洁且自动更新的优势,简化代码。

  • 方法1在需要时才设置临时筛选条件,使用完后删除,更灵活。

  • 方法2将工作表作为数据库,使用ADO进行查询操作。

  • 本示例体现了公式、名称与VBA的完美配合,以简短的代码获取所需的功能。我认为是程序优化的上佳之作。

 


本文属原创文章,转载请联系我(xhdsxfjy@163.com)或者注明出处。

欢迎在下面留言,完善本文内容,让更多的人学到更完美的知识。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多