实例需求:工作表Data中A3单元格开始保存原始数据,第一行为要查找的关键数字,如果该列数据不包含指定数字,那么删除該单元格,并且单元格上移补充空位,结果如工作表Result所示。
需要注意的是:例如A4单元格内容为“14*0”,这并不包括关键数字“1”,只包含数字“14”和“0”。
原始数据中数字是以星号间隔,那么使用split函数拆分,然后针对拆分后的数组元素,再逐个判断进行删除即可,用VBA实现这个并不算什么难题。
如下示例代码展示如何快速查找,和快速删除单元格。
Sub demo()
akey = Range("A1:K1")
arr = [a3].CurrentRegion
For k = 1 To UBound(arr)
For j = 1 To 11
If VBA.InStr(1, "*" & arr(k, j) & "*", "*" & akey(1, j) & "*") = 0 Then arr(k, j) = ""
Next j
Next k
With [a3].CurrentRegion
.Value = arr
.SpecialCells(4).Delete shift:=xlUp
End With
End Sub
【代码解析】
第1行代码将关键数字读取到数组中。
第2行代码将原始数据读到数组中。
第4~8循环处理每个数据。
第6行代码用于判断单元格数据是否关键数字,如果不包含则InStr
函数返回值为0,则清空数据元素(如果直接清空单元格,那么将影响代码执行效率)。
直接使用InStr
函数无法实现全词(完整数字)匹配,因此需要对原始数据略处理。以A4单元格为例,其内容为“14*0”。
- 将数据扩展为“*14*0*”,即首尾分别增加一个星号
- 关键数字安装同样规则扩展为“1”
- 使用Instr函数进行查找
使用这个方法可是完成全词匹配,并且仅需要一次查找即可完成。
第10行代码将处理后的数据会写到单元格区域中。
第11行代码使用SpecialCells
方法查找单元格,参数值4代表空单元格,然后使用Delete
方法删除单元格,shift参数设置为xlUp
,则下方单元格上移。
总结一下知识点:
- 使用数据数组处理数据,避免多次读写单元格,提升代码效率
- 通过数据扩展,
InStr
一次查找即可实现全词匹配 - 使用
SpecialCells
方法定位单元格,一次性删除,提升代码效率