我一直在努力解决这个代码(可能是非常简单的错误),有人会介意我的问题在哪里吗?我的总体目标是允许这个子程序接受一系列可变大小,但我似乎无法让它适用于固定大小。
如果我手动分配数组,事情会按预期工作,但是当我分配一个范围出错的地方。输出恢复原状,这使我相信我没有正确地进行分配。当我尝试将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
答案 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
我希望这对你有所帮助!测试时我发现你的InsertionSort算法可能有一点bug。如果第一个值是smalles,它只是盲目地被复制到数组的所有其他字段中:)