使用ByRef更新Recordset字段未生效,该操作是否可行?
问题解答
根本原因
你的原代码无法实现更新,本质是VBA对Recordset字段默认属性的隐式调用导致的:tbl![field1] 是Access VBA中Field对象的简写语法,它的默认属性是.Value。当你直接将这个表达式作为ByRef参数传入子程序时,VBA会先自动求值该表达式,拿到.Value的临时值拷贝再传入。你在UpdateTable中修改的只是这个临时拷贝,修改结果不会回写到原Recordset的Field对象中,自然不会生效。
可行实现方案
有两种常用方案可以实现需求,不需要先把字段值赋值给变量再处理:
方案1:传递完整Field对象
直接将Field对象本身传入子程序,在子程序内显式修改它的.Value属性即可:
Private Sub DeclareTable() Dim tbl As Recordset Set tbl = CurrentDb.OpenRecordset("Table1") tbl.MoveFirst tbl.Edit ' 传入完整Field对象,不要依赖默认Value属性的隐式调用 UpdateTable tbl.Fields("field1"), 5, 2 tbl.Update ' 记得释放资源 tbl.Close Set tbl = Nothing End Sub Private Sub UpdateTable(ByRef tblField As Field, X As Long, Y As Long) ' 显式给Field的Value属性赋值 tblField.Value = X * Y End Sub
方案2:用Function返回计算结果后赋值
如果不需要在子程序内操作Field对象,直接把计算逻辑封装为Function,拿到返回值后再给字段赋值,代码可读性更高:
Private Sub DeclareTable() Dim tbl As Recordset Set tbl = CurrentDb.OpenRecordset("Table1") tbl.MoveFirst tbl.Edit tbl![field1] = CalculateValue(5, 2) tbl.Update tbl.Close Set tbl = Nothing End Sub Private Function CalculateValue(X As Long, Y As Long) As Long CalculateValue = X * Y End Function
内容的提问来源于stack exchange,提问作者MaybeOn8
相关产品推荐
相关产品推荐

