VBA,数组,范围,sorting

我必须编写一个函数来在Excel中对VBA中给定的范围进行sorting。 (泡沫sorting)我做了以下几点:

Function MySort(M2 As Range) Dim r As Integer r = M2.Rows.Count Dim M1 as range M1 = M2 Dim buffer For i = 0 To r For j = i To r If (M1.Item(i, 0) > M1.Item(j, 0)) Then buffer = M1.Item(i, 0) M1.Item(i, 0) = M1.Item(j, 0) M1.Item(j, 0) = buffer End If Next j Next i MySort = M1 End Function 

问题 :

  • 它返回“#VALUE”
  • 我已经尝试将范围转换成数组
  • 如果我不把M2投到M1中,函数返回未sorting的列表
  • 我已经尝试了基础1和基础0

我想我已经确定了在下面的例子中突出显示的主要问题:

 Function TestArray(M1 As Range) r = M1.Rows.Count Dim M2 As Range Dim M3() ReDim M3(r) M3 = M1 M2 = M1 TestArray = M3(0, 0) ' or M2.item(0, 0) End Function 

这个函数将返回“#VALUE”。

为什么M2.item(0,0)返回“#VALUE”? 什么是正确的方式来比较相同的数组/范围的两个值?

那么这一行:

 Dim M1 as range 

正在创build一个空variables,可以容纳一个范围variables的引用

 M1 = M2 

其实是速记

 Let M1.Value = M2.Value 

但是因为M1是Nothing(在其他语言中是null),你不能很好地分配它的一个属性。 所以你的UDF会在该行抛出一个错误并退出。 你不是在铸造物体或者是在做什么。 你不应该需要或使用M1,你应该只需要M2。

而且,这一行:

 M1.Item(i, 0) = M1.Item(j, 0) 

应该是这样的:

 M1.Cells(i, 0) = M1.Cells(j, 0) 

但是,它永远不会在UDF中工作。 从Excel单元格中的公式调用的任何函数都不能更改其他单元格的内容。 这在Excel中是一个不容忽视的问题。 UDF只能读取其他单元格,然后返回一个值。 而已。 如果您想更改其他单元格,则必须将其称为macros而不是UDF。

编辑:进一步阅读的参考

阅读关于编写UDF及其局限性 。
阅读Let和Set之间的区别 。
你也可能会发现阅读这里和这里的范围对象是有帮助的。

 Function MySort(M2 As Range) Dim r As Integer r = M2.Rows.Count Dim ary() ReDim ary(r) ary = M2 Dim buffer For i = 1 To r For j = i To r If (ary(i, 1) > ary(j, 1)) Then buffer = ary(i, 1) ary(i, 1) = ary(j, 1) ary(j, 1) = buffer End If Next j Next i MySort = ary End Function 

改成arrays我神奇地工作。