当前位置: 代码网 > it编程>编程语言>其他编程 > Excel VBA指定条件删除整行整列的实现

Excel VBA指定条件删除整行整列的实现

2024年05月15日 其他编程 我要评论
sub1.删除工作表所有空行sub 删除工作表所有空行() dim first_row, last_row, i first_row = activesheet.usedrange.row

sub1.删除工作表所有空行

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

sub2.删除工作表所有空列

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

sub3.删除选中单列包含指定字符的行

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

sub4.删除选中单列不含指定字符的行

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列效果

在这里插入图片描述

sub5.删除选中列重复的整行

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

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指定条件删除内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com