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我神奇地工作。