excel vba 实现跨表单(sheet) 搜索 - 显示搜索行记录搜索历史

  前两天,一个朋友问我,有没有办法在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

关键功能代码提示:

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

  实现代码如下:

Sub 点击搜索原始数据()
    Dim i&, j&, m&, c%, t$, columnCount
    Dim arr, brr(), searchArr() As String, checkedRow()
    searchStr = InputBox("请输入要搜索的关键词,多个关键词以~分隔", "搜索数据选项", "云~餐")

    If searchStr = "" Then
        MsgBox ("no search str ...")
        Exit Sub
    End If
    searchArr = Split(searchStr, "~")
    arr = Sheets("原始数据").Range("A6").CurrentRegion
    columnCount = UBound(arr, 2)
    rowCounts = UBound(arr)

    searchArrCount = UBound(searchArr)
    ReDim brr(1 To UBound(arr), 0 To columnCount)
    ReDim checkedRow(1 To rowCounts)
    Range("A9:V" & Rows.Count).ClearContents
    startRowNum = 6
    For i = startRowNum To rowCounts
        If (checkedRow(i) <> 1) Then                                        ‘ 因为当搜索到结果后会把整行显示出来,因此只要搜索到一行后,后续就可以不再搜索该行了,避免重复,也提升效率
            For iColumnNum = 1 To columnCount
                findStr = 0
                For iSearchNum = 0 To searchArrCount
                    If arr(i, iColumnNum) Like "*" & searchArr(iSearchNum) & "*" Then
                        m = m + 1
                        checkedRow(i) = 1
                        findStr = 1
                        Exit For
                    End If
                Next
                If findStr = 1 Then
                    For j = 0 To columnCount - 1
                        brr(m, j) = arr(i, j + 1)                           ‘按行进行数据填充
                    Next
                End If
            Next
        End If
    Next
    maxRow = Sheets("搜索记录").Range("A65536").End(xlUp).Row + 3           ‘ 查找最大行数
    If m > 0 Then
        cc = UBound(brr, 1)
        cc2 = UBound(brr, 2)
        Sheets("搜索").Range("A9").Resize(m, columnCount) = brr
        Sheets("搜索记录").Cells(maxRow - 1, 1) = "本次搜索:" & searchStr & "    搜索时间:" & Now()
        Sheets("搜索记录").Range("A" & maxRow).Resize(m, columnCount) = brr
    Else
        Sheets("搜索记录").Cells(maxRow - 1, 1) = "本次搜索:" & searchStr & "    搜索时间:" & Now()
        Sheets("搜索记录").Cells(maxRow, 1) = "没有搜索到结果"
    End If           ‘不管有无结果都需要记录操作
End Sub

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

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

时间: 2024-12-28 21:11:33

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

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

由于项目中需要在提交ajax前设置header信息,jquery的ajax实现不了,我们自己封装几个常用的ajax方法. jQuery的ajax普通封装 var ajaxFn = function(uri, data, cb) { $.ajax({ url: uri, type: 'POST', dataType: 'json', data: data, }) .done(cb) .fail(function() { console.log("error"); }) .always(f

Ladda 应用提交表单的时候显示loading加载中 包括不同位置,不同效果

Ladda 应用提交表单的时候显示loading加载中 包括不同位置,不同效果 不同大小,位置,效果,进度条等 演示 XML/HTML Code <article class="examples" style="margin-top:0px;"> <section class="button-demo"> <h3>expand-left</h3> <button class="lad

计算数据库中各个表的数据量和每行记录所占用空间--添加架构信息-读后感及知识整理

参考文章: SQL Server 游标运用:查看一个数据库所有表大小信息(Sizes of All Tables in a Database) 分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间) 监控SQLServer 数据库表每天的空间变化情况 仔细拜读上面三位的文章,不会的知识点又参考了MSDN,巩固了知识点如下: 知识点: 1.表的架构信息,涉及的系统对象 sys.schemas 和 INFORMATION_SCHEMA.TABLES,但后者不是官方推荐方式,

C# 如何向Excel添加、删除表单控件

在Excel中,添加的控件可以和单元格关联,我们可以操作控件来修改单元格的内容,在下面的文章中,将介绍在Excel中添加几种不同的表单控件的方法,包括: 添加文本框 单选按钮 复选框 组合框 使用工具:Free Spire.XLS for .NET 8.3 (社区版)PS:下载安装该组件后,注意在项目程序中添加引用Spire.XLS.dll(dll文件可在安装路径下的Bin文件夹中获取),如下图所示 代码示例: 插入Excel表单控件[C#] using Spire.Xls; using Spi

Excel vba引用工作表的三种写法

文章介绍vba引用工作表名称的三种不同写法. vba引用工作表是我们在学习VBA过程中很常用. 本文提供三种vba引用工作表的代码,通过这三种方式都可以实现vba引用工作表名. 方法一:Sheets(Sheet.Index) 方法二:Sheets(Sheets.Name) 方法三:Sheets.CodeName 下面是vba引用工作表的相关的一个截图,可以很直观的看到其使用. 原文地址:https://www.cnblogs.com/huhewei/p/9039168.html

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

我同事在实现submit()提交表单时,想要页面弹出警示框. 但是折腾了几小时后发现,submit()始终不执行. 她的代码如下: $(document).ready(function(){ $("button").click(function(){ $("form").submit(function(e){ alert("Submitted"); }); }); }); 在点击'button'时,给form表单绑定了一个submit事件,并没有

织梦自定义表单前台模版显示+分页调用

根目录建立form.php <?php require_once(dirname(__FILE__)."/../include/common.inc.php"); require_once(DEDEINC.'/datalistcp.class.php'); $sql = "Select * From `#@_diyform1`";//可以接着加条件 例如order by id desc 排序 $dlist = new DataListCP(); $dlist-

织梦调用已审核自定义表单在前台显示

查看自定义表单的表名 调用标签写法 {dede:loop table="dede_diyform1" sort="id" row="30" if="ifcheck=1"} <li>[field:name/] 在 [field:time/] 留言说:[field:msg/]</li> {/dede:loop} 标签说明 table="dede_diyform1" 表示自定义表单的表名

移动端表单校验错误显示组件

因业务需要,项目涉及大量表单提交,并且校验时会展示相应的错误样式(如下图),目前移动端的ui框架中并未找到相应的通用组件,如果按照原生的方法则需要给每一条数据项分别添加,代码会出现冗余,影响开发效率,所以需要实现组件化 具体代码如下: 1 <template> 2 <div class="valid-input" :class="{'error':error}"> 3 <slot></slot> //使用时具体数据项