Excel 2010 VBA 入门 040 批量删除空行
目錄
示例:
實現代碼1:
單元格刪除Delete方法
單元格刪除的通用算法
實現代碼2
利用Union獲取整個單元格區域進行統一操作
Union方法的注意事項
單元格插入Insert方法
示例:
? ? 如圖所示,該表為某公司入庫流水賬,由于工作人員疏忽,在記錄中產生了許多空行。現在需要做統計,希望能夠將這些空行批量刪除,該如何用VBA實現?
| 日期/時間 | 產品 | 數量 | 
| 2012/10/29 | 產品1 | 83 | 
| 2012/10/30 | 產品1 | 184 | 
| ? | ? | ? | 
| 2012/11/1 | 產品3 | 46 | 
| 2012/11/2 | 產品3 | 97 | 
| 2012/11/3 | 產品1 | 84 | 
| 2012/11/4 | 產品1 | 47 | 
| ? | ? | ? | 
| ? | ? | ? | 
| 2012/11/7 | 產品3 | 187 | 
| 2012/11/8 | 產品1 | 84 | 
| 2012/11/9 | 產品2 | 105 | 
| 2012/11/10 | 產品2 | 128 | 
| ? | ? | ? | 
| 2012/11/12 | 產品3 | 3 | 
| 2012/11/13 | 產品3 | 141 | 
| 2012/11/14 | 產品2 | 145 | 
| 2012/11/15 | 產品2 | 194 | 
| 2012/11/16 | 產品1 | 174 | 
| 2012/11/17 | 產品2 | 17 | 
| ? | ? | ? | 
| 2012/11/19 | 產品3 | 151 | 
| 2012/11/20 | 產品1 | 115 | 
| 2012/11/21 | 產品2 | 187 | 
| 2012/11/22 | 產品2 | 190 | 
| 2012/11/23 | 產品1 | 166 | 
| 2012/11/24 | 產品2 | 42 | 
| 2012/11/25 | 產品1 | 133 | 
| 2012/11/26 | 產品1 | 188 | 
| 2012/11/27 | 產品2 | 76 | 
| 2012/11/28 | 產品3 | 172 | 
| 2012/11/29 | 產品3 | 20 | 
| 2012/11/30 | 產品2 | 23 | 
| 2012/12/1 | 產品2 | 44 | 
| 2012/12/2 | 產品1 | 159 | 
| 2012/12/3 | 產品1 | 56 | 
實現代碼1:
Option ExplicitSub 批量刪除空行1()Dim RowN As LongFor RowN = Cells(Rows.Count, "A").End(xlUp).Row To 2 Step -1If WorksheetFunction.CountA(Intersect(Rows(RowN), Columns("A:C"))) = 0 ThenRows(RowN).Delete shift:=xlShiftUpEnd IfNext End Sub單元格刪除Delete方法
單元格刪除需要執行Delete方法,其語法為
Rng.Delete (Shift)? ? 其中,Rng為所需刪除的單元格。可選參數Shift可以為xIShiftToLeft(刪除后右側單元格左移)或xIShiftUp(刪除后下方單元格上移)。當省略該參數時,Excel將根據Rng所表示的單元格形狀進行判斷。實質上,刪除整行時,默認為xIShiftUp。
單元格刪除的通用算法
? ? 批量刪除行時,所執行的循環必須按照從下往上的順序進行循環。如本例中,若按照從第2行至最后一行循環的順序進行,將會發生以下情況:
 ? ? 當RowN為8時,程序判斷為空行,執行刪除操作后,第8行以下所有的行均上移一行。進入下一次循環時,RowN為9時,由于原先的空行(第9行)將會變為第8行(如圖所示),程序將不再進行判斷。因而該方法會導致空行刪除不徹底,開發者應避免此類錯誤的發生。
實現代碼2
Sub 批量刪除空行2()Dim RowN As LongDim Rng As RangeFor RowN = 2 To Cells(Rows.Count, "A").End(xlUp).RowIf WorksheetFunction.CountA(Intersect(Rows(RowN), Columns("A:C"))) = 0 ThenIf Rng Is Nothing Then'若Rng未賦值,則設置Rng為當前行Set Rng = Rows(RowN)Else'若Rng已賦值,則設置Rng為當前行與原Rng的合并區域Set Rng = Union(Rng, Rows(RowN))End IfEnd IfNext'若空行存在,則刪除If Not Rng Is Nothing Then Rng.Delete shift:=xlShiftUpEnd Sub利用Union獲取整個單元格區域進行統一操作
? ? 本解決方案是單元格批量操作經常使用的手段:利用1個變量Rng表示所有需要處理的單元格的集合,然后利用Union方法不斷將滿足條件的單元格添加到該集合中來。
Union方法的注意事項
? ? 在使用Union方法時需注意,由于Rng初始值為Nothing,若參數也為Nothing,將產生如圖所示的運行時錯誤。為避免該錯誤的發生,應對Rng對象進行判斷,若其為Nothing,就應直接賦值,而不使用Union方法。
單元格插入Insert方法
與刪除方法對應的是單元格插入Insert方法,其語法為
Rng.Insert (Shift,Copyorigin)? ? 其中,Rng為單元格對象,該單元格對象指定了插入單元格的位置和大小,當執行插入操作后,將會在Rng所表示的單元格或單元格區域的相同位置插入相同大小的空白單元格。
 ? ? 參數Shift表示Rng所表示的單元格對象在插入新單元格后的移動方向,可以為xIShiftToRight(活動單元格右移)或者xIShiftDown(活動單元格下移)。
 ? ? CopyOrigin表示插入的單元格的格式設置,可以為xlFormatFromRightOrBelow,表示新單元格格式與Rng所表示的單元格區域最下行的下一行或最右列右一列的格式相同,或者xIFormatFromLef tOrAbove,表示新單元格格式與Rng所表示的單元格最上行的上一行或最左列的左一列格式相同。
 ?
?
?
總結
以上是生活随笔為你收集整理的Excel 2010 VBA 入门 040 批量删除空行的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: csv 导入iphone通讯录
 - 下一篇: smarty手册 分离php和html