Listbox.List(i) 错误 - 未找到方法或数据成员

Listbox.List(i) error - Method or Data Member not Found

我正在尝试使用多 select 列表框,以便用户可以 select 清理他们已完成的任务并将其标记为已完成。在遍历列表时,我想查看该项目是否被 selected,如果是,则创建一条记录。当我尝试使用 .List 方法来 return 来自特定行的数据时,我不断收到找不到方法的错误。

我最初没有加载 forms 2.0 库,所以我认为这是问题所在,但这并没有解决问题。我也进行了压实和修复,认为这可能只是一个奇怪的侥幸,但这也没有帮助。

'loop through values in listbox since its a multi-select
For i = 0 To listCleaningTasks.ListCount - 1
    If listCleaningTasks.Selected(i) Then
    'add entry to cleaning log
        Set rsCleaning = CurrentDb.OpenRecordset("SELECT * FROM cleaning_log;")
        With rsCleaning
            .AddNew
            .Fields("cleaning_task_id") = Form_frmCleaning.listCleaningTasks.List(i)
            .Fields("employee_id") = Me.cmbUser
            .Fields("cleanroom_id") = Me.cmbCleanroom
            .Fields("cleaning_time") = Now()
            .Update
            .Close
        End With
    End If
Next i

有什么想法吗?

使用.listCleaningTasks.ItemData(r)从索引指定的行中提取绑定列值。
使用 .listCleaningTasks.Column(c, r) 提取列和行索引指定的值。

只打开和关闭记录集一次,外循环。

真的只需要遍历选定的项目,而不是整个列表。

    Dim varItem As Variant
    If Me.listCleaningTasks.ItemsSelected.Count <> 0 Then
        Set rsCleaning = CurrentDb.OpenRecordset("SELECT * FROM cleaning_log")
        With rsCleaning
        For Each varItem In Me.listCleaningTasks.ItemsSelected
            `your code to create record
            ... 
            .Fields("cleaning_task_ID") = Me.listCleaningTasks.ItemData(varItem)
            ... 
        Next
        .Close
        End With
    Else
        MsgBox "No items selected.", vbInformation
    End If

June7的解当然是对的。如果您需要存储 selected 项目然后稍后调用并重新 select 列表框项目,请考虑使用此函数 [=12= 获取逗号分隔的 selected 项目]

Public Function GetSelectedItems(combo As ListBox) As String
    Dim result As String, varItem As Variant        
    For Each varItem In combo.ItemsSelected
        result = result & "," & combo.ItemData(varItem)
    Next        
    GetSelectedItems = Mid(result, 2)
End Function

将其存储到 table 的一列中,并在读回后将其传递给此子:

Public Sub CreateComboBoxSelections(combo As ListBox, selections As String)
Dim N As Integer, i As Integer
Dim selectionsArray() As String
selectionsArray = Split(selections, ",")
    For i = LBound(selectionsArray) To UBound(selectionsArray)
        With combo
            For N = .ListCount - 1 To 0 Step -1
               If .ItemData(N) = selectionsArray(i) Then
                    .Selected(N) = True
                    Exit For
               End If
            Next N
        End With
    Next i
End Sub

这将使您的列表框中的 select 项与以前一样。