目录

  • 1,删除工作表所有空行
  • 2,删除工作表所有空列
  • 3,删除选中单列包含指定字符的行
    • 举例
    • 3.1,改进版
  • 4,删除选中单列不含指定字符的行
    • 举例
  • 5,删除选中列重复的整行
    • 举例
  • 6,删除选中列唯一的整行
    • 举例

1,删除工作表所有空行

Sub 删除工作表所有空行()Dim first_row&, last_row&, i&first_row = ActiveSheet.UsedRange.Rowlast_row = first_row + ActiveSheet.UsedRange.Rows.count - 1For i = last_row To first_row Step -1   '倒序循环If WorksheetFunction.CountA(Rows(i)) = 0 ThenRows(i).Delete  '删除行End IfNext
End Sub

2,删除工作表所有空列

Sub 删除工作表所有空列()Dim first_col&, last_col&, i&first_col = ActiveSheet.UsedRange.Columnlast_col = first_col + ActiveSheet.UsedRange.Columns.count - 1For i = last_col To first_col Step -1   '倒序循环If WorksheetFunction.CountA(Columns(i)) = 0 ThenColumns(i).Delete  '删除列End IfNext
End Sub

3,删除选中单列包含指定字符的行

Sub 删除选中单列包含指定字符的行()'选中单列整列、单列部分都支持Dim rng As Range, arr, first_row&, last_row&, first_col&, i&, j
'--------------------参数填写:arr,指定条件字符串数组;title_row,表头行数'要删除的字符串数组,空值为删除空单元格,可使用模式匹配arr = Array("*一", "*三", "*五")title_row = 1        '表头行数,不执行删除Set rng = Intersect(ActiveSheet.UsedRange, Selection)  'intersect语句避免选择整列造成无用计算If rng.Columns.count > 1 Then Debug.Print "仅支持单列": Exit Sub  '仅支持单列,多列则退出'选中区域开始行号、结束行号、开始列号first_row = WorksheetFunction.Max(title_row + 1, rng.row) '表头行与选中区域开始行号的大值last_row = rng.row + rng.Rows.Count - 1: first_col = rng.columnFor i = last_row To first_row Step -1  '倒序循环For Each j In arr'只要有一个符合,就删除If Cells(i, first_col) Like j Then Rows(i).DeleteNextNext
End Sub

举例

A列选中运行代码后得到C列效果

3.1,改进版

以上代码在删除数据量较大(几千行以上)的情况下速度较慢,参考《Excel·VBA按列拆分工作表、工作簿》采用先Union行再删除的方法可大幅提高速度。一般情况下数据量越大较原版代码提高速度越明显,经测试,删除10万行数据仅需1秒
同时,因为是最后一起删除整行,无续考虑删除行后导致行号变化,故采用正序循环

Sub 删除选中单列包含指定字符的行()'选中单列整列、单列部分都支持Dim rng As Range, del_rng As Range, arr, first_row&, last_row&, first_col&, i&, j
'--------------------参数填写:arr,指定条件字符串数组;title_row,表头行数'要删除的字符串数组,空值为删除空单元格,可使用模式匹配arr = Array("1")title_row = 1        '表头行数,不执行删除Set rng = Intersect(ActiveSheet.UsedRange, Selection)  'intersect语句避免选择整列造成无用计算If rng.Columns.Count > 1 Then Debug.Print "仅支持单列": Exit Sub  '仅支持单列,多列则退出'选中区域开始行号、结束行号、开始列号first_row = WorksheetFunction.Max(title_row + 1, rng.row) '表头行与选中区域开始行号的大值last_row = rng.row + rng.Rows.Count - 1: first_col = rng.columnFor i = first_row To last_rowFor Each j In arrIf CStr(Cells(i, first_col).Value) Like j ThenIf del_rng Is Nothing ThenSet del_rng = Rows(i)ElseSet del_rng = Union(del_rng, Rows(i))End IfEnd IfNextNextIf Not del_rng Is Nothing Then del_rng.Delete
End Sub

4,删除选中单列不含指定字符的行

Sub 删除选中单列不含指定字符的行()'选中单列整列、单列部分都支持Dim rng As Range, arr, first_row&, last_row&, first_col&, i&, j, del_if As Boolean
'--------------------参数填写:arr,指定条件字符串数组;title_row,表头行数'要保留的字符串数组,空值为保留空单元格,可使用模式匹配arr = Array("*一", "*三", "*五")title_row = 1        '表头行数,不执行删除Set rng = Intersect(ActiveSheet.UsedRange, Selection)  'intersect语句避免选择整列造成无用计算If rng.Columns.count > 1 Then Debug.Print "仅支持单列": Exit Sub  '仅支持单列,多列则退出'选中区域开始行号、结束行号、开始列号first_row = WorksheetFunction.Max(title_row + 1, rng.row) '表头行与选中区域开始行号的大值last_row = rng.row + rng.Rows.Count - 1: first_col = rng.columnFor i = last_row To first_row Step -1  '倒序循环del_if = True    '初始为删除For Each j In arrIf CStr(Cells(i, first_col).Value) Like j Then del_if = False: Exit ForNextIf del_if Then Rows(i).DeleteNext
End Sub

举例

A列选中运行代码后得到C列效果

5,删除选中列重复的整行

对于选中多行多列区域,在一行中所有列的内容都重复,则删除该行,注意区分字母大小写
当参数 delete_all = False 时,重复的保留1行;当参数 delete_all = True 时,重复的全部删除,详见举例

Sub 选中列去重()'适用单/连续多列选中、单/连续多列部分选中,删除选中区域内重复的整行Dim rng As Range, del_rng As Range, dict1 As Object, dict2 As Object, delete_all As BooleanDim first_row&, last_row&, first_col&, resize_c&, i&, res$, kdelete_all = True   '是否全部删除,False则重复的保留1行Set rng = Intersect(ActiveSheet.UsedRange, Selection)  'intersect语句避免选择整列造成无用计算'选中区域开始行号、结束行号、开始列号、选中列数first_row = rng.row: last_row = first_row + rng.Rows.Count - 1first_col = rng.column: resize_c = rng.Columns.CountSet dict1 = CreateObject("scripting.dictionary")Set dict2 = CreateObject("scripting.dictionary")For i = first_row To last_rowtemp = Cells(i, first_col).Resize(1, resize_c)temp = WorksheetFunction.Transpose(WorksheetFunction.Transpose(temp))res = Join(temp, Chr(28))  '分隔符,最好为数据中不存在的字符If Not dict1.Exists(res) Then  '字典键不存在,新增dict1(res) = iElsedict2(res) = ""If del_rng Is Nothing ThenSet del_rng = Rows(i)ElseSet del_rng = Union(del_rng, Rows(i))End IfEnd IfNextIf delete_all Then  '重复的全部删除,加入dict1重复的行号For Each k In dict1.keysIf dict2.Exists(k) Then Set del_rng = Union(del_rng, Rows(dict1(k)))NextEnd IfIf Not del_rng Is Nothing Then del_rng.Delete  '删除行
End Sub

举例

《excel吧提问-多行多列重复数据筛选》

多列去重前

选中A-D列,运行代码,获得结果

delete_all = False  '重复的保留1行

delete_all = True  '重复的全部删除

6,删除选中列唯一的整行

对于选中多行多列区域,在一行中所有列的内容拼接后为唯一的,则删除该行,注意区分字母大小写

Sub 选中列删除唯一行()'适用单/连续多列选中、单/连续多列部分选中,删除选中区域内唯一的整行Dim rng As Range, del_rng As Range, dict1 As Object, dict2 As ObjectDim title_row&, first_row&, last_row&, first_col&, resize_c&, i&, res$, ktitle_row = 2        '表头行数,不执行删除Set rng = Intersect(ActiveSheet.UsedRange, Selection)  'intersect语句避免选择整列造成无用计算'选中区域开始行号、结束行号、开始列号、选中列数first_row = WorksheetFunction.Max(title_row + 1, rng.row)last_row = first_row + rng.Rows.Count - 1first_col = rng.column: resize_c = rng.Columns.CountSet dict1 = CreateObject("scripting.dictionary")Set dict2 = CreateObject("scripting.dictionary")For i = first_row To last_rowtemp = Cells(i, first_col).Resize(1, resize_c)temp = WorksheetFunction.Transpose(WorksheetFunction.Transpose(temp))res = Join(temp, Chr(28))  '分隔符,最好为数据中不存在的字符If Not dict1.Exists(res) Then  '字典键不存在,新增dict1(res) = iElsedict2(res) = ""End IfNextFor Each k In dict1.keysIf Not dict2.Exists(k) ThenIf del_rng Is Nothing ThenSet del_rng = Rows(dict1(k))ElseSet del_rng = Union(del_rng, Rows(dict1(k)))End IfEnd IfNextIf Not del_rng Is Nothing Then del_rng.Delete  '删除行
End Sub

举例

多列去重前

选中A-D列,运行代码,获得结果

Excel·VBA指定条件删除整行整列相关推荐

  1. Excel隐藏指定区域空单元格整行内容的操作!

    今天要和大家分享的是,Excel隐藏指定区域空单元格整行内容的操作!比如下图中的A列学号内容是存在漏录入的情况的,如何将空白单元格的整行隐藏呢-- (方方格子插件) 1.先看动图演示吧 2.首先我们需 ...

  2. Excel VBA 多条件筛选及汇总统计

    Excel VBA 多条件筛选 AdvancedFilter 汇总统计 sumproduct Range与Array交换 在日常工作中,面对Excel表格数据,为了分类进行统计,通过对表格数据筛选获取 ...

  3. Excel·VBA多条件筛选组合结果

    Function strTOF(str$) As Boolean'用于计算字符串判断True/False,默认返回False'适用vba比较运算符:速度比较慢,但通用Dim i&, j& ...

  4. Excel/WPS 按条件合并多行

    Excel/WPS 按条件合并多行 原始数据规则 需求 解决步骤 建辅助列 拼接多行数据 参考资料 原始数据规则 多个组有组号区分: 1.2.3.4 每个组有自己负责的工作区域.(特殊情况:组长光杆司 ...

  5. Excel 整行整列互换位置

    关注微信公共号:小程在线 关注CSDN博客:程志伟的博客 excel数据需求,需要将语文成绩与英语成绩进行整行的互换进行互换. 1. 首先选中全部英语列, 2.移动鼠标在BC两列之间,鼠标指针变成黑色 ...

  6. python按条件删除文件行,删除文件中的特定行(python)

    假设你的文件是每行一个昵称的格式,使用这个. 首先,打开文件: f = open("yourfile.txt","r") 接下来,从文件中获取所有行: line ...

  7. EXCEL的查找:如何按 行号+列号 进行查询, 可用indirect() + match() 或 index() + match()

    0 首先用match()等取得行号,列号 如果想根据行号+列号,精确查找,另外一个区域的数据,可以用如下方法 =INDIRECT("Sheet2!r"&MATCH($C11 ...

  8. speedoffice(Excel)表格中怎么自动调整行高列宽?

    在excel中录入数据时因为默认的单元格行高和列宽都很小,往往会出现输入的多行文字显示到其他单元格位置,下面了解Excel表格中自动调整行高列宽的方法. 打开excel之后选中单元格输入文字,可以看到 ...

  9. EXCEL数据透视表怎么把行转为列

    今天有个需求,要将数据透视表的二级行转换为列进行展示.具体如图: 数据透视表为这样: 最终效果为: 操作如下: 第一,将数据透视表改成表格格式,复制到新的表格里 2. CRTL+G 定位空值,输入&q ...

最新文章

  1. 2000DC和DNS迁移到2003 R2
  2. Ansible YML语法
  3. Docker基础-Docker数据管理
  4. 如何把apdu[decode_len]打印出来
  5. Kettle使用_10 存储过程与命名参数
  6. 编写mysql的工具_自己编写的数据库工具类
  7. python cmd闪退_使用cmd python模块时,如何使程序正常崩溃?
  8. BZOJ[1051]受欢迎的牛
  9. Hbase Shell 介绍
  10. 达摩院自研数学规划求解器发布,最新技术将通过阿里云对外输出
  11. windows server 查看当前登陆的用户 query user
  12. DP4 最小花费爬楼梯
  13. kotlin半生对象_Kotlin单一对象,Kotlin伴侣对象
  14. IOS文件操作(NSFileManager)
  15. Arduino 系列传感器应用
  16. 盘点Windows10系统的使用小技巧二 —— 磁贴
  17. 在matlab中读取二进制文件
  18. uni-app使用,并引入thor-ui
  19. java swing漂亮界面框架_开源软件分享-漂亮的JavaFx GUI界面框架
  20. Unity的IOS PlayerSettings的设置说明

热门文章

  1. 开源协议BSD、Apache2、GPL、LGPL、MIT
  2. 2048之军衔篇 反馈 有事留言
  3. java 整数 范围_探究JAVA整数的取值范围
  4. 雅安地震:擦肩而过的预报
  5. MySQL权限篇之REFERENCES以及外键级联操作
  6. 回乡年轻人因无法适应“拼关系” 逃回北上广C
  7. 变革财智 越秀集团携手远光软件探路数字财资新征程
  8. 【推荐】一个聚合图床
  9. 如何在chrome设置主页
  10. 如何在SOLIDWORKS工程图中,快速进行尺寸标注?