【问题标题】:Listbox.List(i) error - Method or Data Member not FoundListbox.List(i) 错误 - 未找到方法或数据成员
【发布时间】:2020-03-07 09:37:51
【问题描述】:

我正在尝试使用多选列表框,以便用户可以选择他们已完成的清洁任务并将其标记为已完成。在遍历列表时,我想查看是否选择了该项目,如果是,则创建一条记录。当我尝试使用 .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

有什么想法吗?

【问题讨论】:

  • 请发布代码,而不是您的代码图片。
  • 请不要张贴代码图片。这使得它不仅难以阅读,而且我们无法复制它来创建测试文件和调试/尝试解决方案。请edit您的问题并粘贴到您的实际代码中,使用`标签对其进行格式化。
  • 为了回答你的问题,.list 部分完全是多余的。 .listCleaningTasks 是对您的列表的直接引用,因此.listCleaningTasks(i) 将是对该列表中任何一个成员的直接引用。
  • Access 表单是文档模块(与 Excel 中的工作簿/工作表模块相同),它们与 MSForms 库完全无关。
  • 我尝试了 Plutian 关于 .listCleaningTasks(i) 的建议并得到了类型不匹配错误。 June7 下面关于使用 .ItemData 而不是 .List 的建议对我有用。

标签: vba ms-access listbox


【解决方案1】:

使用.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

【讨论】:

  • 谢谢! .ItemData 是我正在寻找的缺失方法。这就像一个魅力。
【解决方案2】:

当然June7的解法是正确的。如果您需要存储选中的项目,然后再调用并重新选择列表框项目,请考虑使用此功能获取选中的项目逗号分隔

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 中的项目。

【讨论】:

  • 再一次,无需遍历列表框的所有项目来构建 CSV 或保存每个选定的项目,只需遍历 ItemsSelected。无需保存 CSV - 可以从已保存记录的记录集中重建列表框选择。无论哪种方式,设置选择都需要循环显示您显示的所有项目。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-26
  • 2017-05-04
  • 2020-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多