2017-05-26 38 views
1

我有以下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 

回答

0

我相信你會需要明確地使盧和Inarray陣列,而不是變體(你可以讓他們變的陣列...或長,字符串,不管)。擁有全局或模塊級變量也不是一個好主意。 像這樣將工作:

Option Explicit 
Option Base 1 

Sub sorter() 
    Dim Loo() As Variant 
    Dim Destfile As Workbook 

    Set Destfile = ThisWorkbook 

    With Destfile.Worksheets("QueryResult").ListObjects("Table1").ListColumns("COLUMN_NAME") 
     Loo = Application.Transpose(.DataBodyRange) 
    End With 

    Call BubbleSortArray(Inarray:=Loo) 

    Stop 
End Sub 


Public Sub BubbleSortArray(ByRef Inarray() As Variant) 
    Dim NumberOfChanges As Integer 
    Dim p As Integer 
    Dim Store 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:=Inarray 

End Sub 
+0

的主要原因是在你的代碼失敗,然而,你遞歸調用BubbleSortArray(帶圓括號) - 它試圖評估Inarray,因此不通過引用傳遞。請參閱http://www.cpearson.com/excel/byrefbyval.aspx和http://www.tushar-mehta.com/publish_train/xl_vba_cases/1004%20ByVal%20ByRef.shtml – Hauffa

+0

@jkpieterse - 我認爲你的電話參考是好的,因爲他們使用「呼叫」,但BubbleSortArrary內的呼叫本身是問題(抱歉,由於我沒有足夠的聲望,所以不能評論你的答案)。 – Hauffa

+0

事實上,任何帶括號的電話都不好! BubbleSort的遞歸和調用也是如此。感謝您解釋問題的鏈接! – Fiordiligi

2

你所面臨的問題是由呼叫周圍嚕括號引起的。 VBA與其他語言的不同之處在於,如果對例程的調用沒有賦值,則不需要括號,實際上會導致不同的行爲。所以:

BubbleSortArray (Loo) 

或多或少告訴VBA評估Loo,然後將它傳遞給分類例程。

如果你想這樣稱呼它,一切都會好:

BubbleSortArray Loo 

例如見這個小演示:

Sub foo() 
    Dim x As Integer 
    x = 1 
    bar (x) 
    MsgBox x 
    bar x 
    MsgBox x 
End Sub 

Sub bar(ByRef x As Integer) 
x = 10 
End Sub 
+0

非常感謝!正如你所說:刪除括號後一切都很好。 :-) – Fiordiligi