網站首頁 編程語言 正文
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,獲得結果
原文鏈接:https://blog.csdn.net/hhhhh_51/article/details/123513999
相關推薦
- 2022-08-30 C語言示例講解結構體的聲明與初始化方法_C 語言
- 2022-08-30 Mac上出現多個版本選擇打開edge瀏覽器
- 2023-01-18 Python函數的參數列表解析_python
- 2022-12-02 React函數式組件Hook中的useEffect函數的詳細解析_React
- 2022-09-14 python?服務器批處理得到PSSM矩陣的問題_python
- 2022-03-29 python中format函數與round函數的區別_python
- 2022-03-14 has been blocked by CORS policy: Response to prefl
- 2022-06-02 Python?turtle編寫簡單的球類小游戲_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支