2011-12-23 23 views
1

我在找的語言是MS Visual Basic。MS Visual Basic如何對第二個數組排序1個數組和返回索引?

我該如何對數組進行排序並相應地更改其他數組(使用索引?) 我正在搜索,但無法找到任何內容。任何幫助是極大的讚賞!!!

例如排序數組BirthArray並相應地更改Array1和ID的順序?

Array1 = 'John', 'Christina','Mary', 'frediric', 'Johnny','billy','mariah' 

BirthArray = 1998, 1923, 1983,1982,1924,1923,1954 

ID = 12312321, 1231231209, 123123, 234324, 23423, 2234234,932423 

Dim Array() As String 

Dim BirthArray() As Integer 

Dim ID() As Integer 

非常感謝!

+2

對不起,但爲什麼你不會只使用2維數組並排序一次? – Jesse

+0

[cpearson.com](http://www.cpearson.com/excel/CollectionsAndDictionaries.htm)上的此頁面可能會有所幫助 –

+0

嗨,已經有三個維度了,我想在後面添加更多列表/屬性上。 – user1113953

回答

3

你應該做一個類來保存值,把類的集合到一個列表,然後使用lambda表達式排序列表:

Public Class Info 
    Public Property Name As String 
    Public Property BirthYear As Integer 
    Public Property ID As Integer 

    Public Sub New() 
    End Sub 
    Public Sub New(sName As String, wBirthYear As Integer, wID As Integer) 
     Me.New 
     Me.Name = sName 
     Me.BirthYear = wBirthYear 
     Me.ID = wID 
    End Sub 
End Class 

Public Sub DoSort() 
    Dim cRecords As New System.Generic.List(Of Info) 

    cRecords.Add(New Info('John', 1998, 12312321) 
    ' ToDo: Add more records 

    cRecords.Sort(
    Function (ByVal oItem1 As Info, ByVal oItem2 As Info) 
     Return oItem2.BirthYear.CompareTo(oItem1.BirthYear) 
    End Function) 

End Sub 
+0

感謝您的快速回答! 有沒有更簡單的方法,我不得不添加一個類?性能對我來說並不重要。 對於班級,我不知道哪一部分必須進入班級模塊,哪部分進入模塊。我看了一些關於課程的信息。那麼,我想你是對的,因爲我必須使用和學習處理類?!你會如此善良,你能告訴我如何在VBA-Excel中添加一個類嗎?我stil發現代碼不工作,並假設它不應該。如果你可以再次查看代碼,如果它不花你太多時間,這將是很好的。 R – user1113953

+0

+1 - 很好的使用VBA類,經常被忽視 – JMax

1

下提出soluton(根據您的VBA標籤)。

  1. 創建從3個單個陣列的2D陣列(如由Jesse建議的)
  2. 使用Redim Preserve到第四數據集「NewData」添加到2D陣列「ArrayMaster」
  3. 創建臨時工作表,轉儲「ArrayMaster」到它,排序由「Newdata」(升序)來創建一個排序後的數組,「ArrayMaster2」
  4. 刪除工作表

Excel是在分揀非常有效的,所以這種方法對於排序(或多級排序)

你可以使用一個bubble sort的技術,如果Excel中WASN提供了一個簡單,快捷的方式't可用於紙張轉儲/排序

Option Base 1 
Sub ComboArray() 
Dim ws As Worksheet 
Dim Array1() 
Dim Birthday() 
Dim ID() 
Dim NewData() 
Dim ArrayMaster() 
Dim ArrayMaster2() 
Dim lngRow As Long 
Dim lngCalc As Long 
Dim lngCheck As Long 

Birthday = Array(1998, 1923, 1983, 1982, 1924, 1923, 1954) 
Array1 = Array("John", "Christina", "Mary", "frediric", "Johnny", "billy", "mariah") 
ID = Array(12312321, 1231231209, 123123, 234324, 23423, 2234234, 932423) 
ReDim ArrayMaster(1 To UBound(Array1, 1), 1 To 3) 

'Create 2D MasterArray 
For lngRow = 1 To UBound(Array1, 1) 
    ArrayMaster(lngRow, 1) = Array1(lngRow) 
    ArrayMaster(lngRow, 2) = Birthday(lngRow) 
    ArrayMaster(lngRow, 3) = ID(lngRow) 
Next 

NewData = Array(1, 3, 5, 7, 2, 4, 6) 

'Check if new field is longer than overall array 
If UBound(NewData, 1) > UBound(ArrayMaster, 1) Then 
lngCheck = MsgBox("New field exceeds current array size, proceeding will drop off excess records" & vbNewLine & "(Press Cancel to end code)", vbOKCancel, "Do you want to proceed?") 
If lngCheck = vbCancel Then Exit Sub 
End If 

'Add NewData field 
ReDim Preserve ArrayMaster(UBound(ArrayMaster, 1), UBound(ArrayMaster, 2) + 1) 
For lngRow = 1 To UBound(NewData, 1) 
    ArrayMaster(lngRow, UBound(ArrayMaster, 2)) = NewData(lngRow) 
Next 
With Application 
    .ScreenUpdating = False 
    .DisplayAlerts = False 
    lngCalc = .Calculation 
End With 

'Create working sheet, dump MasterArray and sort by Newdata (position 4 = cell D1) 
Set ws = Worksheets.Add 
ws.[a1].Resize(UBound(ArrayMaster, 1), UBound(ArrayMaster, 2)).Value2 = ArrayMaster 
ws.UsedRange.Sort ws.[d1], xlAscending 
'Create our sorted array MasterArray2, now with NewData(1,2,3,4,5,6,7) 
ArrayMaster2 = ws.[a1].Resize(UBound(ArrayMaster, 1), UBound(ArrayMaster, 2)).Value2 
ws.Delete 

'cleanup working sheet 
With Application 
    .ScreenUpdating = True 
    .DisplayAlerts = True 
    .Calculation = lngCalc 
End With 
End Sub 
+0

非常感謝!我將使用這種方法進行排序任務! 正如我所說,它與我無關的時間貫穿它。只是在「ArrayMaster(lngRow,UBound(ArrayMaster,2)+ 1)= NewData(lngRow)」我發現+1實現後需要給出一個超出界限的錯誤。 謝謝大家的回覆,我相信它也會對其他人有所幫助 – user1113953

+0

@ user1113953沒有probs。我已將修改的行修復爲'ArrayMaster(lngRow,UBound(ArrayMaster,2))= NewData(lngRow)' - 這對我來說是一個糟糕的早期編輯。 +1正在從早期的redim複製。 – brettdj

+1

順便說一句,歡迎來到stackoverflow,如果這個答案適合你,請點擊答案左邊的勾號接受它 - 請參閱meta.stackoverflow.com/questions/5234/...以獲取更多信息 – brettdj

相關問題