我想对只包含日期值的数组进行排序。
我需要数组上限中的最新日期:
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格式的日期值插入到临时数组中,然后对该数组进行排序,将值传输回另一个数组,并再次将其重新格式化为所需的目标日期格式。
排序后的临时数组的结果如下所示:
有没有其他方法可以做到这一点?
如果这是唯一的解决方案,我正在考虑创建一个新的函数,它只处理日期的排序。
1条答案
按热度按时间cu6pst1q1#
问题在于,在排序例程中比较日期之前,先将日期转换为字符串,这个例程可能是为对字符串排序而编写的,它使用的函数
UCase
将字符串转换为大写字母(这样字符串的排序就与大小写无关了)。所以在后台发生的是日期(内部是一个数字)被转换成字符串(一系列字节),这些字符串在比较值时使用,并且 string
25.03.2022
大于 string12.04.2022
(因为字符2
大于字符1
)。快速修复方法是删除
Ucase
-函数:但是,如果您还想对字符串使用排序例程,则可以执行如下操作