excel 对一维日期数组进行排序

kdfy810k  于 2023-01-31  发布在  其他
关注(0)|答案(1)|浏览(157)

我想对只包含日期值的数组进行排序。
我需要数组上限中的最新日期:

Function vba_sort_array_a_to_z(ByRef myArray)
    Dim i As Integer
    Dim j As Integer
    Dim Temp As String
    
    'sorting array from A to Z
    For i = LBound(myArray) To UBound(myArray)
        For j = i + 1 To UBound(myArray)
            If UCase(myArray(i)) > UCase(myArray(j)) Then
                Temp = myArray(j)
                myArray(j) = myArray(i)
                myArray(i) = Temp
            End If
        Next j
    Next i
End Function

排序前的伪数组:

期望“12.04.2022”排序到数组的上限:

Sub sortThisArray()
    Dim vDate() As Date: ReDim vDate(0 To 2)
    vDate(0) = "25.03.2022"
    vDate(1) = "12.04.2022"
    vDate(2) = "14.02.2022"
    Call vba_sort_array_a_to_z(vDate)
    Stop
End Sub

分拣后:

我假设排序算法考虑到了第一个指示符,在本例中是日期中的第几天。因此,“12”,“14”和“25”。
我唯一的想法是通过创建一个临时数组(尽可能长)来操作包含日期的整个数组,并将YYYYMMDD格式的日期值插入到临时数组中,然后对该数组进行排序,将值传输回另一个数组,并再次将其重新格式化为所需的目标日期格式。
排序后的临时数组的结果如下所示:

有没有其他方法可以做到这一点?
如果这是唯一的解决方案,我正在考虑创建一个新的函数,它只处理日期的排序。

cu6pst1q

cu6pst1q1#

问题在于,在排序例程中比较日期之前,先将日期转换为字符串,这个例程可能是为对字符串排序而编写的,它使用的函数UCase将字符串转换为大写字母(这样字符串的排序就与大小写无关了)。
所以在后台发生的是日期(内部是一个数字)被转换成字符串(一系列字节),这些字符串在比较值时使用,并且 string25.03.2022大于 string12.04.2022(因为字符2大于字符1)。
快速修复方法是删除Ucase-函数:

If myArray(i) > myArray(j) Then

但是,如果您还想对字符串使用排序例程,则可以执行如下操作

For i = LBound(myArray) To UBound(myArray)
    For j = i + 1 To UBound(myArray)
        Dim isLarger As Boolean
        If VarType(myArray(i)) = vbString Then
            isLarger = UCase(myArray(i)) > UCase(myArray(j))
        Else
            isLarger = myArray(i) > myArray(j)
        End If
        
        If isLarger Then
            Temp = myArray(j)
            myArray(j) = myArray(i)
            myArray(i) = Temp
        End If
    Next j
Next i

相关问题