使用 ListStyle = fmListStyleOption 保留 MSForms ListBox 的内容

Persisting content of MSForms ListBox with ListStyle = fmListStyleOption

我在 VBA Excel 中创建了一个用户窗体,它有一个 ListBox,其中选择了 ListStyleOption。 MultiSelectMulti 选项被激活。 每当我关闭用户窗体或工作簿然后重新打开时,所有以前的选择都消失了。有没有办法保留在列表框中所做的选择?

谢谢。

是的,这是可能的,但您必须将列表框项目及其选定状态保存在工作簿或某些数据支持(例如文件或数据库)中。显示表单时,您只需读回已保存的项目和选定的状态。

假设您可以将列表的内容保存在工作簿中,您可以使用如下内容:

Public Sub SaveList(ByVal plstListBox As MSForms.ListBox, ByVal prngSavePoint As Excel.Range)
    On Error GoTo errHandler

    Dim lRow As Long
    Dim bScreenUpdating As Boolean
    Dim bEnableEvents As Boolean

    bScreenUpdating = Application.ScreenUpdating
    bEnableEvents = Application.EnableEvents

    Application.ScreenUpdating = False
    Application.EnableEvents = False

    prngSavePoint.CurrentRegion.Clear

    If plstListBox.ListCount > 1 Then
        For lRow = 0 To plstListBox.ListCount - 1
            prngSavePoint.Cells(lRow + 1, 1).Value = plstListBox.Selected(lRow)
            prngSavePoint.Cells(lRow + 1, 2).Value = plstListBox.List(lRow)
        Next
    End If

Cleanup:
    On Error Resume Next
    Application.EnableEvents = bEnableEvents
    Application.ScreenUpdating = bScreenUpdating
    Exit Sub

errHandler:
    MsgBox Err.Description, vbExclamation + vbOKOnly, "Error"
    Resume 'Cleanup
End Sub

Public Sub LoadList(ByVal plstListBox As MSForms.ListBox, ByVal prngSavePoint As Excel.Range)
    Dim lRow As Long
    Dim vntSavedList As Variant

    plstListBox.Clear

    If Not IsEmpty(prngSavePoint.Cells(1, 1).Value) Then
        vntSavedList = prngSavePoint.CurrentRegion.Value

        For lRow = 1 To UBound(vntSavedList, 1)
            plstListBox.AddItem vntSavedList(lRow, 2)
            plstListBox.Selected(lRow - 1) = vntSavedList(lRow, 1)
        Next
    End If
End Sub

要保存(例如,您可以在表单上有一个“保存列表”按钮),请传递对列表框的引用,以及对工作簿中某处自由区域左上角单元格的引用。请注意,代码将从这一点向下写入 2 列,并覆盖其路径中可能存在的所有内容。您还必须确保此单元格是独立的,即在任何方向上都不会紧邻其他内容。

示例:SaveList ListBox1, Sheet1.Cells(1, 1)

您的表单上可以有一个加载列表按钮。要加载列表:LoadList ListBox1, Sheet1.Cells(1, 1)

此答案中使用的重要列表框属性是 SelectedList,它们给出了列表中任何项目的选定状态和标签。这些是从零开始的索引属性。