【问题标题】:Sort multiple arrays using a sort by date function使用按日期排序函数对多个数组进行排序
【发布时间】:2019-01-11 22:17:13
【问题描述】:

我有三个数组,DueDateArr、MilestoneDollarsArr、MilestoneNameArr。 我希望按时间顺序对 DueDateArr 进行排序,并使用相同的排序过程也以相同的顺序对其他数组进行排序。我将How can I sort dates in an array in vba? 与其他数组排序部分一起使用,但这似乎无法正常工作。在输出中一切正常,除了第一个条目是错误的日期。

或者,如果可能的话,我想使用它们在 java 中拥有的链表之类的东西,它是具有不同变量类型的可排序多维数组。

数据如下: 排序后的数据如下:(注意第一个输入不正确)

Dim TotalCountMinusOneForArrays as Integer
Dim DueDateArr() As Date
Dim MilestoneDollarsArr() As Double
Dim MilestoneNameArr() As String
Dim DueDateValue As Date
Dim MilestoneNameValue As String
Dim DueDateInfo As Date
Dim MilestoneDollarsInfo As Double
Dim MilestoneNameInfo As String
Dim i As Long, j As Long


i = 0
j = 0

For j = 2 To TotalCountMinusOneForArrays
    DueDateInfo = DueDateArr(j)
    MilestoneDollarsInfo = MilestoneDollarsArr(j)
    MilestoneNameInfo = MilestoneNameArr(j)

    For i = j - 1 To 1 Step -1
        If (DueDateArr(i) <= DueDateInfo) Then GoTo Sort
            DueDateArr(i + 1) = DueDateArr(i)
            MilestoneDollarsArr(i + 1) = MilestoneDollarsArr(i)
            MilestoneNameArr(i + 1) = MilestoneNameArr(i)
    Next i
    i = 0
Sort:   DueDateArr(i + 1) = DueDateInfo
    MilestoneDollarsArr(i + 1) = MilestoneDollarsInfo
    MilestoneNameArr(i + 1) = MilestoneNameInfo
    Next j

【问题讨论】:

    标签: vba sorting ms-access


    【解决方案1】:

    简单的方法是首先使用内置排序功能以编程方式对数据进行排序,然后填充数组。但是,当这不是一个选项时,两个流行的解决方案是 Bubble SortMerge Sort

    冒泡排序是最容易应用的:

    Do Until bSort = False
        bSort = False
        For i = 0 to UBound(ArrToSort) - 1
            If ArrToSort(i + 1) < ArrToSort(i) Then
                tempVal = ArrToSort(i)
                ArrToSort(i) = ArrToSort(i + 1)
                ArrToSort(i + 1) = tempVal
                bSort = True
            End If
        Next i
    Loop
    

    对于您的情况,如果您想多维而不是使用多个数组,您可以这样做

    Do Until bSort = False
        bSort = False
        For i = 0 to UBound(ArrToSort) - 1
            If CDate(ArrToSort(i + 1, 1)) < CDate(ArrToSort(i, 1)) Then
                for i2 = 1 to 3
                    tempVal(1, i2) = ArrToSort(i, i2)
                    ArrToSort(i, i2) = ArrToSort(i + 1, i2)
                    ArrToSort(i + 1) = tempVal(1, i2)
                next i2
                bSort = True
            End If
        Next i
    Loop
    

    ArrToSort(i, 1) 是多维数组中的日期数据。

    编辑:

    值得一提的是,据我所知,除了提供的方法之外,没有快速方法可以在 excel VBA 中对数组进行排序。

    编辑 2:

    在冒泡排序中数组的日期值周围添加了CDate()

    【讨论】:

    • 我尝试了冒泡排序,但排序似乎不适用于日期。
    • 您是否尝试在日期值周围添加 CDate()?我可以看到它们不是典型的日期格式,因此您可能必须在数组填充过程中以编程方式调整它们。
    • 我已将其添加到我的答案中。
    猜你喜欢
    • 1970-01-01
    • 2016-10-31
    • 2019-10-05
    • 1970-01-01
    • 2018-02-09
    • 1970-01-01
    • 2013-11-30
    相关资源
    最近更新 更多