作者:iamlaosong
我常用下面方式取得有效行數:
maxrow=sheets(1).[A65536].End(xlUp).Row
這一句的含義是從A列65536行開始向上找,碰到第一個非空單元格的行号就是有效行數。
實際使用中發現這種方法存在2個問題:
1、高低版本不相容,2007版最大行數增加以後,就不能用65536了,而要用1048576,可以先判斷再決定用哪個數字,即用下列語句代替原來的一句,假定檔案名變量為rptfile:
If Right(rptfile, 3) = "xls" Then
maxrow = [A65536].End(xlUp).Row
Else
maxrow = [A1048576].End(xlUp).Row
End If
對于檔案自身,用系統變量ThisWorkbook.name(全路徑名稱是ThisWorkbook.FullName):
If Right(ThisWorkbook.name, 3) = "xls" Then
maxrow = Sheets(name).[A65536].End(xlUp).Row
Else
maxrow = Sheets(name).[A1048576].End(xlUp).Row
End If
2、當最後一行不為空時,用這個方法取不到正确的值。
3、其實也可以從上往下找,下面語句的意思是從A列第1行往下找,碰到最後一個非空單元格的行号就是有效行數。
maxrow = [A1].End(xlDown).Row
這種方法要求有效行數内,A列單元格都是非空,否則就不準了。
下面說明用VBA得到EXCEL表格中的行數和列數的特點,以便根據需要選用
每種方法中上面的是Excel的行數,下面的是Excel的列數。
方法1:
ActiveSheet.UsedRange.Rows.Count
ActiveSheet.UsedRange.Columns.Count
缺點:有時可能會比實際數大一些,原因是如果你把最後幾行(列)資料清除後(非整行或整列删除),用這個指令仍傳回未清除前的值。就是說現在雖然是空的,但是你曾經用過也算你的。
方法2:
ActiveSheet.Range("A65535").End(xlUp).Row
ActiveSheet.Range("IV1").End(xlToLeft).Column
可以簡寫為:
ActiveSheet.[A65536].End(xlUp).Row
ActiveSheet.[IV1].End(xlToLeft).Column
缺點:隻能計算出一列(行)的最後一個單元格所在的行(列)數。當最後一行或者一列不為空時無法傳回正确的結果,而且2007版以後,由于最大行列數增加,相容性存在問題。本例是隻傳回A列最後一個單元格所占的行數。
方法3:
ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row
ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Column
缺點:在工作表進行對删除或清除操作時也會變得比實際情況大。
方法4:
ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Row
ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Column
缺點:在工作表進行對删除或清除操作時也會變得比實際情況大。
方法5:
Application.CountA(ActiveSheet.Range("A:A"))
Application.CountA(ActiveSheet.Range("1:1"))
隻能統計一列(行)的實際使用情況,得到的不一定是最後一行(列)的位置。方法2的數值比此方法大時,說明在A列的資料間有空白未填寫的單元格。
方法6:
ActiveSheet.Cells.Find(What:="*", After:=[A1], SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
ActiveSheet.Cells.Find(What:="*", After:=[A1], SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Column
效果同方法2
以上方法中比較常用的是方法1和方法2。