实例需求:基础数据保存在Database
工作表中,如下图所示。
基础数据有37个字段,上图仅展示部分字段内容,下图中黄色字段为需要提取的数据字段。
在Search
工作表B1单元格输入查询关键字Title
和Genre
字段中搜索关键字,包含关键字的数据提取到Search
工作表,从第4行开始保存查询结果,如下图所示。
示例代码如下。
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行代码将查询结果保存在工作表中。