我有以下Sub獲取一列數字到一個Variant數組,而不是調用它上面的Bubble排序函數來排序仍在Loo變量中的數字。我希望Loo被改變,即在排序函數收到Byref並完成其工作之後,其中的數字以排序順序出現。有趣的是,排序功能會在Watch上顯示Inarray時進行排序。但是Loo - 儘管給了ByRef函數 - 從未改變過。Excel Vba遞歸子不改變Variant ByRef參數
變體數組不適合ByRef參數傳遞嗎?我在分揀機功能中做錯了什麼?遞歸是什麼「殺死」Inarray之前,它可以寫回Loo?
Option Explicit
Option Base 1
Public Loo As Variant
Public Destfile As Workbook
Private i As Integer
Sub sorter()
Set Destfile = Workbooks("SomeWB")
With Destfile.Worksheets("Somesheet").ListObjects("sometable").ListColumns("Numbers")
Loo = Application.Transpose(.DataBodyRange)
End With
BubbleSortArray (Loo)
End Sub
的冒泡排序功能如下:
Option Explicit
Option Base 1
Private NumberOfChanges, p As Integer
Private Store As Variant
Public Sub BubbleSortArray(ByRef Inarray As Variant)
NumberOfChanges = 0
For p = 1 To UBound(Inarray, 1) - 1
If Inarray(p) > Inarray(p + 1) Then
Store = Inarray(p + 1)
Inarray(p + 1) = Inarray(p)
Inarray(p) = Store
NumberOfChanges = NumberOfChanges + 1
End If
Next p
If NumberOfChanges <> 0 Then BubbleSortArray (Inarray)
End Sub
的主要原因是在你的代碼失敗,然而,你遞歸調用BubbleSortArray(帶圓括號) - 它試圖評估Inarray,因此不通過引用傳遞。請參閱http://www.cpearson.com/excel/byrefbyval.aspx和http://www.tushar-mehta.com/publish_train/xl_vba_cases/1004%20ByVal%20ByRef.shtml – Hauffa
@jkpieterse - 我認爲你的電話參考是好的,因爲他們使用「呼叫」,但BubbleSortArrary內的呼叫本身是問題(抱歉,由於我沒有足夠的聲望,所以不能評論你的答案)。 – Hauffa
事實上,任何帶括號的電話都不好! BubbleSort的遞歸和調用也是如此。感謝您解釋問題的鏈接! – Fiordiligi