【发布时间】: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