将单行范围复制到数组,然后将ByRef传递给函数VBA

时间:2013-08-19 13:17:57

标签: excel vba

我一直在努力解决这个代码(可能是非常简单的错误),有人会介意我的问题在哪里吗?我的总体目标是允许这个子程序接受一系列可变大小,但我似乎无法让它适用于固定大小。

如果我手动分配数组,事情会按预期工作,但是当我分配一个范围出错的地方。输出恢复原状,这使我相信我没有正确地进行分配。当我尝试将ws.UsedRange传递给固定范围时,我也会遇到错误。

Private Sub InsertionSort(ByRef a(), ByVal lo0 As Long, ByVal hi0 As Long)
    Dim i As Long, j As Long, v As Long

    For i = lo0 + 1 To hi0
        v = a(i)
        j = i
        Do While j > lo0
            If Not a(j - 1) > v Then Exit Do
            a(j) = a(j - 1)
            j = j - 1
        Loop
        a(j) = v
    Next i
End Sub

Sub runSort()
    Dim ws As Worksheet
    Set ws = ActiveWorkbook.ActiveSheet
    Dim myArr() As Variant
    Dim rangeUse As Range

    With ws.Range("D17:K17")
        ReDim myArr(1 To 1, 1 To ws.Range("D17:K17").Columns.Count)
        myArr = ws.Range("D17:K17").Value
    End With

    Call InsertionSort(myArr, LBound(myArr), UBound(myArr))
    Range("D19:K19") = myArr
End Sub

任何帮助将不胜感激! TIA

1 个答案:

答案 0 :(得分:3)

考虑到你只想逐行排序你的二维数组,这可能是一个有用的起点。您随时可以将With ws.Range("A2:A3")更改为With Selection。如果这样做,则可以使用光标选择范围。

With ws.Range("A2:A3")
    myArr = .Value
    For i = 1 To .Rows.Count
        ReDim tmpArr(1 To .Columns.Count)
        For j = 1 To .Columns.Count
            tmpArr(j) = myArr(i, j)
        Next j

        Call InsertionSort(tmpArr, 1, .Columns.Count)

        For j = 1 To .Columns.Count
            myArr(i, j) = tmpArr(j)
        Next j
    Next i
    .Offset(RowOffset:=10) = myArr
End With

详细说明

您不必redim myArray,因为如果将其设置为范围,则会自动缩放。

tmpArr是您的范围的每一行。如果您使用光标选择范围,则某些行可能比其他行更短或更长,这就是为什么我们重新划分该行。 修改这还不行,因为.Columns.Count指的是整个范围,而不仅仅是行。如果您有不同的列数,那么您必须更改它。

For j = 1 To .Columns.Count
    tmpArr(j) = myArr(i, j)
Next j

不幸的是我们不能使用tmpArr = myArr(i),因为在VBA中只能像这样访问多维数组的一个维度。

Call InsertionSort(tmpArr, 1, .Columns.Count)调整您的插入排序算法并一次排序一行。

tmpArray排序后,我们必须使用我们已经使用的相同循环将myArray(i)设置为新值:

For j = 1 To .Columns.Count
    myArr(i, j) = tmpArr(j)
Next j

现在我们对Range中的所有行进行了排序,现在我们可以将它放回到工作表上,在.Offset(RowOffset:=10) = myArr

指定范围的第一行下面10行

我希望这对你有所帮助!测试时我发现你的InsertionSort算法可能有一点bug。如果第一个值是smalles,它只是盲目地被复制到数组的所有其他字段中:)