0

目前,根据专家的一些建议,我尝试在一种形式中提供可编辑的交叉表查询,例如用于在平面表的几列中显示值的形式(数据是来自不同时期的财务数据 = 每个财务报表项目的 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
4

1 回答 1

0

在别处找到了解决方案。通常它声明如下: 表单上的字段可以称为 1. Me.YourTextboxName.Value=myR.Fields("Amount").Value

2. Me(Textbox).Value =myR.Fields("Amount").Value

如果您有一系列文本框并且要动态分配值,则第二个很有用,例如如果您有 17 个名为 TxtBox1、TxtBox2 和 TxtBox3 ... TextBox17 的文本框,那么

for i = 1 to 17    Me("TxtBox" & i).value=myR.Fields("Amount").Value
next i 
于 2013-08-16T05:44:40.753 回答