使用VBA实现快速模糊查询数据

实例需求:基础数据保存在Database工作表中,如下图所示。
使用VBA实现快速模糊查询数据_第1张图片
基础数据有37个字段,上图仅展示部分字段内容,下图中黄色字段为需要提取的数据字段。
使用VBA实现快速模糊查询数据_第2张图片

Search工作表B1单元格输入查询关键字TitleGenre字段中搜索关键字,包含关键字的数据提取到Search工作表,从第4行开始保存查询结果,如下图所示。
使用VBA实现快速模糊查询数据_第3张图片

示例代码如下。

Sub Demo()
    Dim res(), arr, cols
    dim lngLstRow as long
    dim strKey as String
    dim intIndex as Integer
    dim i as long, j as Integer
    lngLstRow = Sheets("Database").Cells(Rows.Count, 1).End(xlUp).Row
    arr = Sheets("Database").Range("A2:I" & lngLstRow)
    ReDim res(1 To lngLstRow, 1 To 6)
    intIndex = 1
    cols = Array(1, 3, 5, 7, 8, 9)
    strKey = Sheets("Search").[b1]
    For i = 1 To lngLstRow - 1
        If InStr(1, arr(i, 3) & arr(i, 5), strKey) > 0 Then
            For j = 1 To 6
                res(intIndex, j) = arr(i, cols(j - 1))
            Next
            intIndex = intIndex + 1
        End If
    Next
    If intIndex > 1 Then
        With Sheets("Search")
            .Range("4:10000").Clear
            .Range("A4").Resize(intIndex, 6).Value = res
        End With
    End If
End Sub

【代码解析】
第7行代码获取基础数据的最后一行所在行号。
第8行代码读取A列到I列数据,由于基础数据字段很多,全部加载到数据中,将占用更多内存,可能导致运行效率下降,因此只加载需要提取部分。
第9行代码重新声明动态数组res用于保存查询结果。
第10行代码设置变量intIndex用于指示数组res中的写入位置。
第11行代码创建数组保存需要提取的列号,这样可以简化提取数据的代码(第15~17行代码)。
第12行代码读取查询关键字。
第13~20行代码循环处理每行数据。
第14行代码判断知道字段是否包含查询关键字,arr(i, 3) & arr(i, 5)将两个字段合并为一个字符串,这样调用一次Instr函数就可以完成查询。
第15~17行代码提取指定的字段,保存到数组res中。
第18行代码变量累加1,指向下一个保存位置。
第22行代码情况保存查询结果单元格区域。
第23行代码判断是否有符合查询添加的结果,如果满足条件,第24行代码将查询结果保存在工作表中。

你可能感兴趣的:(数据清洗,VBA,数据,数据清洗,模糊查询,动态字段,数据查询,模糊匹配)