excel - 列表框在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
我的用户表单的屏幕截图: 用户表单屏幕截图
解决方案
模块中数组变量的公共声明
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
因此,输出是降序排序的列表框。用户始终可以在顶部看到最新的记录时间。
推荐阅读
- android - Kotlin Coroutine 冻结 UI 线程
- javascript - VSCODE Javascript ----如何隐式导入库
- java - 在 Dao 中形成 jdbcTemplate 查询的通用方法
- php - 如何获得 1 最近对 laravel 上的帖子的评论
- artifactory - 得到这个:来自守护进程的错误响应:获取 https://.jfrog.io/v2/:拨号 tcp:查找 .jfrog.io:没有这样的主机
- php - php 致命错误:未捕获的 ValueError:DOMDocument::loadHTML()
- python - 使用 Python/SQL (pymysql) 将列/数据拆分为多个不同的表
- kotlin - 编译器异常:尽管使用了 elvis 运算符,但“重载分辨率歧义”
- java - Tomcat的默认错误页面在哪里?
- html - SVG 在 Firefox 上无法正确动画,但在 chrome 中运行良好