首页 > 解决方案 > 列表框在vba用户表单中按日期时间排序/过滤?

问题描述

我有一个带有列表框的用户表单,它显示工作表中的数据。我想让该数据按当前日期和时间显示在列表框中。因此,当用户输入新数据时,他/她会看到最新的数据行。这是为了帮助用户避免输入重复的信息。

我希望这可以通过编程方式完成,因为在不久的将来,此表单将链接到数据库而不是工作表。

这是填充我的列表框的代码:

    Private Sub UserForm_Initialize() 'Sets variables when the userform initializes

    Call MakeFormResizeable(Me)

    Me.tbDate.Value = Format(Now(), "mm/dd/yyyy hh:mm")

     With ListBox1
        .RowSource = "Table1!A3:T100"
        .ColumnCount = 20
        .ColumnHeads = True
    End With
   End Sub

当通过调用“RefreshListbox”单击保存按钮时重新加载我的列表框的代码:

   Private Sub RefreshListbox()
       With ListBox1
         .RowSource = "Table1!A3:T100"
         .ColumnCount = 20
         .ColumnHeads = True
      End With
   End Sub

我的用户表单的屏幕截图: 用户表单屏幕截图

标签: excelvbalistboxuserform

解决方案


参考日期数组排序从数组填充列表框

模块中数组变量的公共声明 Public Dtarr(1 To 8) As Date 可以在宏中重新调整数组大小以将其调整为表大小。

以下是日期表 在此处输入图像描述

在模块中添加了以下过程以对日期数组进行排序。

Sub SortAr(arr() As Date)
    Dim Temp As Date
    Dim i As Long, j As Long

    For j = 2 To UBound(arr)
        Temp = arr(j)
        For i = j - 1 To 1 Step -1
            If (arr(i) >= Temp) Then GoTo 10
' ">" sorts in descending order.
' "<" sorts in ascending order.
                arr(i + 1) = arr(i)
        Next i
        i = 0
10:         arr(i + 1) = Temp
    Next j
End Sub

在用户表单中添加了以下过程

Private Sub UserForm_Initialize()
Dim Sh As Worksheet
Set Sh = ThisWorkbook.Worksheets("Sheet2")

For i = 1 To 8
Dtarr(i) = Sh.Range("A" & i + 3).Value
Next

SortAr Dtarr
ListBox1.List = Dtarr

End Sub

因此,输出是降序排序的列表框。用户始终可以在顶部看到最新的记录时间。

在此处输入图像描述

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

根据您在下面的评论编辑答案

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

以下是 A1:T13 中的示例数据。

在此处输入图像描述

以下是用户表单代码。您可以在用户表单代码中指定数据范围 ( arrData)。

Private Sub UserForm_Initialize()

Set Sh = ThisWorkbook.Worksheets("Sheet1")
Set AllData = Sh.Range("A1").CurrentRegion
x = AllData.Rows.Count - 1: y = AllData.Columns.Count
Set ListData = AllData.Offset(1, 0).Resize(x, y)

ReDim Dtarr(1 To x, 1 To y)
Dtarr = ListData.Value

Sort2DArr Dtarr, 2 'Second column as you need to sort on Column B

With ListBox1
    .List = Dtarr
    .ColumnCount = y
    .ColumnWidths = "25;100;25;25;25;25;25;25;25;25;25;25;25;25;25;25;25;25;25;25"
End With
End Sub

以下是对 Dtarr 进行排序的 Module1 代码。请注意Public Dtarr()在代码中

Option Base 1
Public Sh As Worksheet
Public AllData As Range
Public ListData As Range
Public x As Long
Public y As Long
Public Dtarr()



Sub Sort2DArr(arr(), srtCol As Long)

Dim temp As Date, temparr, srtColArr, temp2 As String
Dim i As Long, j As Long

ReDim temparr(x)
srtColArr = WorksheetFunction.Index(arr, 0, srtCol)
For i = 1 To x
    temparr(i) = Join(Application.Index(arr, i, 0), "~")
Next

temparr = Application.Transpose(temparr)

For j = 2 To x
    temp = srtColArr(j, 1)
    temp2 = temparr(j, 1)
    For i = j - 1 To 1 Step -1
        If (srtColArr(i, 1) >= temp) Then GoTo 10
        ' ">" sorts in descending order.
        ' "<" sorts in ascending order.
        srtColArr(i + 1, 1) = srtColArr(i, 1)
        temparr(i + 1, 1) = temparr(i, 1)
    Next i
        i = 0
10:     srtColArr(i + 1, 1) = temp
        temparr(i + 1, 1) = temp2
    Next j

ReDim Dtarr(1 To x + 1, 1 To y)

For i = 1 To y
    Dtarr(1, i) = AllData(1, i).Value
Next
For i = 2 To x + 1
    tempRow = Split(temparr(i - 1, 1), "~")
    For j = 1 To y
    Dtarr(i, j) = tempRow(j - 1)
    Next
Next
End Sub

因此,输出是降序排序的列表框。用户始终可以在顶部看到最新的记录时间。

在此处输入图像描述


推荐阅读