将单行范围复制到数组,然后将ByRef传递到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

所以考虑到你只想sorting你的2维数组,这可能是一个有用的起点。 您始终可以With ws.Range("A2:A3")更改为With Selection 。 如果你这样做,你有你用光标select的范围。

 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是你的范围的每一行。 如果用光标select范围,某些行可能会比其他行更短或更长,这就是为什么我们要重新select一个范围。 编辑这不工作,因为.Columns.Count指的是整个范围,而不仅仅是行。 如果你有不同的列数,那么你必须改变这一点。

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

不幸的是,我们不能使用tmpArr = myArr(i)因为在VBA中只能有一个multidimensional array维度。

Call InsertionSort(tmpArr, 1, .Columns.Count)调用插入sortingalgorithm,并一次sorting一行。

tmpArray得到sorting后,我们必须使用与我们已经使用的循环相同的循环来将myArray(i)设置为新值:

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

现在,我们对Range中的所有行进行sorting,现在我们可以将它放回到表格中,在指定范围的第一行下面有10行,使用.Offset(RowOffset:=10) = myArr

我希望这可以帮助你! 在testing过程中,我发现在InsertionSortalgorithm中可能有一个小错误。 如果第一个值是越小,它只是盲目地被复制到数组的所有其他领域:)