删除单列 单行
删除多行时不能遍历删除
'============= 删除列 ==============
'删除第3列
Columns(3).Delete Shift:=xlToLeft
Columns("C:C").Delete Shift:=xlToLeft
'删除连续的列
Range("B:D").Delete Shift:=xlToLeft
'删除不连续的列
Range("A:A,D:D").Delete Shift:=xlToLeft
'============= 删除行 ==============
sheet.columns(7).Delete
Range("A1").EntireRow.Delete
'删除1到40行
Range(Cells(1, 1), Cells(40, 40)).EntireRow.Delete 多行
Rows("1:41").Delete Shift:=xlUp '一次删除多行
Set MR = Range("A1:D1")
For Each cell In MR
If cell.Value = "old" Then
cell.EntireColumn.Delete
'或者
cell.EntireRow.Delete
Next
删除不连续的行(少量)
range("33:33,36:36,38:39").Select
range("A38").Activate
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一次删除
这个方法比较笨,一般步骤:
- 遍历每一行,根据一行的值判断是否需要删除,删除则把行号存入变量,否则跳过
- 当全部遍历完所有行后,得到一个变量,包含了需要删除的所有行号
- 把行号变量传给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 删除行,这里假设删除的行有这么多