Vba 按日期对多列列表框排序(dd/mm/yyyy)

Vba 按日期对多列列表框排序(dd/mm/yyyy),vba,date,sorting,listbox,Vba,Date,Sorting,Listbox,我有一个使用以下代码填充的多列列表框: Plybooks.ListBox1.ColumnCount = 5 Plybooks.ListBox1.ColumnWidths = "200;200;150;100;60" If Plybooks.OptionButton12.Value = True Then For Idx = 0 To 9 For Each MyCell In AllAreas(Idx).Cells If InS

我有一个使用以下代码填充的多列列表框:

Plybooks.ListBox1.ColumnCount = 5
Plybooks.ListBox1.ColumnWidths = "200;200;150;100;60"

If Plybooks.OptionButton12.Value = True Then
    For Idx = 0 To 9
        For Each MyCell In AllAreas(Idx).Cells
            If InStr(1, MyCell.Value, "(FS)") > 0 Then
                Plybooks.ListBox1.AddItem
                Plybooks.ListBox1.List(I, 0) = MyCell.Offset(, -1).Value
                Plybooks.ListBox1.List(I, 1) = MyCell.Value
                Plybooks.ListBox1.List(I, 2) = MyCell.Offset(, 2).Value
                Plybooks.ListBox1.List(I, 3) = MyCell.Offset(, 3).Value
                Plybooks.ListBox1.List(I, 4) = Application.WorksheetFunction.Transpose(MyArray)
                Plybooks.ListBox1.List(I, 4) = MyCell.Offset(, 4).Value
                I = I + 1
            End If
        Next MyCell
    Next Idx
我使用
Application.WorksheetFunction.Transpose(MyArray)
设置第5列的格式:dd/mm/yyyy。这很管用,但当我试图在这个日期之前对列表框数据进行排序时,问题就出现了。我使用的是冒泡排序,如下所示。这一方法的工作原理与它对日期的正确排序相同,但不考虑月份或年份。因此,这些数据被分类为:

2020年10月5日

2020年11月6日

2020年11月7日

2020年10月8日

2020年9月9日

    Dim j As Long
    Dim temp1 As Variant
    Dim temp2 As Variant
    Dim temp3 As Variant
    Dim temp4 As Variant
    Dim temp0 As Variant
    With Plybooks.ListBox1
        For j = LBound(.List) To UBound(.List) - 1
            For I = j To UBound(.List) - 1
                If .List(I, 4) < .List(j, 4) Then
                    temp1 = .List(I, 1)
                    .List(I, 1) = .List(j, 1)
                    .List(j, 1) = temp1
                    temp2 = .List(I, 2)
                    .List(I, 2) = .List(j, 2)
                    .List(j, 2) = temp2
                    temp3 = .List(I, 3)
                    .List(I, 3) = .List(j, 3)
                    .List(j, 3) = temp3
                    temp4 = .List(I, 4)
                    .List(I, 4) = .List(j, 4)
                    .List(j, 4) = temp4
                    temp0 = .List(I, 0)
                    .List(I, 0) = .List(j, 0)
                    .List(j, 0) = temp0
                End If
            Next I
        Next j
    End With
Dim j尽可能长
Dim temp1作为变体
Dim temp2作为变体
Dim temp3作为变体
Dim temp4作为变体
Dim temp0作为变体
使用Plybooks.ListBox1
对于j=LBound(.List)到UBound(.List)-1
对于I=j到UBound(.List)-1
如果.List(I,4)<.List(j,4),则
temp1=.List(I,1)
.List(I,1)=.List(j,1)
.列表(j,1)=临时1
temp2=.List(I,2)
.List(I,2)=.List(j,2)
.List(j,2)=temp2
temp3=.List(I,3)
.List(I,3)=.List(j,3)
.List(j,3)=temp3
temp4=.List(I,4)
.List(I,4)=.List(j,4)
.List(j,4)=temp4
temp0=.List(I,0)
.List(I,0)=.List(j,0)
.List(j,0)=temp0
如果结束
接下来我
下一个j
以

我需要一个正确排序到日期的解决方案,最接近的日期位于列表框顶部。

在比较这两个日期之前,您需要将它们转换为真实的日期值。此外,您的
For/Next
循环似乎设置得不太正确。试试下面的

Dim date1 As Variant
Dim date2 As Variant
Dim temp As Variant
Dim arr() As String
Dim i As Long
Dim j As Long
Dim k As Long

With Plybooks.ListBox1
    For i = LBound(.List) To UBound(.List) - 1
        For j = i + 1 To UBound(.List)
            date1 = .List(i, 4)
            If IsDate(date1) Then
                arr = Split(date1, "/")
                date1 = DateSerial(arr(2), arr(1), arr(0))
            End If
            date2 = .List(j, 4)
            If IsDate(date2) Then
                arr = Split(date2, "/")
                date2 = DateSerial(arr(2), arr(1), arr(0))
            End If
            If date1 < date2 Then
                For k = 0 to 4
                    temp = .List(i, k)
                    .List(i, k) = .List(j, k)
                    .List(j, k) = temp
                Next k
            End If
        Next j
    Next i
End With
Dim date1作为变量
Dim date2作为变体
变光温度
Dim arr()作为字符串
我想我会坚持多久
Dim j尽可能长
暗k一样长
使用Plybooks.ListBox1
对于i=LBound(.List)到UBound(.List)-1
对于j=i+1到UBound(.List)
date1=.List(i,4)
如果是IsDate(日期1),则
arr=拆分(日期1,“/”)
date1=DateSerial(arr(2)、arr(1)、arr(0))
如果结束
date2=.List(j,4)
如果是IsDate(日期2),则
arr=拆分(日期2,“/”)
date2=日期序列(arr(2)、arr(1)、arr(0))
如果结束
如果date1
谢谢您的回复,但这里有一些问题。首先,如果不是date列中的所有数据都是date,那么我会得到一个类型不匹配错误。对于我的数据,有时会出现这种情况,所以我想我需要一个IF语句在排序之前检查数据是否为日期格式。但是为了测试这段代码,我伪造了数据以删除非日期,仍然在
.List(I,k)=.List(j,k)
上出现“无法设置列表属性.类型不匹配”错误。最后一个问题是,这似乎将我的数据转换为mm/dd/yyyy格式,而源数据实际上是dd/mm/yyyy格式。我已经修改了代码,以便它首先检查值是否可以转换为日期。如果是,则将值转换为日期。否则,该值保持不变。然后比较这些值进行排序。它仍然不喜欢
.List(i,k)=.List(j,k)
,当您单击Debug并高亮显示该行时,我得到“无法设置列表属性。键入不匹配”,将光标移动到每个列表属性上。为每个项显示哪些值?可能是因为源数据包含错误值,然后在排序过程中,它试图在交换期间为列表项分配错误值。如果是这种情况,我建议您确保用适当的文本值替换源数据中的所有错误值。例如,错误值#N/A可以替换为字符串值“#N/A”,即错误值#DIV/0!可以替换为空白/空字符串(“”),依此类推。