2013-05-02 166 views
1

我有一個選定範圍,並且在該範圍內,我希望按特定列進行排序,以便每行都保持相同,即排序功能只是基於無論我選擇哪一列進行排序。Excel VBA按特定列對命名範圍進行排序

到目前爲止我的代碼是這樣的:

Sub CustomSortAscendingExcel(ByVal control As IRibbonControl, ByRef cancelDefault As Variant) 
Dim selRange As range 
Dim usedRange As range 
Dim checkRange As range 
Dim shtData As Worksheet 
Set shtData = Worksheets("Data") 
shtData.Activate 
shtData.Unprotect 
Set selRange = Selection 
Set usedRange = returnUsedRange 
Set checkRange = Intersect(usedRange, selRange) 
If Not Application.Intersect(usedRange, selRange) Is Nothing Then 
With ActiveSheet 
    usedRange.Sort Key1:=selRange, Order1:=xlAscending, DataOption1:=xlSortNormal, MatchCase:=False, SortMethod:=xlPinYin, _ 
    Header:=xlNo, Orientation:=xlSortColumns 
    .Sort.Apply 
End With 

而對於排序降序相似。這對column1工作正常。我的問題是,對於第2,3,4列,它只適用於那些在column1中有值的行,而對於那些沒有的值。例如,在下面的圖像中,按列3排序正確地重排了前9行,但不是最後兩行。

任何人都可以提出一種方法來解決這個問題嗎?謝謝!

enter image description here

+2

? – 2013-05-02 10:39:18

+0

你是什麼意思?我不想從結果 – db579 2013-05-02 10:40:42

+0

中刪除那些行,哪個區域在您的代碼中引用了'usedRange'? – 2013-05-02 10:42:39

回答

4

我記錄在簡單的宏,其選擇範圍( 「A1:D5」),適用於過濾器,然後排序基於所述第三列(C)

看看這個升序:

Range("A1:D5").Select 
    Selection.AutoFilter 
    ActiveWorkbook.Worksheets("Sheet1").AutoFilter.Sort.SortFields.Clear 
    ActiveWorkbook.Worksheets("Sheet1").AutoFilter.Sort.SortFields.Add Key:=Range _ 
     ("C1:C5"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _ 
     xlSortNormal 
    With ActiveWorkbook.Worksheets("Sheet1").AutoFilter.Sort 
     .Header = xlYes 
     .MatchCase = False 
     .Orientation = xlTopToBottom 
     .SortMethod = xlPinYin 
     .Apply 
    End With 

現在,沒有太多你需要做的,爲什麼不使用過濾器來解決您的問題:)

+0

請問您能解釋一下AutoFilter線路在做什麼?謝謝 – db579 2013-05-02 10:56:02

+0

看[這裏](http://www.ozgrid.com/VBA/autofilter-vba.htm) – 2013-05-02 10:58:58

+0

我得到'下標超出範圍錯誤'在第三行?我還不確定過濾器是幹什麼的,因爲它沒有隱藏任何東西 - 對不起,如果我在這裏變得異常緩慢! – db579 2013-05-02 11:09:11