我的任务是在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方法是否适用于我的代码。
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
在删除事件处理程序中,您可以执行类似这样的操作(只需进行一些测试输出而不实际删除)。此外,你将不得不调整一些名称。
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
给出的位置被完全忽略。