将整数传递到Excel VBA中的子例程时,ByRef错误

时间:2016-06-23 12:07:46

标签: excel-vba vba excel

我正在尝试使用我在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在上面的行中突出显示(** *)

0 个答案:

没有答案