【发布时间】:2013-09-30 17:44:48
【问题描述】:
我必须编写一个函数来在 Excel 中对 VBA 中的给定范围进行排序。 (冒泡排序) 我做了以下事情:
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”
- 我已尝试将 Range 转换为数组
- 如果我不将 M2 转换为 M1,该函数将返回未排序的列表
- 我已尝试使用基数 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" ? 比较同一数组/范围的两个值的正确方法是什么?
【问题讨论】:
-
这段代码有很多问题:你正在用整数遍历行(并且行可能会变得比整数所能承受的更高),你在不使用 Set 的情况下分配范围(强制),你是访问不存在的 .Item 属性,您只能通过让(理论)列为零(列从 1 开始)等来迭代行。我建议您(深入)查看 VBA 以及如何与之前的范围进行交互尝试任何事情(来这里......记住“最低限度的理解”要求)。
-
认为它像数组,受“Option base”的影响msdn.microsoft.com/en-us/library/aa266179%28v=vs.60%29.aspx
-
如前所述,您有很多不足之处,IMO 需要更多的帮助,而不仅仅是提供特定的解决方案(但是在提出具体问题之前,您需要进行一些研究和测试以适应格式)。范围不是数组,它们具有特定的功能,它们都从 1 开始。