我的任务是在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方法是否可以在我的代码中使用。
答案 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
给出的位置将被完全忽略。