2013-08-19 53 views
0

我一直在努力使用此代碼(可能非常簡單的錯誤),任何人都不會介意指出我的問題在哪裏?我的總體目標是讓這個子程序接受一個可變大小的範圍,但是我似乎無法讓它工作到一個固定的大小。將單行範圍複製到數組然後將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

+0

將範圍分配給數組時,您將始終獲得2維數組(即使只有1列/數據行)。我會檢查你的錯誤處理 - 如果它沒有返回錯誤,或者沒有使用「調試」框,那麼有些東西不會讓你看到代碼中的錯誤 – SeanC

+0

*'允許這個子程序接受一系列可變尺寸*你什麼意思? – 2013-08-19 13:54:26

+0

@SeanChesire - 沒有錯誤返回所有我得到的是一個未排序的數組作爲輸出 – ast4

回答

3

考慮到你只想對你的2維數組逐行排序,這可能是一個有用的起點。您隨時可以將With ws.Range("A2:A3")更改爲With Selection。如果你這樣做,你可以用你的光標選擇範圍。

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是您範圍內的每一行。如果用光標選擇範圍,某些行可能比其他行更短或更長,這就是爲什麼我們要重新選擇一個範圍。 編輯這不起作用,因爲.Columns.Count指的是整個範圍,而不僅僅是行。如果你有不同的列數,那麼你必須改變它。

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

不幸的是,我們不能使用tmpArr = myArr(i),因爲只有一個多維數組的大小不能像這樣在VBA訪問。

Call InsertionSort(tmpArr, 1, .Columns.Count)調用插入排序算法並一次排序一行。 tmpArray得到了分類

後,我們要設置myArray(i)新的價值觀與我們已經使用了相同的循環:

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

現在我們整理在我們的範圍中的所有行,現在我們可以把它放回表格,在指定範圍的第一行下方10行,.Offset(RowOffset:=10) = myArr

我希望這可以幫助你!在測試過程中,我發現您的InsertionSort算法中可能有一個小錯誤。如果第一個值是小寫字母,它就會盲目地被複制到數組的所有其他字段中:)

相關問題