vba - 为什么我的数组函数不起作用?

标签 vba excel

我试图在 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/

相关文章:

c++ - MS Word InsertBreak 抛出异常

vba - Excel VBA : Error handling only works for one pass

excel - 使用工作表函数编写自定义 Excel 函数的问题

excel - 如何为我的数据集确定最佳数据结构/实现?

excel - 突出显示 Sheet1 中与 Sheet2 中的值匹配的行

r - 频率关系矩阵

VBA:激活/选择工作表/行/单元格

vba - vba中excel列表中的最大几个变量

excel - 处理 Excel VBA 中的错误 '13'(西类牙语中的变量和文本)

excel - 无法使用 vba 将文本从 pdf 复制到 excel