Content

Excel?VBA指定条件删除整行整列的实现(vba删除指定行数据)一看就会

在这里插入图片描述

文章摘要

这篇文章介绍了Excel VBA编程实现删除工作表行和列的具体方法,重点围绕以下功能展开: 1. **删除空行/列**: - **Sub 删除工作表所有空行()**:通过循环删除所有空单元格所在的行。 - **Sub 删除工作表所有空列()**:通过循环删除所有空单元格所在的列。 2. **删除特定条件的行**: - **Sub 删除选中单列包含指定字符的行()**:根据选定的字符条件,删除选中列中包含指定字符的行。 - **Sub 删除选中单列不含指定字符的行()**:根据选定的字符条件,删除选中列中不包含指定字符的行。 3. **删除重复的行**: - **Sub 删除选中列重复的整行**:删除选中列中重复的整行,保留唯一一行,区分字母大小写。 4. **改进与优化**: - 作者提到,针对大数据量(如10万行以上),原版代码速度较慢,参考《Excel·VBA按列拆分工作表、工作簿》的方法,采用先Union行再删除的方法可以大幅提高效率。通常情况下,数据量越大,优化效果越明显。文章建议采用正序循环以避免删除行后导致的行号变化问题。 总结:文章通过VBA代码详细展示了如何实现工作表中删除空行、空列、特定条件行以及重复行等功能,并对优化方法进行了说明。


目录sub1.删除工作表所有空行sub2.删除工作表所有空列sub3.删除选中单列包含指定字符的行改进版sub4.删除选中单列不含指定字符的行sub5.删除选中列重复的整行
Sub 删除工作表所有空行() Dim first_row, last_row, i first_row=ActiveSheet.UsedRange.Row last_row=first_row + ActiveSheet.UsedRange.Rows.count – 1 For i=last_row To first_row Step -1 ‘倒序循环 If WorksheetFunction.CountA(Rows(i))=0 Then Rows(i).Delete ‘删除行 End If Next End Sub
Sub 删除工作表所有空列() Dim first_col, last_col, i first_col=ActiveSheet.UsedRange.Column last_col=first_col + ActiveSheet.UsedRange.Columns.count – 1 For i=last_col To first_col Step -1 ‘倒序循环 If WorksheetFunction.CountA(Columns(i))=0 Then Columns(i).Delete ‘删除列 End If Next End Sub
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, rng.Row) ‘表头行与选中区域开始行号的大值 last_row=rng.Row + rng.Rows.count – 1 ‘选中区域结束行号 first_col=rng.Column ‘选中区域开始列号 If rng.Row=1 Then ‘选中单列整列 For i=last_row To title_row + 1 Step -1 ‘倒序循环 For Each j In arr ‘只要有一个符合,就删除 If Cells(i, first_col) Like j Then Rows(i).Delete Next Next ElseIf rng.Row > 1 Then ‘选中单列部分 For i=last_row To first_row Step -1 ‘倒序循环 For Each j In arr If Cells(i, first_col) Like j Then Rows(i).Delete Next Next End If End Sub

举例

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

在这里插入图片描述

以上代码在删除数据量较大(几千行以上)的情况下速度较慢,参考《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, rng.row) ‘表头行与选中区域开始行号的大值 last_row=rng.row + rng.Rows.Count – 1 ‘选中区域结束行号 first_col=rng.column: tm=Timer ‘选中区域开始列号 If rng.row=1 Then ‘选中单列整列 For i=title_row + 1 To last_row For Each j In arr ‘只要有一个符合,就删除 If CStr(Cells(i, first_col).Value) Like j Then If del_rng Is Nothing Then Set del_rng=Rows(i) Else Set del_rng=Union(del_rng, Rows(i)) End If End If Next Next ElseIf rng.row > 1 Then ‘选中单列部分 For i=first_row To last_row For Each j In arr If CStr(Cells(i, first_col).Value) Like j Then If del_rng Is Nothing Then Set del_rng=Rows(i) Else Set del_rng=Union(del_rng, Rows(i)) End If End If Next Next End If If Not del_rng Is Nothing Then del_rng.Delete Debug.Print “删除完成用时:” & Format(Timer – tm, “0.00”) ‘耗时 End Sub
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, rng.Row) ‘表头行与选中区域开始行号的大值 last_row=rng.Row + rng.Rows.count – 1 ‘选中区域结束行号 first_col=rng.Column ‘选中区域开始列号 If rng.Row=1 Then ‘选中单列整列 For i=last_row To title_row + 1 Step -1 ‘倒序循环 del_if=True ‘初始为删除 For Each j In arr ‘只要有一个符合,就不删除 If Cells(i, first_col) Like j Then del_if=False: Exit For Next ‘都不符合,删除 If del_if Then Rows(i).Delete Next ElseIf rng.Row > 1 Then ‘选中单列部分 For i=last_row To first_row Step -1 ‘倒序循环 del_if=True ‘初始为删除 For Each j In arr If Cells(i, first_col) Like j Then del_if=False: Exit For Next If del_if Then Rows(i).Delete Next End If End Sub

举例

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

在这里插入图片描述

对于选中多行多列区域,在一行中所有列的内容都重复,则删除该行,仅保留唯一一行,注意区分字母大小写

Sub 选中列去重() ‘适用单/多列选中、单/多列部分选中,去重删除整行 Dim rng As Range, dict As Object, first_row, last_row, first_col, last_col, i, j, res Set rng=Intersect(ActiveSheet.UsedRange, Selection) ‘intersect语句避免选择整列造成无用计算 first_row=rng.Row ‘选中区域开始行号 last_row=first_row + rng.Rows.count – 1 ‘选中区域结束行号 first_col=rng.Column ‘选中区域开始列号 last_col=first_col + rng.Columns.count – 1 ‘选中区域结束列号 Set dict=CreateObject(“scripting.dictionary”) For i=last_row To first_row Step -1 ‘倒序循环,避免遗漏 res=”” For j=first_col To last_col res=res & CStr(Cells(i, j).Value) Next If Not dict.Exists(res) Then ‘字典键不存在,新增 dict(res)=”” Else Rows(i).Delete ‘删除行 End If Next End Sub

举例

多列去重前

在这里插入图片描述

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

在这里插入图片描述

到此这篇关于Excel VBA指定条件删除整行整列的实现的文章就介绍到这了,更多相关Excel VBA指定条件删除内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:Excel?VBA按列拆分工作表和工作簿的实现vba将excel按照某一列拆分成多个文件VBA将excel数据表生成JSON文件VBA中操作Excel常用方法总结Excel VBA连接并操作Oracleexcel vba 高亮显示当前行代码excel vba 限制工作表的滚动区域代码合并Excel工作薄中成绩表的VBA代码,非常适合教育一线的朋友用vba实现将记录集输出到Excel模板