目标是创建一个表格,该表格已查询定义为“活动”的表的所有对象。该查询在表单上显示为列表框。我希望访问此表单的用户能够选择该查询的对象,然后通过从第二个列表框中选择操作,然后单击提交按钮来更新表。
我认为单击的VBA如下所示:
Private Sub ActionAdminbtn_Click()
Set Actiontbl = CurrentDb.OpenRecordset("SELECT * FROM [Actiontbl]")
Actiontbl.Edit
Actiontbl![Progress] = Me.AdminActionSelect
Actiontbl.Update
Actiontbl.Close
Me.Refresh
End Sub
这几乎对我有用,但是我缺少从列表框中选择对象的代码行。现在,单击操作并提交后,我只更改表中的第一条记录。不是想要的。关于如何修改所选对象的任何建议?
答案 0 :(得分:2)
假定您的第一个列表框已绑定到屏幕快照(隐藏在表单中)的唯一键ID(ID),请考虑使用带有WHERE
子句的更新SQL查询。下面演示了使用QueryDef对象调用的参数化查询。
SQL (另存为存储的查询)
PARAMETERS [ProgressParam] TEXT(255), [ActionIDParam] Long;
UPDATE [Actiontbl] SET [Progress] = [ProgressParam]
WHERE ID = [ActionIDParam]
VBA
Private Sub ActionAdminbtn_Click()
Dim qdef As QueryDef
Set qdef = CurrentDb.QueryDefs("myUpdateQuery")
' BIND PARAMS
qdef![ProgressParam] = Me.AdminActionSelect
qdef![ActionIDParam] = Me.FirstListBoxName
' EXECUTE ACTION
qdef.Execute dbFailOnError
Set qdef = Nothing
Me.Requery
End Sub
或者,如果您希望使用Recordset Update
方法,请以条件为 ActionID 的条件打开查询,但仍假定列表框的值绑定到隐藏的ID字段。
Private Sub ActionAdminbtn_Click()
Dim strSQL As String
Dim Actiontbl As Recordset
strSQL = "SELECT * FROM [Actiontbl] WHERE ID=" & Me.FirstListBoxName
Set Actiontbl = CurrentDb.OpenRecordset(strSQL)
Actiontbl.Edit
Actiontbl![Progress] = Me.AdminActionSelect
Actiontbl.Update
Actiontbl.Close
Set Actiontbl = Nothing
Me.Refresh
End Sub
答案 1 :(得分:0)
尚不清楚您的ListBox控件的名称,但假设ListBox
是名称:
Dim iSel As Integer
iSel = ListBox.Value
这将为您提供列表框的选定行。那么您可能可以使用记录集更新方法,也可以使用更简单的RowSource
更新。
对于任何具体建议,我们需要查看所涉及表的示例数据和列名。
注意:使用ID密钥字段,这些类型的更新要容易得多。