MS Visual Basic如何排序1个数组并返回第二个数组的索引?

时间:2011-12-23 20:40:41

标签: sorting vba excel-vba indexing excel

我正在寻找的语言是MS Visual Basic。

如何对数组进行排序并相应地更改其他数组(使用索引?) 我正在寻找,但无法找到任何东西。非常感谢任何帮助!!!

e.g。对数组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 个答案:

答案 0 :(得分:3)

你应该创建一个类来保存值,将类的集合放入List中,然后使用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

答案 1 :(得分:1)

下面提出的解决方案(基于您的VBA标签)。

  1. 从3个单独的数组创建一个2D数组(由Jesse建议)
  2. 使用Redim Preserve将第四个数据集“NewData”添加到2D数组“ArrayMaster”
  3. 创建一个临时工作表,向其转储“ArrayMaster”,按“Newdata”(升序)排序以创建排序数组“ArrayMaster2”
  4. 删除工作表
  5. Excel在排序方面非常有效,因此这种方法为排序(或多级排序)提供了一种简单快捷的方法

    如果Excel无法用于工作表转储/排序

    ,则可以使用bubble sort技术
    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