Vba MS Access-从表中删除记录的多选列表框

Vba MS Access-从表中删除记录的多选列表框,vba,ms-access,listbox,multi-select,Vba,Ms Access,Listbox,Multi Select,我正在Windows 8上使用Access 2010。我正在寻找一种方法,使用多选列表框一次从表中删除多条记录。我在StackOverflow上看到了这篇文章,它帮助我开始: 我调整了解决方案中的代码以处理我的表和对象,但出于某种原因,它只在选择一条记录时起作用。如果我选择2条或更多记录,则不会发生任何事情。有谁能帮我看一看,看看我可能犯了什么错误 Private Sub cmdRemoveProducts_Click() Dim strSQL As String

我正在Windows 8上使用Access 2010。我正在寻找一种方法,使用多选列表框一次从表中删除多条记录。我在StackOverflow上看到了这篇文章,它帮助我开始:

我调整了解决方案中的代码以处理我的表和对象,但出于某种原因,它只在选择一条记录时起作用。如果我选择2条或更多记录,则不会发生任何事情。有谁能帮我看一看,看看我可能犯了什么错误

Private Sub cmdRemoveProducts_Click()

    Dim strSQL      As String
    Dim vItem       As Variant
    Dim strSet      As Long


    'If IsNull(lstOperationProducts) Then
        'Exit Sub
    'End If

    With Me.lstOperationProducts
        For Each vItem In .ItemsSelected
            If Not IsNull(vItem) Then
                strSet = strSet & "," & .ItemData(vItem)
            End If
        Next
    End With

    strSQL = "DELETE FROM tblOperationProductMM WHERE OpProdID IN (" & strSet & ")"

    CurrentDb.Execute strSQL

    lstProducts.Requery
    lstOperationProducts.Requery


End Sub
编辑:

谢谢你的帮助,我最终让它工作了,我想主要的问题是strSet被声明为long而不是integer。它最终工作正常,没有在with语句中用单引号括住逗号

这是最终产品:

Private Sub cmdRemoveProducts_Click()

    Dim strSQL      As String
    Dim vItem       As Variant
    Dim strSet      As String
    Dim i           As Long


    'If IsNull(lstOperationProducts) Then
        'Exit Sub
    'End If

    strSet = ""

    With Me.lstOperationProducts
        For Each vItem In .ItemsSelected
            If Not IsNull(vItem) Then
                strSet = strSet & "," & .ItemData(vItem)
            End If
        Next
    End With

    ' Remove the first comma
    strSet = Mid(Trim(strSet), 2, Len(strSet) - 1)

    strSQL = "DELETE FROM tblOperationProductMM WHERE OpProdID IN (" & strSet & ")"

    CurrentDb.Execute strSQL



        For i = 0 To lstProducts.ListCount - 1
        lstProducts.Selected(i) = False
    Next

        For i = 0 To lstOperationProducts.ListCount - 1
        lstOperationProducts.Selected(i) = False
    Next

    lstProducts.Requery
    lstOperationProducts.Requery
替换此项:

With Me.lstOperationProducts
    For Each vItem In .ItemsSelected
        If Not IsNull(vItem) Then
            strSet = strSet & "," & .ItemData(vItem)
        End If
    Next
End With
与:

此外,请记住,如果所讨论的项目是文本,则需要用单引号将其括起来。所以这一行:

            strSet = strSet & "," & .ItemData(vItem)
将是:

            strSet = strSet & "','" & .ItemData(vItem)
最后一行需要更改为:

strSet = Mid(Trim(strSet), 3, Len(strSet) - 2) & "'"

EDIT:我刚才看到您也将变量strSet减小一倍。你不能那样做,因为。您必须将其设置为字符串。

如果选择多个项目,则创建的最终sql是什么?正如现在编写的一样,它看起来像是在
strSet
中留下了一个前导逗号,使用调试器逐步检查代码并查看它在做什么。检查每个级别上的变量值,检查它不支持的方法。啊,我明白了。啊,我明白了。查询试图将两个记录ID连接成一个记录ID,然后删除该记录(显然不存在)。我不知道我怎么能告诉它保持记录ID分开和删除两个记录虽然。如果我发现了什么,我会继续研究并发回。如果有人提出建议,我们也将不胜感激:)谢谢!Brad,它创建的SQL是:“从“tblOperationProductsMM”中删除,其中(131132)中的OpProdID是第一条记录,ID 132是第二条记录ID@brharrii-您不能将strSet调暗到如此长的时间。请看下面我的答案。
strSet LONG
解释了为什么他的查询语句包含
WHERE OpProdID IN(131132)
这是因为
CLng(131&“,”&132)
返回131132。
strSet = Mid(Trim(strSet), 3, Len(strSet) - 2) & "'"