Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting MS Visual Basic如何排序1个数组并返回第二个数组的索引?_Sorting_Vba_Excel_Indexing - Fatal编程技术网

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

Sorting MS Visual Basic如何排序1个数组并返回第二个数组的索引?,sorting,vba,excel,indexing,Sorting,Vba,Excel,Indexing,我正在寻找的语言是MS Visual Basic 如何对数组进行排序并相应地更改其他数组(使用索引?) 我在找,但找不到那上面的任何东西。非常感谢您的帮助 e、 g.对数组BirthArray进行排序,并相应地更改数组1和ID的顺序 Array1 = 'John', 'Christina','Mary', 'frediric', 'Johnny','billy','mariah' BirthArray = 1998, 1923, 1983,1982,1924,1923,1954 ID = 1

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

如何对数组进行排序并相应地更改其他数组(使用索引?) 我在找,但找不到那上面的任何东西。非常感谢您的帮助

e、 g.对数组BirthArray进行排序,并相应地更改数组1和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

非常感谢

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

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

建议的解决方案如下(基于VBA标记)

  • 从3个单个阵列创建二维阵列(如Jesse所建议)
  • 使用
    Redim Preserve
    将第四个数据集“NewData”添加到二维数组“ArrayMaster”
  • 创建临时工作表,将“ArrayMaster”转储到其中,按“Newdata”(升序)排序,以创建已排序的数组“ArrayMaster2”
  • 删除工作表
  • Excel在排序方面非常有效,因此该方法为排序(或多级排序)提供了一种简单快捷的方法

    如果Excel不可用于图纸转储/排序,则可以使用一种技术

    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
    

    建议的解决方案如下(基于VBA标记)

  • 从3个单个阵列创建二维阵列(如Jesse所建议)
  • 使用
    Redim Preserve
    将第四个数据集“NewData”添加到二维数组“ArrayMaster”
  • 创建临时工作表,将“ArrayMaster”转储到其中,按“Newdata”(升序)排序,以创建已排序的数组“ArrayMaster2”
  • 删除工作表
  • Excel在排序方面非常有效,因此该方法为排序(或多级排序)提供了一种简单快捷的方法

    如果Excel不可用于图纸转储/排序,则可以使用一种技术

    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
    

    抱歉,为什么不使用二维数组并对其进行一次排序呢?上的此页可能会有所帮助。嗨,应该已经有三维了,我想稍后添加更多列表/属性。我同意Jesse的观点。您可以使用
    Redim Preserve
    在以后根据需要为数据集添加更多宽度对不起,为什么不使用二维数组并对其进行一次排序?上的此页可能会有所帮助。嗨,应该已经有三维了,我想稍后添加更多列表/属性。我同意Jesse的观点。您可以使用
    Redim Preserve
    在以后根据需要为数据集添加更多宽度谢谢您的快速回答!有没有更简单的方法,我必须添加一个类?对我来说,在节目中表现并不重要。对于类,我想知道哪些部分必须进入类模块,哪些部分必须进入模块。我看了一些关于课程的信息。好吧,我想你是对的,我必须使用和学习处理课程?!您能告诉我如何在VBA Excel中添加一个类吗?我仍然发现代码不起作用,并且认为它不应该起作用。如果你能再次检查代码,如果它不会花费你太多的时间,那就太好了。谢谢你的快速回答!有没有更简单的方法,我必须添加一个类?对我来说,在节目中表现并不重要。对于类,我想知道哪些部分必须进入类模块,哪些部分必须进入模块。我看了一些关于课程的信息。好吧,我想你是对的,我必须使用和学习处理课程?!您能告诉我如何在VBA Excel中添加一个类吗?我仍然发现代码不起作用,并且认为它不应该起作用。如果你能再次检查代码,如果它不会花费你太多的时间,那就太好了。非常感谢!我将使用此方法进行排序任务!正如我所说的,这与我花在阅读上的时间无关。就在“ArrayMaster(lngRow,UBound(ArrayMaster,2)+1)=NewData(lngRow)”中,我发现+1需求在我实现它之后给出了一个越界错误。谢谢你们的回复,我相信这对其他人也有帮助well@user1113953没问题。我已将有问题的行修复为
    ArrayMaster(lngRow,UBound(ArrayMaster,2))=NewData(lngRow)
    -这是代表我的一个糟糕的早期编辑。+1是从之前的redim.btw复制过来的,欢迎来到stackoverflow,如果这个答案适合你,请点击答案左边的勾号来接受它-有关更多信息,请参阅meta.stackoverflow.com/questions/5234/…非常感谢!我将使用此方法进行排序任务!正如我所说的,这与我花在阅读上的时间无关。就在“ArrayMaster(lngRow,UBound(ArrayMaster,2)+1)=NewData(lngRow)”中,我发现+1需求在我实现它之后给出了一个越界错误。谢谢你们的回复,我相信这对其他人也有帮助well@user1113953没问题。我已将有问题的行修复为
    ArrayMaster(lngRow,UBound(ArrayMaster,2))=NewData(lngRow)
    -这是代表我的一个糟糕的早期编辑。+1是从之前的redim.btw复制的,欢迎来到stackoverflow,如果这个答案适合你,请点击答案左侧的勾号接受它-有关更多信息,请参阅meta.stackoverflow.com/questions/5234/