Sorting 对变量数组进行排序和子排序
我想在VBA中编写以下代码,这是一个签名函数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
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结束函数