END屬性常用來構建動態(tài)的單元格范圍,獲取有效的數(shù)據(jù)區(qū)域。
- 其寫法是
單元格.end(方向)
- 要構建一個行數(shù)不斷增加的動態(tài)單元格范圍,如下面代碼
Sub 動態(tài)單元格()
Dim 最后一行 As Long, 最后一行1 As Long
Dim rng As Range, rng1 As Range
最后一行 = Range("a1").End(xlDown).Row
最后一行1 = Range("a13").End(xlUp).Row
Set rng = Range("a1:c" & 最后一行)
Debug.Print "rng的單元格范圍是" & rng.Address
Set rng1 = Range("a1:c" & 最后一行1)
Debug.Print "rng1的單元格范圍是" & rng1.Address
End Sub
最后一行 = Range("a1").End(xlDown).Row
從A2(A1不算)開始在A列向下xlDown查找 ‘連續(xù)’ 不為空的單元格,
一旦遇到空單元格則停止,返回最后一個非空單元格(地址)。
最后一行1 = Range("a13").End(xlUp).Row
從A12(A13不算)開始在A列向上xlUp查找不為空的單元格,
過程中遇到不為空單元格則停止,返回不為空單元格的(地址)。
- end(xldown)查找演示(遇空則停)
- end(xlup)同理,換個方向而已(找到非空為止)。
-
假如A5單元格變?yōu)榭諉卧?,則上面兩個end返回不同的行號。
- 當行數(shù)增加后,再運行代碼
- 注意紅色方框中的Range("a65535"),通常使用end(xlup)時,會設置一個比大的單元格作為起始點。
-03版的的excel有65536行。
-07版以上的excel有1048576行。
-因此,如果Range("a1048576").end(xlup)這種寫法在03版是報錯的,因為03excel不支持那么大的行數(shù)。 - 解決方法是下面的這種寫法
Cells(Rows.Count, 1).End(xlUp).Row
- 如果是03版excel,則rows.count是65536,07版以上1048576.
- 如指定單元格區(qū)域,則rows.count返回該單元格區(qū)域的行數(shù)。
- END除了xlup,xldown,還有xltoleft(向左),xltoright(向右)兩個方向的查找,原理都一樣,通常用來確定動態(tài)單元格范圍的列數(shù)。
- 練習:動態(tài)的高級篩選:根據(jù)部門篩選
- 先錄制高級篩選的宏,得出這樣的代碼。
Sub 宏2()
Application.CutCopyMode = False
Application.CutCopyMode = False
Sheets("Sheet4").Range("A1:C13").AdvancedFilter Action:=xlFilterCopy, _
CriteriaRange:=Range("A1:A2"), CopyToRange:=Range("A4"), Unique:=False
End Sub
- 將代碼改為動態(tài)的單元格區(qū)域,將篩選結果放到另外的工作表。
-
1、用End屬性構建動態(tài)的單元格區(qū)域。很少的改動就可以實現(xiàn)動態(tài)高級篩選。
Paste_Image.png
Sub 宏2()
Dim LastRow As Long
LastRow = Sheets("sheet4").Cells(Rows.Count, 1).End(xlUp).Row '動態(tài)獲取數(shù)據(jù)行數(shù)
Sheets("Sheet4").Range("A1:C" & LastRow).AdvancedFilter Action:=xlFilterCopy, _
CriteriaRange:=Sheets("sheet1").Range("A1:A2"), CopyToRange:=Sheets("sheet1").Range("A4"), Unique:=False
End Sub
- 代碼效果演示如下。稍稍修改,高級篩選就方便如意。