如何删除Access上的多个选定记录?

时间:2019-02-27 04:48:21

标签: ms-access access-vba

我的任务是在Access上创建一个表单,以删除多个所选记录,而无需用户控制和删除查询。

用户使用记录选择器选择(突出显示)记录。我需要将VBA代码添加到删除按钮,该按钮将删除所有选定的记录。当我这样做时,只会删除第一条记录。

如何使突出显示的记录成为活动记录并立即将其全部删除?我认为我需要某种循环。

我浏览了一些建议的链接,这就是我所拥有的:

intHeight = Me.Form.SelHeight
intTop = Me.Form.SelTop

Dim N As Integer
With Me.Form.RecordsetClone
    If .RecordCount < 1 Then
        MsgBox "Nothing saved, Delete canceled.", , "Remove Test Error"
    Else
        Response = MsgBox("Are you sure you want to delete records?", vbYesNo,   "Duplicate?", 0, 0)
        If Response = vbYes Then
            MsgBox (intHeight)
            For N = 1 To intHeight
                .AbsolutePosition = intTop - 1
                .MoveFirst
                sql = "DELETE FROM [Feb Fleet] Where [ID]=&Me.ID.Value"
                CurrentDb.Execute (sql)
                Me.Form.Requery
            Next
        End If
    End If
End With

该代码通过,但未删除任何内容。当我检查intHeight值时,我得到0。我不确定.SelTop方法是否可以在我的代码中使用。

1 个答案:

答案 0 :(得分:0)

Access中的问题是,当焦点移到按钮上时,选择丢失。我通过在主表单的数据表视图中放置一个子表单解决了该问题。主表单没有数据源或绑定到父记录。

子窗体控件具有一个Exit事件。在此事件期间,子表单选择仍然有效。因此,我使用此事件来存储选择

Dim top As Long, height As Long

'Exit event of the sub-form control
Private Sub frmSelect_Products_Exit(Cancel As Integer)
    top = frmSelect_Products.Form.SelTop
    height = frmSelect_Products.Form.SelHeight
End Sub

在delete事件处理程序中,您可以执行以下操作(只是做了一些测试输出而没有实际删除)。另外,您还必须改编一些名称。

Dim N As Long, sql As String

'Restore the selection so the user can see it during the delete dialog.
frmSelect_Products.Form.SelHeight = height

'Test
MsgBox "top = " & top & ",    height = " & height

With frmSelect_Products.Form.RecordsetClone
    For N = top + height - 1 To top Step -1
        .AbsolutePosition = N - 1 'Zero-based
        sql = "DELETE FROM [Feb Fleet] Where [ID]=" & .Fields!ProductID
        MsgBox sql
        'CurrentDb.Execute sql
    Next
End With
Me.Form.Requery

您的代码使用.AbsolutePosition = intTop - 1移动到第一个选定的项目,然后使用.MoveFirst移动到第一条记录,而忽略先前通过AbsolutePosition设置的位置。即,循环变量N给出的位置将被完全忽略。