在Excel中可以轻松实现一行数据的自动求和功能,只要设置好求和公式,改变任意一个加数的值,”和”值都可以得到立即更新。我希望在图1所示的Access的数据表中,也实现这样的功能。经过多天的努力,终于实现了这个功能。分享出来供有同样需求的人员参考。
具体的实现过程如下:
- 子窗体关联数据源字段的文本框中,选择作为加数的文本框,为它设置单击事件,在这个事件中让Access获得选中数据的行号。
Private Sub JAN_Click()
selectID = Me.ID ‘selectID是一个在类模块中定义的公有变量
End Sub
- 为上面选中的文本框,再设置一个数据更新后的事件,在这个事件中让文本框内变更的数据刷新到所关联的作为数据源的数据表中,并调用一个执行求和运算的模块内公有过程,该过程内可以调用一个类模块中的一个求和运算的公有函数,最终实现当加数的值变动后,和值可以立即相应变化的功能。
Private Sub JAN_AfterUpdate()
Me.Requery
Call fn
End Sub
Public Function fn()
Dim sngTemp As Single
sngTemp = CaculSum("K_固废处理支出费用统计表", selectID)
DoCmd.SetWarnings False
DoCmd.RunSQL "update K_固废处理支出费用统计表 set Year_Total=" & sngTemp & " where ID=" & selectID
DoCmd.SetWarnings True
Forms![frm_固废处理数据统计].fig6.Requery
Forms![frm_固废处理数据统计].fig8.Requery
End Function
- 在类模块中定义一个公有的变量和求和函数。
Public selectID As Integer
Public Function CaculSum(tableName As String, intID As Integer) As Single
Dim strSQL As String
Dim tempQuery As DAO.Recordset
Dim m As Single
strSQL = "select JAN, FEB, MAR, APR, MAY, JUNE, JULY, AUG, SEPT, OCT, NOV, DEC " & _
" from " & tableName & " where ID=" & intID
Set tempQuery = CurrentDb.OpenRecordset(strSQL)
m = 0
For i = 0 To 11
m = m + tempQuery(i)
Next
tempQuery.Close
Set tempQuery = Nothing
CaculSum = m
End Function