Excel·VBA指定条件删除整行整列
目录
- 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指定条件删除整行整列相关推荐
- Excel隐藏指定区域空单元格整行内容的操作!
今天要和大家分享的是,Excel隐藏指定区域空单元格整行内容的操作!比如下图中的A列学号内容是存在漏录入的情况的,如何将空白单元格的整行隐藏呢-- (方方格子插件) 1.先看动图演示吧 2.首先我们需 ...
- Excel VBA 多条件筛选及汇总统计
Excel VBA 多条件筛选 AdvancedFilter 汇总统计 sumproduct Range与Array交换 在日常工作中,面对Excel表格数据,为了分类进行统计,通过对表格数据筛选获取 ...
- Excel·VBA多条件筛选组合结果
Function strTOF(str$) As Boolean'用于计算字符串判断True/False,默认返回False'适用vba比较运算符:速度比较慢,但通用Dim i&, j& ...
- Excel/WPS 按条件合并多行
Excel/WPS 按条件合并多行 原始数据规则 需求 解决步骤 建辅助列 拼接多行数据 参考资料 原始数据规则 多个组有组号区分: 1.2.3.4 每个组有自己负责的工作区域.(特殊情况:组长光杆司 ...
- Excel 整行整列互换位置
关注微信公共号:小程在线 关注CSDN博客:程志伟的博客 excel数据需求,需要将语文成绩与英语成绩进行整行的互换进行互换. 1. 首先选中全部英语列, 2.移动鼠标在BC两列之间,鼠标指针变成黑色 ...
- python按条件删除文件行,删除文件中的特定行(python)
假设你的文件是每行一个昵称的格式,使用这个. 首先,打开文件: f = open("yourfile.txt","r") 接下来,从文件中获取所有行: line ...
- EXCEL的查找:如何按 行号+列号 进行查询, 可用indirect() + match() 或 index() + match()
0 首先用match()等取得行号,列号 如果想根据行号+列号,精确查找,另外一个区域的数据,可以用如下方法 =INDIRECT("Sheet2!r"&MATCH($C11 ...
- speedoffice(Excel)表格中怎么自动调整行高列宽?
在excel中录入数据时因为默认的单元格行高和列宽都很小,往往会出现输入的多行文字显示到其他单元格位置,下面了解Excel表格中自动调整行高列宽的方法. 打开excel之后选中单元格输入文字,可以看到 ...
- EXCEL数据透视表怎么把行转为列
今天有个需求,要将数据透视表的二级行转换为列进行展示.具体如图: 数据透视表为这样: 最终效果为: 操作如下: 第一,将数据透视表改成表格格式,复制到新的表格里 2. CRTL+G 定位空值,输入&q ...
最新文章
- 2000DC和DNS迁移到2003 R2
- Ansible YML语法
- Docker基础-Docker数据管理
- 如何把apdu[decode_len]打印出来
- Kettle使用_10 存储过程与命名参数
- 编写mysql的工具_自己编写的数据库工具类
- python cmd闪退_使用cmd python模块时,如何使程序正常崩溃?
- BZOJ[1051]受欢迎的牛
- Hbase Shell 介绍
- 达摩院自研数学规划求解器发布,最新技术将通过阿里云对外输出
- windows server 查看当前登陆的用户 query user
- DP4 最小花费爬楼梯
- kotlin半生对象_Kotlin单一对象,Kotlin伴侣对象
- IOS文件操作(NSFileManager)
- Arduino 系列传感器应用
- 盘点Windows10系统的使用小技巧二 —— 磁贴
- 在matlab中读取二进制文件
- uni-app使用,并引入thor-ui
- java swing漂亮界面框架_开源软件分享-漂亮的JavaFx GUI界面框架
- Unity的IOS PlayerSettings的设置说明