尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

实现丝滑无卡顿的数据分页效果Listbox

实现丝滑无卡顿的数据分页效果Listbox 目录1.效果演示2.使用场景3.功能介绍4.实现原理5.文件下载6.完整源码1.效果演示2.使用场景大部分VBA用户在刚入门时都会自然而然地接触到数据分页问题。很可能的原因是内置Listbox控件在搭载大量数据时较为卡顿抑或是扩展控件Listview在使用时难以上手更有可能是暂时还没接触到虚拟列表这个东西。当然这些都是猜测大家可以讲讲自己是因为什么才接触到数据分页的。客观而言数据分页效果在实现起来十分考验使用者对各类控件的灵活运用能力没有一定的思维逻辑和控件基础还真的很难写出来。从使用场景来看数据分页功能主要面向以下几类VBA开发者适合新入门的VBA用户研究Listbox新玩法适合想做数据分页效果的用户借鉴思路适合想要提升UserForm交互体验的进阶用户3.功能介绍窗体在显示时将活动表格的数据分页加载到Listbox中默认将第一行作为标题数据源自动识别为A1单元格的邻近区域快速分页显示大批量数据灵活切换每页的数据量一键跳转到指定页实时显示当前页和总页数4.实现原理直接给代码倒不如讲清实现原理当用户点击“下一页”或“上一页”按钮时代码会动态计算需要显示的数据行范围并直接从工作表中读取该范围内的数据再赋值给Listbox的List属性。这种方法避免了将所有数据一股脑加载到内存中的情况从而显著降低了内存占用和初始加载的卡顿感。同时由于每次只加载一页数据即便数据源有成千上万行Listbox的响应速度依然能保持流畅不会出现界面冻结的现象。这种按需加载的机制使得分页功能的代码量得以控制在百行以内同时兼顾了性能与易用性真正实现了轻量高效的Listbox数据分页解决方案。5.文件下载直接附上源码文件链接不需要提取码。https://pan.baidu.com/s/1OCAqpzwIbeW_wEtZ6MDZvw?pwdiq3w6.完整源码如果不想使用链接体验你还可以手动新建窗体并参照以下步骤操作。新建窗体UserForm1添加控件ListBox1、SpinButton1、ComboBox1、TextBox1和TextBox2。将以下完整代码复制到窗体UserForm1中即可运行。Private Title As Variant 数据源标题行数组 Private CurrentData As Variant 当前列表显示的数据数组 Private DataRows As Long 数据源最大行数 Private DataColumns As Long 数据源最大列数 Private Sub UserForm_Initialize() 在活动表下 With ActiveSheet 获取数据源最大行数和列数 DataRows .Range(A1).CurrentRegion.Rows.Count DataColumns .Range(A1).CurrentRegion.Columns.Count 获取标题行内容 If DataColumns 1 Then ReDim Title(1 To 1, 1 To 1) Title(1, 1) .Range(.Cells(1, 1), .Cells(1, DataColumns)).Value Else Title .Range(.Cells(1, 1), .Cells(1, DataColumns)).Value End If End With 设置每页可选行数量 Me.ComboBox1.AddItem 10 Me.ComboBox1.AddItem 20 Me.ComboBox1.AddItem 30 Me.ComboBox1.AddItem 50 指定每页行数量 Me.ComboBox1.Value 10 指定控件位置 Me.SpinButton1.Top Me.ListBox1.Top Me.ListBox1.Height 4 Me.TextBox1.Top Me.ListBox1.Top Me.ListBox1.Height 4 Me.TextBox2.Top Me.ListBox1.Top Me.ListBox1.Height 4 End Sub Private Sub UserForm_Terminate() 释放数组 Erase Title Erase CurrentData End Sub Private Sub ComboBox1_Change() 设置可调节范围 Me.SpinButton1.Min 1 Me.SpinButton1.Max ((DataRows - 1) Me.ComboBox1.Value - 1) \ Me.ComboBox1.Value If Me.SpinButton1.Max 0 Then Me.SpinButton1.Max 1 加载列表数据 LoadData End Sub Private Sub SpinButton1_SpinDown() 加载列表数据 LoadData End Sub Private Sub SpinButton1_SpinUp() 加载列表数据 LoadData End Sub Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) 按下回车键时 If KeyCode vbKeyReturn Then 仅当输入数字时仅当在可调节范围内时 If IsNumeric(Me.TextBox1.Value) And Me.TextBox1.Value Me.SpinButton1.Min And Me.TextBox1.Value Me.SpinButton1.Max Then 更改当前页索引 Me.SpinButton1.Value Me.TextBox1.Value 加载列表数据 LoadData End If End If End Sub Private Sub LoadData() 在活动表下 With ActiveSheet 获取当前页对应在数据源中的行索引范围m, n Dim m: m Me.ComboBox1.Value * (Me.SpinButton1.Value - 1) 2 Dim n: n Me.ComboBox1.Value * Me.SpinButton1.Value 1 If n DataRows Then n DataRows If m DataRows Then m DataRows 当仅有标题行时 Dim Temp As Variant If n 1 And m 1 Then 重定义列表数组 ReDim CurrentData(1 To 1, 1 To DataColumns) 获取数据行内容 ReDim Temp(0 To 0, 0 To 0) 当数据行数量等于页数时 ElseIf n - m 1 Me.ComboBox1.Value Then 重定义列表数组 ReDim CurrentData(1 To 1 Me.ComboBox1.Value, 1 To DataColumns) 获取数据行内容 Temp .Range(.Cells(m, 1), .Cells(n, DataColumns)).Value 当数据行数量小于页数时 Else 重定义列表数组 ReDim CurrentData(1 To 1 n - m 1, 1 To DataColumns) 获取数据行内容 Temp .Range(.Cells(m, 1), .Cells(n, DataColumns)).Value End If 列表数组的标题行赋值 For i LBound(Title, 1) To UBound(Title, 1) For j LBound(Title, 2) To UBound(Title, 2) CurrentData(i, j) Title(i, j) Next Next 列表数组的数据行赋值 If LBound(Temp, 1) 0 Then For i LBound(Temp, 1) To UBound(Temp, 1) For j LBound(Temp, 2) To UBound(Temp, 2) CurrentData(1 i, j) Temp(i, j) Next Next End If 指定列表列数 Me.ListBox1.ColumnCount DataColumns 显示列表数组 Me.ListBox1.List CurrentData 显示所在页提示 Me.TextBox1.Value Me.SpinButton1.Value Me.TextBox2.Value Me.SpinButton1.Value / Me.SpinButton1.Max 释放数组 Erase Temp End With End Sub
返回列表