【问题标题】:Sorting and subsorting a variant array对变体数组进行排序和子排序
【发布时间】:2015-04-17 20:01:00
【问题描述】:

我想在VBA中编写以下代码,一个签名函数

Public Function MySort( v as Variant) as Variant

它接受一个变体v,在它的第一列有名字,在第二列有注释,检查它是否有两列,如果没有则抛出错误,如果它有两行,则执行以下操作:它对v的排序根据 v 的第二列递减的行,然后在一组相同的音符内,按字母顺序对其进行排序。例如,函数MySort 将发送变体

A   14
D    3
B   14
E    3
C    3

变体

A   14
B   14
C    3
D    3
E    3

来自下面 OP 的评论

我试过了,没有成功:

Public Function MySort(r As Range) As Range
    Dim r1 As Range
    Dim r2 As Range

    Set r1 = r.Columns(1)
    Set r2 = r.Columns(2)

    r.Sort Key1:=r1, Order1:=xlDescending, DataOption1:=xlSortNormal
    r.Sort Key2:=r2, Order2:=xlAscending, DataOption2:=xlSortNormal

    Tri = r 
End Function

【问题讨论】:

  • 我建议使用宏记录器,并创建一个宏以按列 B Desc + col A Asc 排序。然后看代码。然后稍微修改该代码到您的例程中;)它应该是相当基本的。如果您仍有问题,请在此处写下您头痛的原因。
  • 您可能需要改进您的示例,因为您的代码只是在第一列上显示了一个排序,使用@Ditto 的建议很容易做到这一点。
  • @Ditto 非常感谢。现在,我确实可以应用您的建议,在这种情况下,我的函数采用两个参数,A 列和 B 列会更容易,但我真的希望它采用一个变体。我知道我可以将范围转换为变量,但是如何从输入变量中优雅地提取 column1 和 column 2 呢?
  • @EricFlorentNoube,为什么要使用变体?您可以传入v as Range,然后使用v.Columns(1)v.Columns(2) 处理这些列。或者如果你想一起处理他们可以v.Cells(row,col)
  • 我试过这个,但没有成功:Public Function MySort(r As Range) As Range Dim r1 As Range Dim r2 As Range Set r1 = r.Columns(1) Set r2 = r.Columns(2) r.Sort Key1:=r1, Order1:=xlDescending, DataOption1:=xlSortNormal r.Sort Key2:=r2, Order2:=xlAscending, DataOption2:=xlSortNormal Tri = r End Function

标签: sorting excel variant vba


【解决方案1】:

VBA 函数不会修改工作表上的值或结构,而不是它们所在的单元格。函数可用于对变量数组进行排序,并将重新排序的结果传递回子函数,该子函数将值返回到工作表,但你最好只使用 sub 来执行排序,除非你有一些无法常规处理的自定义排序标准。

Sub sort_A1CR(Optional ws As Variant) 'expect a worksheet object, not a worksheet name

    If IsMissing(ws) Then Set ws = ActiveSheet
    With ws.Cells(1, 1).CurrentRegion
        .Cells.Sort Key1:=.Columns(1), Order1:=xlAscending, _
                    Key2:=.Columns(2), Order2:=xlDescending, _
                    Orientation:=xlTopToBottom, Header:=xlYes
    End With

End Sub

您的示例代码与您的结果相矛盾。这以 A 列作为主键按升序排序。如果在 A 列中发现重复值,则 B 列用作降序子排序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-15
    • 1970-01-01
    • 2018-06-06
    • 1970-01-01
    • 2011-04-28
    相关资源
    最近更新 更多