目前,根据专家的一些建议,我尝试在一种形式中提供可编辑的交叉表查询,例如用于在平面表的几列中显示值的形式(数据是来自不同时期的财务数据 = 每个财务报表项目的 FFI_Period =FinStmtItem)。我首先通过将表中的所需值检索到表单上的未绑定字段(通过recordset.findfirst 方法,然后将表字段中的值分配到未绑定的文本字段)来对表进行非规范化,然后将字段保存回来(通过recordset.edit/.添加方法)以标准化形式添加到表中。
一段代码在我的过程中不断重复多次。这是一个通过非规范化从平面表中检索数据的示例(* PrevPerItem *X - 是表单上未绑定文本字段的名称):
Set myR = CurrentDb.OpenRecordset("tbl_FFIFinancials")
myR.FindFirst ("[FFI_PERIOD] =" & intFFIPeriod1 & "And [FinStmtItem] = 1")
PrevPerItem1 = myR.Fields("Amount").Value
myR.FindFirst ("[FFI_PERIOD] =" & intFFIPeriod1 & "And [FinStmtItem] = 2")
PrevPerItem2 = myR.Fields("Amount").Value
myR.FindFirst ("[FFI_PERIOD] =" & intFFIPeriod1 & "And [FinStmtItem] = 3")
PrevPerItem3 = myR.Fields("Amount").Value
'.... [similar codes repeats here as well from No 4 throu 16]............
myR.FindFirst ("[FFI_PERIOD] =" & intFFIPeriod1 & "And [FinStmtItem] = 17")
PrevPerItem17 = myR.Fields("Amount").Value
myR.Close
Set myR = Nothing
类似的代码用于编辑和添加方法(放回规范化数据)
Set myR = CurrentDb.OpenRecordset("tbl_FFIFinancials")
'updating values for the previous period
MsgBox "Updating values into Database for the period - " & intPrevYear & "-Q" & byteSelectQuarter
myR.FindFirst ("[FFI_PERIOD] =" & intFFIPeriod1 & "And [FinStmtItem] = 1")
myR.Edit
myR.Fields("Amount").Value = PrevPerItem1
myR.Update
myR.FindFirst ("[FFI_PERIOD] =" & intFFIPeriod1 & "And [FinStmtItem] = 2")
myR.Edit
myR.Fields("Amount").Value = PrevPerItem2
myR.Update
myR.FindFirst ("[FFI_PERIOD] =" & intFFIPeriod1 & "And [FinStmtItem] = 3")
myR.Edit
myR.Fields("Amount").Value = PrevPerItem3
myR.Update
'....[repeating code for values No 4 though 16]
myR.FindFirst ("[FFI_PERIOD] =" & intFFIPeriod1 & "And [FinStmtItem] = 17")
myR.Edit
myR.Fields("Amount").Value = PrevPerItem17
myR.Update
myR.Close
Set myR = Nothing
我相信有一些方法可以通过使用诸如 do while 循环或 for next 方法之类的快捷方法来优化代码。由于我只是 vba 编程的新手,我觉得很难掌握实际是如何做到的,并且必须重复几次代码行。
更新:我试过我试过这个来优化代码,但它会在我的新自定义函数上重新调整不匹配错误:
Dim myR As DAO.Recordset
Set myR = CurrentDb.OpenRecordset("tbl_FFIFinancials", dbOpenDynaset)
For byteItemNumber = 1 To 17 Step 1
myR.FindFirst "[FFI_PERIOD] =" & intFFIPeriod1 & "And [FinStmtItem] =" & byteItemNumber
Me.MyFieldName(Name).Value = myR.Fields("Amount").Value
Next byteItemNumber
....我的新自定义函数来引用当前表单上的文本字段名称 ....
Function MyFieldName(Name As Field)
Dim strName As String
srtName = "PrevPerItem" & byteItemNumber
Name.Name = strName
End Function