Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting 对变量数组进行排序和子排序_Sorting_Excel_Variant_Vba - Fatal编程技术网

Sorting 对变量数组进行排序和子排序

Sorting 对变量数组进行排序和子排序,sorting,excel,variant,vba,Sorting,Excel,Variant,Vba,我想在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

我想在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
变异

A   14
D    3
B   14
E    3
C    3
A   14
B   14
C    3
D    3
E    3
从下面的评论来看


我尝试过这一点,但没有成功:

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

VBA函数不会修改工作表上的值或结构,而不是它们所在的单元格。函数可用于对变量数组进行排序,并将重新排序的结果传递回sub,sub将值返回到工作表中,但最好仅使用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列将以降序方式用作子排序。

我建议使用宏记录器,并创建一个宏以按B列Desc+A列Asc排序。然后看看代码。然后在例程中稍微修改该代码;)它应该是相当基本的。如果您仍然有问题,请在此处记下让您头痛的原因。您可能需要改进您的示例,因为您的代码只是在第一列显示排序,使用@Ditto的建议很容易做到。@Ditto非常感谢。现在,我确实可以应用你的建议,在这种情况下,我的函数接受两个参数,A列和B列会更容易,但我真的希望它接受一个变量。我知道我可以将一个范围转换为变量,但如何从输入变量中优雅地提取第1列和第2列呢?@EricFlorentNoube,为什么要使用变量?您可以将
v作为范围
传入,然后使用
v.Columns(1)
v.Columns(2)
处理列。如果你想一起处理它们,你也可以做
v.Cells(row,col)
。我已经尝试过了,但没有成功:
公共函数MySort(r作为Range)作为Range Dim r1作为Range Dim r2作为Range Set r1=r.Columns(1)Set r2=r.Columns(2)r.Sort Key1:=r1,Order1:=xl,数据选项1:=xlSortNormal r。排序键2:=r2,顺序2:=XLASSENDING,数据选项2:=xlSortNormal Tri=r结束函数