删除单列 单行

删除多行时不能遍历删除

  1. '============= 删除列 ==============
  2. '删除第3
  3. Columns(3).Delete Shift:=xlToLeft
  4. Columns("C:C").Delete Shift:=xlToLeft
  5. '删除连续的列
  6. Range("B:D").Delete Shift:=xlToLeft
  7. '删除不连续的列
  8. Range("A:A,D:D").Delete Shift:=xlToLeft
  9. '============= 删除行 ==============
  10. sheet.columns(7).Delete
  11. Range("A1").EntireRow.Delete
  12. '删除140
  13. Range(Cells(1, 1), Cells(40, 40)).EntireRow.Delete 多行
  14. Rows("1:41").Delete Shift:=xlUp '一次删除多行
  1. Set MR = Range("A1:D1")
  2. For Each cell In MR
  3. If cell.Value = "old" Then
  4. cell.EntireColumn.Delete
  5. '或者
  6. cell.EntireRow.Delete
  7. Next

删除不连续的行(少量)

  1. range("33:33,36:36,38:39").Select
  2. range("A38").Activate
  3. Selection.Delete Shift:=xlUp

删除不连续的行(行数多)

当要删除的行数过多并且不连续,上述方法就不奏效,会得到错误结果
这时,需要借助辅助列判断,然后排序,删除的行是连续的,才可以删除多行
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一次删除

这个方法比较笨,一般步骤:

  1. 遍历每一行,根据一行的值判断是否需要删除,删除则把行号存入变量,否则跳过
  2. 当全部遍历完所有行后,得到一个变量,包含了需要删除的所有行号
  3. 把行号变量传给Range进行上传:类似 Range(“2:2,4:7,8:10”).Delete

说明:此方法对于小数据量运行速度还可以,可对于大数据(上千上万行),还是取遍历行标记的话会严重影响处理速度,所有才有了方法二

方法二:创建辅助列+填充公式

这种方法克服了遍历行频繁取值赋值的操作,因为Excel函数处理会比VBA快很多,大致步骤

  1. 创建一个辅助列
  2. 在辅助列第一个单元格编辑好公式,然后向下填充至底,如果要用到其他查询区域,需要先在其他单元格区域建立临时查询表,公式引用即可
  3. 填充好公式后,辅助列会有删除行的明显标记,比如0代表删除
  4. 然后进行排序,让需要删除的行处于连续行,这个连续行要么放到开头(这里放开头),要么放到末尾
  5. 用VBA统计辅助列0出现的个数(即所要删除的行数),统计的方法有两个:1循环判断+1;2先读取整个辅助列的值到数组,然后对数组循环判断+1(这个方法会比1快的多);3使用VBA函数worksheet.Function.countif(range,”=0),这个方法我还没实现。。。
  6. 最后用Range(“2:1000”).Delete 删除行,这里假设删除的行有这么多