繁体   English   中英

使用VBA在excel中对特定列进行排序

[英]sort specific column in excel using vba

我有一个列表,并且想在列c4:c150值更改时对该列表进行排序。 我在Worksheet_Change中使用了以下代码,但无法正常工作! 有什么机构可以帮助我吗?

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

在此处 输入图像描述在 此处 输入图像描述

假设第4行的标题如下:

在此处输入图片说明

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

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

并在标准模块中安装:

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行没有标题,请调整范围限制。

孤立的.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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM