2014-01-30 52 views
23

VBA的Excel排序範圍我有可以包含任意數目行的表:通過特定列

enter image description here

正如我所說的,它可以包含1個或∞行。

我想根據列B中的Date單元格對A3:D∞範圍進行排序。我該怎麼做?

問題是我不知道如何從A3選擇到最後一行。

我認爲循環到最後一行不是一個正確的方法。

我已經得到了這個到目前爲止它看起來像正確的,但範圍硬編碼。我如何擺脫範圍的硬編碼?

Range("A3:D8").Sort key1:=Range("B3:B8"), _ 
order1:=xlAscending, Header:=xlNo 

回答

53

試試這個代碼:

Dim lastrow As Long 
lastrow = Cells(Rows.Count, 2).End(xlUp).Row 
Range("A3:D" & lastrow).Sort key1:=Range("B3:B" & lastrow), _ 
    order1:=xlAscending, Header:=xlNo 
+2

謝謝它的作品,在幾分鐘內將標記你的回答更多 – Cheese

+0

只是一個註釋:這不適用於日期時間數據類型,它們按字符串排序。將字段轉換爲long並進行排序更安全。 – Yasskier

+0

成千上萬的選票! –

10

或者這樣:

Range("A2", Range("D" & Rows.Count).End(xlUp).Address).Sort Key1:=[b3], _ 
    Order1:=xlAscending, Header:=xlYes 
+0

我喜歡這個答案,因爲它不涉及一個額外的變量 – sonyisda1

+4

@ sonyisda1這是一個不好的原因,你可以用公式替換變量。但更清楚變量會發生什麼。 –

0

如果範圍和的關鍵是靜態的起始單元,該解決方案可以很簡單:

Range("A3").Select 
Range(Selection, Selection.End(xlToRight)).Select 
Range(Selection, Selection.End(xlDown)).Select 
Selection.Sort key1:=Range("B3", Range("B3").End(xlDown)), _ 
order1:=xlAscending, Header:=xlNo 
+1

[如何避免在Excel VBA中使用Select](https://stackoverflow.com/questions/10714251/how-to-avoid-using-select-in-excel-vba-macros) – Wolfie