Excel?VBA指定條件刪除整行整列的實現(xiàn)
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 '倒序循環(huán) 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 '倒序循環(huán) 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 '--------------------參數(shù)填寫:arr,指定條件字符串?dāng)?shù)組;title_row,表頭行數(shù) '要刪除的字符串?dāng)?shù)組,空值為刪除空單元格,可使用模式匹配 arr = Array("*一", "*三", "*五") title_row = 1 '表頭行數(shù),不執(zhí)行刪除 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) '表頭行與選中區(qū)域開始行號的大值 last_row = rng.Row + rng.Rows.count - 1 '選中區(qū)域結(jié)束行號 first_col = rng.Column '選中區(qū)域開始列號 If rng.Row = 1 Then '選中單列整列 For i = last_row To title_row + 1 Step -1 '倒序循環(huán) 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 '倒序循環(huán) 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列效果
改進(jìn)版
以上代碼在刪除數(shù)據(jù)量較大(幾千行以上)的情況下速度較慢,參考《Excel·VBA按列拆分工作表、工作簿》采用先Union行再刪除的方法可大幅提高速度。一般情況下數(shù)據(jù)量越大較原版代碼提高速度越明顯,經(jīng)測試,刪除10萬行數(shù)據(jù)僅需1秒
同時,因為是最后一起刪除整行,無續(xù)考慮刪除行后導(dǎo)致行號變化,故采用正序循環(huán)
Sub 刪除選中單列包含指定字符的行() '選中單列整列、單列部分都支持 Dim rng As Range, del_rng As Range, arr, first_row&, last_row&, first_col&, i&, j '--------------------參數(shù)填寫:arr,指定條件字符串?dāng)?shù)組;title_row,表頭行數(shù) '要刪除的字符串?dāng)?shù)組,空值為刪除空單元格,可使用模式匹配 arr = Array("1") title_row = 1 '表頭行數(shù),不執(zhí)行刪除 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) '表頭行與選中區(qū)域開始行號的大值 last_row = rng.row + rng.Rows.Count - 1 '選中區(qū)域結(jié)束行號 first_col = rng.column: tm = Timer '選中區(qū)域開始列號 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 '--------------------參數(shù)填寫:arr,指定條件字符串?dāng)?shù)組;title_row,表頭行數(shù) '要保留的字符串?dāng)?shù)組,空值為保留空單元格,可使用模式匹配 arr = Array("*一", "*三", "*五") title_row = 1 '表頭行數(shù),不執(zhí)行刪除 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) '表頭行與選中區(qū)域開始行號的大值 last_row = rng.Row + rng.Rows.count - 1 '選中區(qū)域結(jié)束行號 first_col = rng.Column '選中區(qū)域開始列號 If rng.Row = 1 Then '選中單列整列 For i = last_row To title_row + 1 Step -1 '倒序循環(huán) 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 '倒序循環(huán) 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.刪除選中列重復(fù)的整行
對于選中多行多列區(qū)域,在一行中所有列的內(nèi)容都重復(fù),則刪除該行,僅保留唯一一行,注意區(qū)分字母大小寫
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 '選中區(qū)域開始行號 last_row = first_row + rng.Rows.count - 1 '選中區(qū)域結(jié)束行號 first_col = rng.Column '選中區(qū)域開始列號 last_col = first_col + rng.Columns.count - 1 '選中區(qū)域結(jié)束列號 Set dict = CreateObject("scripting.dictionary") For i = last_row To first_row Step -1 '倒序循環(huán),避免遺漏 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,獲得結(jié)果
到此這篇關(guān)于Excel VBA指定條件刪除整行整列的實現(xiàn)的文章就介紹到這了,更多相關(guān)Excel VBA指定條件刪除內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
當(dāng)編輯框內(nèi)容改變 對應(yīng)的單元格也隨著改變vba代碼
當(dāng)編輯框內(nèi)容改變 對應(yīng)的單元格也隨著改變vba代碼2009-07-07VBA處理數(shù)據(jù)與Python Pandas處理數(shù)據(jù)案例比較分析
這篇文章主要介紹了VBA處理數(shù)據(jù)與Python Pandas處理數(shù)據(jù)案例比較,本文通過實例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2020-04-04