我正在尝试使用我在StackOverflow上其他地方发现的一些名为Quicksort
的代码,这是一种对数组元素进行排序的方法。
我正在努力解决ByRef
错误,这些错误似乎是在我将整数值传递给Quicksort
子例程时发生的。
我的代码目前是:
(在主子程序中)
ReDim Preserve arrDataToSort(1 To 3, 2 To intCol - 1)
Call subQuickSort(arrDataToSort, 2)
(在一个单独的模块中)
Public Sub subQuickSort(ByRef var1 As Variant, _
ByVal intRowtoSort As Integer)
end sub
目前我在ByVal intRowtoSort As Integer
行显示Compile error: ByRef argument type mismatch
有人能够对此有所了解吗?如果我删除第二个参数(intRowtoSort),则不会发生错误
****** ****** EDIT
以下是一些评论,以下是代码的完整部分
ReDim arrDataToSort(1 To 3, 2 To countRows) As Variant 'declare an array to be used to sort the data - don't know dimensions yet, so make too big...
'done the above as transpose as can only ReDim second dimension of an array...
Dim intCol As Integer: intCol = 2 'defines the next blank col in arrDataToSort
For i = 2 To 1000 'countRows
If formulaarray1(i, uniqueCOL) = 1 Then 'i.e. unique patient ID
arrDataToSort(1, intCol) = Sheets(sheet_DATA).Cells(i, IDCOL).Value
arrDataToSort(2, intCol) = Sheets(sheet_DATA).Cells(i, FreqCOL).Value
arrDataToSort(3, intCol) = Sheets(sheet_DATA).Cells(i, FreqCOL2).Value
intCol = intCol + 1 'increment to identify next blank row
End If
Next i
ReDim Preserve arrDataToSort(1 To 3, 2 To intCol - 1) 'respecify the size of the array whilst preserving the data
'attempt to sort the data by the UniqueFreqCOL values using QuickSort subroutine
Call subQuickSort(arrDataToSort,2)
补充评论:
我还设法在删除函数的第二个参数中得到相同的ByRef错误,所以看起来问题出在我的数组上
我正在使用ReDim
而没有先前的Dim
因为这可以让我使用变量来指定数组的维度 - 我现在明白我不需要从评论:)
进一步修改 快速排序代码(我的非常小的编辑)是
Option Explicit
Public Sub subQuickSort(ByRef var1 As Variant)
Dim intRowtoSort As Integer: intRowtoSort = 2
Dim varPivot As Variant
Dim lngLow As Long, lngHigh As Long, lngLowStart As Long, lngHighStart As Long
lngLowStart = LBound(var1, 2)
lngHighStart = UBound(var1, 2)
lngLow = lngLowStart
lngHigh = lngHighStart
varPivot = var1(intRowtoSort, (lngLowStart + lngHighStart) \ 2)
While (lngLow <= lngHigh)
While (var1(intRowtoSort, lngLow) < varPivot And lngLow < lngHighStart)
lngLow = lngLow + 1
Wend
While (varPivot < var1(intRowtoSort, lngHigh) And lngHigh > lngLowStart)
lngHigh = lngHigh - 1
Wend
If (lngLow <= lngHigh) Then
subSwap var1, lngLow, lngHigh
lngLow = lngLow + 1
lngHigh = lngHigh - 1
End If
Wend
If (lngLowStart < lngHigh) Then
subQuickSort var1, lngLowStart, lngHigh (***)
End If
If (lngLow < lngHighStart) Then
subQuickSort var1, lngLow, lngHighStart
End If
End Sub
Private Sub subSwap(var As Variant, intRowtoSort As Integer, lngItem1 As Long, lngItem2 As Long)
Dim varTemp As Variant
varTemp = var(intRowtoSort, lngItem1)
var(intRowtoSort, lngItem1) = var(intRowtoSort, lngItem2)
var(intRowtoSort, lngItem2) = varTemp
End Sub
唯一可能需要注意的是,当我弹出一个eror框时,黄色箭头在public sortQuickSort
行,但lngLow
在上面的行中突出显示(** *)