如何按时间顺序放置一系列随机日期?

时间:2012-02-22 22:40:04

标签: vba time date datediff

我有一系列日期,格式如下:2005年10月15日或2/10/2011。

假设数组有10个日期,其中一些可能是重复日期。

arrDates(9)'元素0-9代表1个日期

重新排列元素以使它们按时间顺序排列的最佳方法是什么?

3 个答案:

答案 0 :(得分:1)

最简单的方法是以YYYYMMDD格式对它们进行格式化,然后按字典顺序排列它们(按字母顺序排列,按字母顺序排列)。也许只是一个用词不当,因为我们这里只有数字,但是唉。

答案 1 :(得分:1)

首先,您应该使所有日期具有相同的长度(用0#格式替换单个数字) 你可以使用Format $函数来格式化它们

Here是如何使用它的。

然后你可以使用Array.Sort对它们进行排序

Here你是怎么做到的

修改 鲍勃是对的。数组的排序方法在vb6中不可用。所以我将链接更改为一篇文章,解释了如何自己编写快速排序算法。

答案 2 :(得分:1)

对于短列表(数组),您可以使用不可见的ListBox或伪造的ADO Recordset,或者您可以手动编写一个简短的排序例程。在您有更大的列表进行排序之前,性能通常不是一个大问题。

以下是使用临时Collection的示例。它具有与使用Recordset类似的优点,因为它可以携带多值项目,使用多维数组可以快速获得笨重的项目。要使用Collection执行此操作,您需要创建一个包含您需要携带的值(包括排序键)的小类。

这种特殊的方法可以通过使用二进制搜索代替简单的顺序搜索(这里的“J循环”)进行优化:

Option Explicit

Private Sub Form_Load()
    Dim A(9) As String, B(9) As String
    Dim I As Integer, J As Integer

    'Create some data, here we'll use String values but Date,
    'Integer, Double, whatever work as well.
    Randomize
    For I = 0 To 9
        A(I) = CStr(Fix(Rnd() * 100000))
        A(I) = Right$(String$(5, "0") & A(I), 6)
    Next

    'Sort A() as B().  Could just as easily copy the results
    'back into A() instead.
    With New Collection
        For I = 0 To UBound(A)
            For J = 1 To .Count
                If A(I) <= .Item(J) Then
                    .Add A(I), , J
                    Exit For
                End If
            Next
            If J > .Count Then .Add A(I)
        Next

        For I = 1 To .Count
            B(I - 1) = .Item(I)
        Next
    End With

    'Print before and after.
    AutoRedraw = True
    Print "A", "B"
    Print
    For I = 0 To 9
        Print A(I), B(I)
    Next
End Sub

当然,如果将某个“日期”表示为字符串值,您仍然需要将其标准化以便进行排序,就像其他人提到的那样。这里通过基于数字创建字符串值并使用前导零填充来进行标准化来模拟。