前两天,一个朋友问我,有没有办法在excel里实现一个表单里是原始数据,在另一个表单里显示搜索到的行,搜索关键词可用~分隔开,并把搜索历史记录下来?

  我想了想,用vba实现肯定可以啊,但是我又在想,有没有可能excel自身的功能就可以实现了呢,但是后来没有发现excel自带这种功能。于是思考自己用vba给实现吧。

  于是我打开我的电脑,结果发现我的office版本是wps,根本就没有vba功能,网上说的使用vba模块安装,但是始终没有安装成功。最后放弃了,自己下载一个office2013, 自带vba功能。

  其实搜索功能实现思路相当简单,无非就几个循环,把关键词分割出来循环,按行搜索循环,按列搜索循环,然后得到结果后,填充结果,对于历史记录,则需要得到最后一行的行号等。

附件已上传,可点击去下载: 跨表单搜索示例-2003.zip 
http://files.cnblogs.com/files/yougewe/%E8%B7%A8%E8%A1%A8%E5%8D%95%E6%90%9C%E7%B4%A2%E7%A4%BA%E4%BE%8B-2003.zip

关键功能代码提示:

  1. Sheets("原始数据").Range("A6").CurrentRegion '获取选择区域数据
  2. searchArr = Split(searchStr, "~") ' 分割关键词
  3. Range("A9:V" & Rows.Count).ClearContents     ' 清空原有数据
  4. Sheets("搜索记录").Range("A65536").End(xlUp).Row '获取最大行的行号
  5. Sheets("搜索记录").Range("A" & maxRow).Resize(m, columnCount) = brr '数据填充

  实现代码如下:

  1. Sub 点击搜索原始数据()
  2. Dim i&, j&, m&, c%, t$, columnCount
  3. Dim arr, brr(), searchArr() As String, checkedRow()
  4. searchStr = InputBox("请输入要搜索的关键词,多个关键词以~分隔", "搜索数据选项", "云~餐")
  5.  
  6. If searchStr = "" Then
  7. MsgBox ("no search str ...")
  8. Exit Sub
  9. End If
  10. searchArr = Split(searchStr, "~")
  11. arr = Sheets("原始数据").Range("A6").CurrentRegion
  12. columnCount = UBound(arr, )
  13. rowCounts = UBound(arr)
  14.  
  15. searchArrCount = UBound(searchArr)
  16. ReDim brr( To UBound(arr), To columnCount)
  17. ReDim checkedRow( To rowCounts)
  18. Range("A9:V" & Rows.Count).ClearContents
  19. startRowNum =
  20. For i = startRowNum To rowCounts
  21. If (checkedRow(i) <> ) Then ' 因为当搜索到结果后会把整行显示出来,因此只要搜索到一行后,后续就可以不再搜索该行了,避免重复,也提升效率
  22. For iColumnNum = To columnCount
  23. findStr =
  24. For iSearchNum = To searchArrCount
  25. If arr(i, iColumnNum) Like "*" & searchArr(iSearchNum) & "*" Then
  26. m = m +
  27. checkedRow(i) =
  28. findStr =
  29. Exit For
  30. End If
  31. Next
  32. If findStr = Then
  33. For j = To columnCount -
  34. brr(m, j) = arr(i, j + ) '按行进行数据填充
  35. Next
  36. End If
  37. Next
  38. End If
  39. Next
  40. maxRow = Sheets("搜索记录").Range("A65536").End(xlUp).Row + ' 查找最大行数
  41. If m > Then
  42. cc = UBound(brr, )
  43. cc2 = UBound(brr, )
  44. Sheets("搜索").Range("A9").Resize(m, columnCount) = brr
  45. Sheets("搜索记录").Cells(maxRow - , ) = "本次搜索:" & searchStr & " 搜索时间:" & Now()
  46. Sheets("搜索记录").Range("A" & maxRow).Resize(m, columnCount) = brr
  47. Else
  48. Sheets("搜索记录").Cells(maxRow - , ) = "本次搜索:" & searchStr & " 搜索时间:" & Now()
  49. Sheets("搜索记录").Cells(maxRow, ) = "没有搜索到结果"
  50. End If '不管有无结果都需要记录操作
  51. End Sub

  注意的点: 使用office2013编辑生成了vba程序后,保存为2013的格式,下次打开后,该宏代码就丢失了,这是残酷的事实。解决办法为:保存为2003格式就可以了。

  vb作为脚本脚本语言,有其一定的特点,但是做一些小功能还是可以派上用场的。

excel vba 实现跨表单(sheet) 搜索 - 显示搜索行记录搜索历史的更多相关文章

  1. 原生js封装ajax:传json,str,excel文件上传表单提交

    由于项目中需要在提交ajax前设置header信息,jquery的ajax实现不了,我们自己封装几个常用的ajax方法. jQuery的ajax普通封装 var ajaxFn = function(u ...

  2. AngularJS 表单提交后显示验证信息与失焦后显示验证信息

    虽然说AngularJS的实时表单验证非常有用,非常高效方便,但是当用户还没有完成输入时便弹出一个错误提示,这种体验是非常糟糕的. 正常的表单验证逻辑应该是在用户提交表单后或完成当前字段中的输入后,再 ...

  3. Ladda 应用提交表单的时候显示loading载入中 包含不同位置,不同效果

    Ladda 应用提交表单的时候显示loading载入中 包含不同位置,不同效果 不同大小.位置,效果,进度条等 演示 XML/HTML Code <article class="exa ...

  4. 分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间)

    分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间) 很多时候我们都需要计算数据库中各个表的数据量和每行记录所占用空间 这里共享一个脚本 CREATE TABLE #tab ...

  5. (转)分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间)

    分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间) 很多时候我们都需要计算数据库中各个表的数据量和每行记录所占用空间 这里共享一个脚本 CREATE TABLE #tab ...

  6. 01 UIPath抓取网页数据并导出Excel(非Table表单)

    上次转载了一篇<UIPath抓取网页数据并导出Excel>的文章,因为那个导出的是table标签中的数据,所以相对比较简单.现实的网页中,有许多不是通过table标签展示的,那又该如何处理 ...

  7. submit()提交表单时,显示警示框

    我同事在实现submit()提交表单时,想要页面弹出警示框. 但是折腾了几小时后发现,submit()始终不执行. 她的代码如下: $(document).ready(function(){ $(&q ...

  8. 前端 HTML form表单标签 textarea标签 多行文本

    <textarea></textarea>作用:允许用户录入多行数据到表单控件中 <!DOCTYPE html> <html lang="en&qu ...

  9. SQL: 从一个表随机读取一行或几行记录的问题

    比如ms sql 2000,随机读取了一行记录: SELECT TOP 1 * FROM [tablename] ORDER BY NEWID() 遇到的问题是,如果这个表记录不多,比如几十或几百.几 ...

随机推荐

  1. JavaScript 简易版 自动轮播 手动轮播 菜鸟交流

    本人刚刚接触前端,许多知识还不了解,以前经常到博客园查询自己需要的东西,现在也终于反客为主了.作为新手,所展示的东西也是浅显易懂,希望同是新手的伙伴们共同交流.共同进步,若是成功捕获一位大大,也请您赐 ...

  2. 【R.转载】apply函数族的使用方法

    为什么用apply 因为我是一个程序员,所以在最初学习R的时候,当成"又一门编程语言"来学习,但是怎么学都觉得别扭.现在我的看法倾向于,R不是一种通用型的编程语言,而是一种统计领域 ...

  3. 关于IE兼容问题

    针对IE6/7/8 可以分为两种模式:怪异模式(Quirks mode)和标准模式(Standards mode),在IE6以下版本下显示怪异模式,border和padding都包含在width中使用 ...

  4. SQL模糊查询条件的四种匹配模式

    执行数据库查询时,有完整查询和模糊查询之分. 一般模糊语句格式如下: SELECT 字段 FROM 表 WHERE 某字段 LIKE 条件 其中关于条件,SQL提供了四种匹配模式: 1.% :表示任意 ...

  5. RHEL7对比RHEL6的主要变化

    RHEL7和RHEL6的主要变化 RHEL7和RHEL6的主要变化   RHEL7 RHEL6 文件系统 XFS EXT4 内核版本 3.10.x-x系列 2.6.x-x系列 内核名称 Maipo S ...

  6. Aggregate累加器

    今天看东西的时候看见这么个扩展方法Aggregate(累加器)很是陌生,于是乎查了查,随手记录一下.直接看一个最简答的版本,其他版本基本没什么区别,需要的时候可看一下 public static TS ...

  7. AOJ/数据结构习题集

    ALDS1_3_A-Stack. Description: Write a program which reads an expression in the Reverse Polish notati ...

  8. [进程管理]Linux进程状态解析之R、S、D

    Linux是一个分时操作系统,能够在一个cpu上运行多个程序,每个被运行的程序实例对应一个或多个进程,这里介绍一下Linux进程状态. Linux是一个多用户,多任务的系统,可以同时运行多个用户的多个 ...

  9. 使用Java POI来选择提取Word文档中的表格信息

    通过使用Java POI来提取Word(1992)文档中的表格信息,其中POI支持不同的ms文档类型,在具体操作中需要注意.本文主要是通过POI来提取微软2003文档中的表格信息,具体code如下(事 ...

  10. 《JavaScript权威指南》学习——js闭包

    序:闭包这个玩意啊~在很多没有代码块的语言中都会出现,已经成为大多程序员入门的一道坎,闭包让很多程序员觉得晦涩(事实上百度一下这个名词,真的说的很晦涩啊亲==|||),我第一次知道闭包这个名词是从&l ...