查看: 24  |  回复: 0
  VBA代码 clsListboxPage
楼主
发表于 2025年3月18日 15:10
'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


您需要登录后才可以回帖 登录 | 立即注册
【本版规则】请勿发表违反国家法律的内容,否则会被冻结账号和删贴。
用户名: 立即注册
密码:
2020-2025 MaNongKu.com