我试图在 VBA 中编写一个简单的冒泡排序函数,但它不起作用。代码如下
Public Function BubbSort(arr As Variant) As Variant
Dim arrReturn As Variant
arrReturn = Array()
ReDim arrReturn(UBound(arr))
arrReturn = arr.Value
For i = 1 To UBound(arr) - 1
For j = 1 To UBound(arr) - 1
If arrReturn(j) > arrReturn(j + 1) Then
temp = arrReturn(j)
arrReturn(j) = arrReturn(j + 1)
arrReturn(j + 1) = temp
End If
Next j
Next i
arr = arrReturn
End Function
在 Excel 中,我尝试选择 4x1 单元格范围并插入公式 $=BubbSort(A1:A4)$ 并按 Ctrl+Shift+Enter 使其用作数组函数,但它说“函数有错误”。请问有什么帮助吗?
最佳答案
如果 arr
是一个范围然后 UBound(arr)
会抛出错误。解决这个问题的方法是使用这条线
arrReturn = arr.Value
而不仅仅是
arrReturn = arr
然后使用
Ubound(arrReturn)
还有——
arrReturn
将是二维数组而不是一维数组。所有对 arrReturn
的引用应该看起来像例如arrReturn(j,1)
最后——你没有返回任何东西(这是分配给 VBA 中的函数名)。
以下代码似乎有效(如果冒泡排序可以被描述为“有效”):
Public Function BubbSort(arr As Variant) As Variant
Dim arrReturn As Variant
Dim i As Long, j As Long, temp As Variant
arrReturn = arr.Value
For i = 1 To UBound(arrReturn) - 1
For j = 1 To UBound(arrReturn) - 1
If arrReturn(j, 1) > arrReturn(j + 1, 1) Then
temp = arrReturn(j, 1)
arrReturn(j, 1) = arrReturn(j + 1, 1)
arrReturn(j + 1, 1) = temp
End If
Next j
Next i
BubbSort = arrReturn
End Function
以上仅在传递包含在列中的范围时才有效。可以更灵活地处理列范围或行范围或 VBA 数组。
关于vba - 为什么我的数组函数不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33845424/