2016-04-28 278 views
0

我有一个列表,并且希望在列c4:c150值更改时对此列表进行排序。 我在Worksheet_Change下面的代码中使用但不工作!任何机构来帮助我?使用vba在excel中对特定列进行排序

Dim KeyCells As Range  
Set KeyCells = Range("C4:C150") 
If Not Application.Intersect(KeyCells, Range(Target.Address)) _ 
    Is Nothing Then 
    Columns("A:C").Sort key1:=Range("C4"), order1:=xlDescending, Header:=xlYes 
End If 

enter image description hereenter image description here

回答

0

假设行#4具有类似的报头:

enter image description here

在工作表中的代码区域安装事件宏:

Private Sub Worksheet_Change(ByVal Target As Range) 
    If Intersect(Target, Range("C5:C150")) Is Nothing Then Exit Sub 
    Application.EnableEvents = False 
     Call Zort 
    Application.EnableEvents = True 
End Sub 

和在一个标准模块ins高:

Sub Zort() 
    With ActiveSheet.Sort 
     .SortFields.Clear 
     .SortFields.Add Key:=Range("C5:C150") _ 
      , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal 

     .SetRange Range("A4:C150") 
     .Header = xlYes 
     .MatchCase = False 
     .Orientation = xlTopToBottom 
     .SortMethod = xlPinYin 
     .Apply 
    End With 
End Sub 

如果第4行没有标题,请调整范围限制。

0

孤单的.Sort声明在这里工作,虽然它可能不会完全按照你想要的。将整列作为范围进行排序加上设置Header:=xlYes使Excel相信你的标题在第1行,并将你的实际标题从第1-3行放到表中

因此,排序范围需要稍微修改.. 。示例

Sub Test() 
Dim KeyCells As Range, SortRange As Range 

    Set KeyCells = Range("C4:C150") 
    Set SortRange = [A3:C150] ' or however large your data range is 

    If True Then 'simulating positive IF 
     SortRange.Sort Key1:=SortRange(1, 3), Order1:=xlAscending, Header:=xlYes 
    End If 

End Sub