'listbox分页类 为listbox添加分页功能 指定数据源
'需要listbox配合有 上一页 下一页按钮 一个页码显示文本框 一个总页码标签
Public WithEvents listboxPage As MSForms.ListBox '列表框
Public WithEvents cmdUp As MSForms.CommandButton '上一页
Public WithEvents cmdDown As MSForms.CommandButton '下一页
Public WithEvents tbPage As MSForms.TextBox '页码文本框
Public WithEvents lbPages As MSForms.Label '总页码标签
Private 当前页, 单页行数, 总页数, 上次页码
Private 源数据 '源数据
Sub init(tarr, tpageRow, tlistboxPage, tcmdUp, tcmdDown, ttbPage, tlbPages, Optional lstWidth = "")
'数据初始化
源数据 = tarr
单页行数 = tpageRow
Set listboxPage = tlistboxPage
Set cmdUp = tcmdUp
Set cmdDown = tcmdDown
Set tbPage = ttbPage
Set lbPages = tlbPages
If lstWidth <> "" Then
'表名!地址
Dim crr
crr = Split(lstWidth, "!") '处理当激活别的文件时 无法引用到本表sheet名
SetListBoxWidth listboxPage, ThisWorkbook.Sheets(crr(0)).Range(crr(1))
End If
''首次加载要完成的任务
总页数 = Int((UBound(源数据) - 1 + 单页行数) / 单页行数)
当前页 = 1
tbPage = 1
lbPages = " / " & 总页数
End Sub
Private Sub cmdUp_Click()
当前页 = 当前页 - 1
If 当前页 < 1 Then
当前页 = 1
Else
tbPage = 当前页
End If
End Sub
Private Sub cmdDown_Click()
当前页 = 当前页 + 1
If 当前页 > 总页数 Then
当前页 = 当前页
Else
tbPage = 当前页
End If
End Sub
Private Sub tbPage_Change()
当前页 = Val(tbPage)
If 当前页 > 0 And 当前页 <= 总页数 Then
显示第N页
Else
tb页码跳转 = 上次页码 '恢复上次页码
End If
End Sub
Sub 显示第N页()
Dim i, j, k
ReDim brr(1 To 单页行数 + 1, 1 To UBound(源数据, 2)) '单页数据数组
For j = 1 To UBound(源数据, 2) '表头放入
brr(1, j) = 源数据(1, j)
Next
k = 1 '结果行号
'本页数据填充
Dim 开始, 结束
开始 = (当前页 - 1) * 单页行数 + 2
结束 = 开始 + 单页行数 - 1
If 结束 > UBound(源数据) Then
结束 = UBound(源数据)
End If
For i = 开始 To 结束 '从源数据中取出第N页的数据
k = k + 1
For j = 1 To UBound(源数据, 2)
'If j = 5 Then Stop
brr(k, j) = 源数据(i, j)
' Debug.Print i, j, k
Next
Next
listboxPage.Clear
listboxPage.List = brr
上次页码 = 当前页
End Sub
Sub SetListBoxWidth(lst As MSForms.ListBox, rngHeader)
'设置列宽 根据单元格宽度 rngHeader
Dim i
ReDim arr(1 To rngHeader.Columns.Count)
For i = 1 To rngHeader.Columns.Count
arr(i) = rngHeader.Columns(i).ColumnWidth * 5
Next
lst.ColumnWidths = Join(arr, ";")
End Sub
''使用示范
'Dim listbox分页对象 As clsListboxPage '必须是全局对象才能绑定和触发事件
Private Sub UserForm_Initialize()
源数据 = Sheets("数据1").Range("A2:E" _
& Sheets("数据1").Cells(Rows.Count, "A").End(xlUp).Row)
Set listbox分页对象 = New clsListboxPage
listbox分页对象.init 源数据, 10, ListBox1, cmd上一页, _
cmd下一页, tb页码跳转, lb页码显示, "数据!A2:E2"
End Sub