Excel VBA按特定列对命名范围进行排序

问题描述:

我有一个选定范围,并且在该范围内,我希望按特定列进行排序,以便每行都保持相同,即排序功能只是基于无论我选择哪一列进行排序。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

我记录在简单的宏,其选择范围( “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