ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > E问E答 > Excel VBA > 如何用VBA代码快速删除有规律的多行数据?

如何用VBA代码快速删除有规律的多行数据?

作者:绿色风 分类: 时间:2022-08-17 浏览:137
楼主
kevinchengcw
Q: 如何用VBA代码快速删除有规律的多行数据?
A: 当一个工作表有几万行数据的时候,想要快速删除每隔某几行的几行,如每隔六行的六行,应用VBA代码可以超快速的完成该工作,我们先来说一下代码,以下代码用两种方式来处理,效果基本一致,代码如下:
  1. Sub test()   '常规处理方式代码
  2.     Dim M, N, I As Long
  3.     Dim mTimer
  4.     M = 30004   '设定行标最大值
  5.     MsgBox "本工作簿共有数据" & M & "行,按确定后开始每隔六行删除六行", vbOKOnly, "提示"
  6.     mTimer = Timer   '储存计时开始时间
  7.     Application.ScreenUpdating = False   '为了提速关闭屏幕刷新
  8.     Application.EnableEvents = False      '为了提速关闭事件响应
  9.     Columns(1).Insert shift:=xlToRight   '先在A列插入一个辅助列
  10.     For N = 5 To M Step 12    '设定循环,每次步进12
  11.         Range(Cells(N + 6, 1), Cells(N + 11, 1)) = 1   'A列当前行向下数第七行到第十二行的值等于1
  12.     Next N
  13.     [a5:au30005].Sort [a5]   '将A5到AU30005单元格区域排序,以A5为排序依据(如不加此句,本例的运行时间会达到十倍以上)
  14.     Columns(1).SpecialCells(xlCellTypeConstants, 1).EntireRow.Delete    '选定A列有常量的值的行并删除(因要删除的行已经写入了1,通过排序又集中在了一起)
  15.     Columns(1).Delete   '删除辅助列
  16.     Application.EnableEvents = True    '打开事件响应
  17.     Application.ScreenUpdating = True    '打开屏幕刷新
  18.     MsgBox "共用时: " & Format(Timer - mTimer, "0.000") & "秒"    '显示所耗时间对话框
  19. End Sub
  1. Sub test2()    '字典处理方式代码
  2.     Dim M, N, I As Long
  3.     Dim mTimer
  4.     Dim Dic
  5.     M = 30004   '设定行标最大值
  6.     Set Dic = CreateObject("scripting.dictionary")   '创建字典
  7.     MsgBox "本工作簿共有数据" & M & "行,按确定后开始每隔六行删除六行", vbOKOnly, "提示"
  8.     mTimer = Timer   '储存计时开始时间
  9.     Application.ScreenUpdating = False   '为了提速关闭屏幕刷新
  10.     Application.EnableEvents = False      '为了提速关闭事件响应
  11.     Columns(1).Insert shift:=xlToRight   '先在A列插入一个辅助列
  12.     For N = 5 To M    '设定循环,每次步进12
  13.         If Int((N - 5) / 6) Mod 2 = 0 Then   '如果行数减5并除以6的整数值为偶数,即不需要删除的行
  14.             Dic.Add N, ""    '添加字典项,key为行数值,item值为空
  15.         Else
  16.             Dic.Add N, 1  '如果行数减5并除以6的整数值为奇数,则添加字典项,key为行数值,item值为1
  17.         End If
  18.     Next N
  19.     Range(Cells(5, 1), Cells(M, 1)) = WorksheetFunction.Transpose(Dic.Items)    '将字典的items集合内容写入到对应的单元格区域
  20.     [a5:au30005].Sort [a5]   '将A5到AU30005单元格区域排序,以A5为排序依据(如不加此句,本例的运行时间会达到十倍以上)
  21.     Columns(1).SpecialCells(xlCellTypeConstants, 1).EntireRow.Delete    '选定A列有常量的值的行并删除(因要删除的行已经写入了1,通过排序又集中在了一起)
  22.     Columns(1).Delete   '删除辅助列
  23.     Application.EnableEvents = True    '打开事件响应
  24.     Application.ScreenUpdating = True    '打开屏幕刷新
  25.     MsgBox "共用时: " & Format(Timer - mTimer, "0.000") & "秒"    '显示所耗时间对话框
  26. End Sub
从以上代码中可以看出,当删除的行存在于多个区域中不连续时,如果能通过辅助列将其集中,则在行数值相当大时的提速作用相当明显。

以上代码亦可改编成删除列。

附示例文件。
每隔六行删除六行.rar
2楼
hyx1976
这对于一个新手来说比较难啊!

免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap