实例需求:基础数据保存在Database工作表中,如下图所示。
 
 基础数据有37个字段,上图仅展示部分字段内容,下图中黄色字段为需要提取的数据字段。
 
在Search工作表B1单元格输入查询关键字Title和Genre字段中搜索关键字,包含关键字的数据提取到Search工作表,从第4行开始保存查询结果,如下图所示。
 
示例代码如下。
Sub Demo()Dim res(), arr, colsdim lngLstRow as longdim strKey as Stringdim intIndex as Integerdim i as long, j as IntegerlngLstRow = Sheets("Database").Cells(Rows.Count, 1).End(xlUp).Rowarr = Sheets("Database").Range("A2:I" & lngLstRow)ReDim res(1 To lngLstRow, 1 To 6)intIndex = 1cols = Array(1, 3, 5, 7, 8, 9)strKey = Sheets("Search").[b1]For i = 1 To lngLstRow - 1If InStr(1, arr(i, 3) & arr(i, 5), strKey) > 0 ThenFor j = 1 To 6res(intIndex, j) = arr(i, cols(j - 1))NextintIndex = intIndex + 1End IfNextIf intIndex > 1 ThenWith Sheets("Search").Range("4:10000").Clear.Range("A4").Resize(intIndex, 6).Value = resEnd WithEnd 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行代码将查询结果保存在工作表中。