https://www.cnblogs.com/hanmou/p/3396277.html?share_token=B11EC2DD-336D-441B-ADA1-E46F87C56AD9&tt_from=copy_link&utm_source=copy_link&utm_medium=toutiao_ios&utm_campaign=client_share VBA高效删除不连续多行 - Yancey.Han - 博客园 - 今日头条
方法一:循环标记删除的行号,Range.Delete一次删除
这个方法比较笨,一般步骤:
- 遍历每一行,根据一行的值判断是否需要删除,删除则把行号存入变量,否则跳过
- 当全部遍历完所有行后,得到一个变量,包含了需要删除的所有行号
- 把行号变量传给Range进行上传:类似 Range(“2:2,4:7,8:10”).Delete
说明:此方法对于小数据量运行速度还可以,可对于大数据(上千上万行),还是取遍历行标记的话会严重影响处理速度,所有才有了方法二
方法一:创建辅助列+填充公式
这种方法克服了遍历行频繁取值赋值的操作,因为Excel函数处理会比VBA快很多,大致步骤
- 创建一个辅助列
- 在辅助列第一个单元格编辑好公式,然后向下填充至底,如果要用到其他查询区域,需要先在其他单元格区域建立临时查询表,公式引用即可
- 填充好公式后,辅助列会有删除行的明显标记,比如0代表删除
- 然后进行排序,让需要删除的行处于连续行,这个连续行要么放到开头(这里放开头),要么放到末尾
- 用VBA统计辅助列0出现的个数(即所要删除的行数),统计的方法有两个:1循环判断+1;2先读取整个辅助列的值到数组,然后对数组循环判断+1(这个方法会比1快的多);3使用VBA函数worksheet.Function.countif(range,”=0),这个方法我还没实现。。。
- 最后用Range(“2:1000”).Delete 删除行,这里假设删除的行有这么多