使用VBA和单元格中的数据对数据进行排序

时间:2015-10-30 13:13:11

标签: excel vba excel-vba sorting

我对VBA和宏很新,并且正在寻找一些使用宏来排序数据的帮助。我记录了我做的事情,它产生了这个: Macro1宏

Range("A19:L28").Select
ActiveWorkbook.Worksheets("EuropeanStocks").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("EuropeanStocks").Sort.SortFields.Add Key:=Range( _
    "h20:h28"), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:= _
    xlSortNormal

With ActiveWorkbook.Worksheets("EuropeanStocks").Sort
    .SetRange Range("A19:L28")
    .Header = xlYes
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
End With

我的问题是如何制作,以便排序范围由单元格中的数据定义。对于这个排序范围为h20:h28的例子,20和28部分是恒定的,我在工作表中有一个单元格

E.g A1,其中包含需要排序的列的字母,例如。 “我”,“j”等。

我如何才能将A1读入排序范围?

3 个答案:

答案 0 :(得分:0)

最通用的方法是为要排序的范围(或包含要排序的范围的范围)定义命名范围,但是对于这个简单的要求,您可以简单地包装function Graph() { this.vertices = []; this.edges = []; this.addVertex = function(v){ this.vertices.push(v); }; return this; } 在另一个Range呼叫中呼叫包含排序范围(例如A1)的小区,从而获得所需范围。 E.g:

Range

编辑:这假定A1包含全范围参考(例如,它包含" A19:L28")。如果要部分地从其他单元构建目标范围,可以使用一种解决方案来构造范围引用,例如:

.SetRange Range(Range("A1"))

答案 1 :(得分:0)

请参阅下面的代码。您需要将Range(“A1”)中的值放入变量中,然后使用该变量在代码中设置范围。

Dim ws As Worksheet, c As String, rSort As Range, rData As Range
ws = Sheets("EuropeanStock")

With ws

    c = .Range("A1").Value

    Set rData = .Range("A19:L28")
    Set rSort = .Range(c & "20:" & c & "28")

    With rData.Sort

        With .SortFields
            .Clear
            .Add Key:=rSort, SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
        End With

        .SetRange rData
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply

    End With

End With

答案 2 :(得分:0)

只需将要排序的列放在A1中,然后用斜杠/(即a/f/h/s

分隔它们

这将逐一对所有这些进行排序:

Dim NewRange As String, _
    DataRange As String, _
    Sp() As String

Sp = Split(Range("A1"), "/")

With ActiveWorkbook.Worksheets("EuropeanStocks")
    For i = LBound(Sp) To UBound(Sp)
        NewRange = Sp(i) & "19:" & Sp(i) & "28"
        DataRange = Sp(i) & "20:" & Sp(i) & "28"
        With .Sort
            .SortFields.Clear
            .SortFields.Add _
                Key:=Range(DataRange), _
                SortOn:=xlSortOnValues, _
                Order:=xlDescending, _
                DataOption:=xlSortNormal

            .SetRange Range(NewRange)
            .Header = xlYes
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply
        End With
    Next i
End With