0

我一直在为这段代码苦苦挣扎(可能是非常简单的错误),有人介意指出我的问题在哪里吗?我的总体目标是允许这个子例程接受一系列可变大小,但是我似乎无法让它在固定大小下工作。

如果我手动分配数组,事情会按预期工作,但是当我分配一个范围时,就会出现问题。输出原封不动地返回,这让我相信我在分配方面做得不对。当我尝试将 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

4

1 回答 1

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 中的所有行进行了排序,现在我们可以将其放回工作表上,在指定范围的第一行下方 10 行.Offset(RowOffset:=10) = myArr

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

于 2013-08-19T14:29:17.470 回答