Ошибка Listbox.List (i) - метод или элемент данных не найдены - PullRequest
0 голосов
/ 11 ноября 2019

Я пытаюсь использовать список с несколькими вариантами выбора, чтобы пользователи могли выбирать задачи очистки, которые они выполнили, и отмечать их как выполненные. Зацикливаясь по списку, я хочу посмотреть, выбран ли элемент, и создать запись, если это так. Когда я пытаюсь использовать метод .List для возврата данных из определенной строки, я получаю сообщение об ошибке «метод не найден».

Изначально у меня не было загруженной библиотеки форм 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

enter image description here

Есть идеи?

Ответы [ 2 ]

2 голосов
/ 11 ноября 2019

Используйте .listCleaningTasks.ItemData(r) для извлечения значения связанного столбца из строки, указанной индексом.
Используйте .listCleaningTasks.Column(c, r) для извлечения значения, указанного индексами столбца и строки.

Открывайте и закрывайте набор записей только один раз, внеloop.

На самом деле просто нужно пройтись по выбранным элементам, а не по всему списку.

    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

0 голосов
/ 12 ноября 2019

Конечно, решение от 7 июня верное. Если вам нужно сохранить выбранные элементы, а затем вызвать и повторно выбрать элементы списка, попробуйте разделить запятую выбранных элементов с помощью этой функции

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

Сохраните ее в одном столбце таблицы ипрочитав его обратно, передайте его этому подпункту:

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

Это позволит выбрать элементы в вашем ListBox такими, какими они были раньше.

...